주:
- 이 자습서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료했으면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체하십시오.
OCI 함수 및 OCI 대기열을 사용하여 승인자에게 관리자 권한을 노출하지 않고 사용자 기능에 권한을 부여합니다.
소개
사용자 기능 업데이트는 특히 사용자에게 권한이 부여된 권한이 콘솔 기능 또는 API 키와 같이 민감한 경우 많은 기업에서 중요한 요구 사항입니다. 그러나 Oracle Cloud Infrastructure(OCI) 설명서에서 확인한 한, Oracle Cloud Infrastructure Identity and Access Management(OCI IAM) 정책이 명시적으로 허용되어 있는 경우에도 관리자 그룹의 사용자만 사용자 기능에 권한을 부여할 수 있습니다. 자세한 내용은 사용자 관리를 참조하십시오.
이 사용지침서에서는 사용자가 OCI IAM 도메인의 관리자 그룹에 속하지 않지만 OCI 커넥터 허브의 새로 릴리스된 기능을 활용하여 OCI 대기열 및 OCI 함수를 통합하여 사용자 기능을 승인할 수 있는 기능이 필요한 시나리오에 대한 솔루션을 시연합니다.
그림 SolutionArchitecture.png에 대한 설명
목표
-
OCI 대기열과 OCI 함수 간 OCI 커넥터 허브의 통합 기능을 활용하여 사용자 기능에 권한을 부여합니다.
-
OCI에서 세분화된 IAM 구현으로 사용자 요청을 승인하고 실행할 수 있는 권한을 분리하는 솔루션을 개발하는 클라우드 네이티브 접근 방식을 알아보십시오.
-
OCI Functions에서 python API를 사용하여 사용자를 관리하는 방법을 알아보세요.
-
OCI에서 리소스 원칙 권한 부여 사용을 위한 동적 그룹 사용에 대해 알아봅니다.
작업 1: OCI 대기열에서 OCI 함수로 메시징 채널 생성
솔루션의 핵심은 승인자가 요청을 승인해야 하는 권한에서 사용자 기능을 변경하여 필요한 권한을 분리하는 것입니다.
-
수신 요청에 대한 OCI 대기열을 생성합니다. 자세한 내용은 대기열 생성을 참조하십시오.
-
유저 권한 부여에 사용되는 OCI 함수를 생성합니다. 자세한 내용은 함수 생성을 참조하십시오.
-
OCI Connector Hub를 통해 OCI Queue 및 OCI Functions 통합을 구성합니다. 소스가 생성된 OCI 대기열로 지정되었는지 확인하고 대상은 OCI 함수여야 합니다. 이 자습서에서는 선택적 작업을 비워 둡니다. 자세한 내용은 OCI Connector Hub에서 OCI Queue의 가용성을 소스로 발표를 참고하세요.
작업 2: OCI IAM 정책 및 동적 그룹 구성
요청을 받기 위해 승인자의 롤을 OCI 대기열로 분할하고 요청을 실행하기 위해 OCI 함수를 실행한 후에는 권한이 악용되지 않도록 엄격한 OCI IAM 정책을 구성해야 합니다. 구현에 루트 구획을 사용하도록 주장하는 고객을 지원하기 위해 이 솔루션을 구축했기 때문에 OCI IAM 부품의 루트 구획에서 모든 구성을 데모로 표시합니다.
-
승인자만 대기열 메시지를 대상 OCI 대기열로 푸시하도록 허용합니다.
Allow group 'testApprover' to use queues in tenancy
이 정책을 추가하면 testApprover 그룹의 사용자가 대기열을 사용하여 콘솔 액세스 요청을 수신할 수 있습니다. 아래 예와 같이 대기열 푸시 리소스 유형에 대한 권한만 지정하여 그룹에 더 많은 제한을 둘 수 있습니다.
use queue-push in compartment <compartment> where target.queue.id = '<queue_ocid>'
-
다음 일치 규칙을 지정하여 OCI 함수를 포함하도록 동적 그룹을 구성합니다.
ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
그러면 이 동적 그룹은 도메인의 사용자를 관리하기 위해 Oracle Identity Cloud Service 롤을 통해 권한이 부여됩니다.
-
동적 그룹 Oracle Identity Cloud Service 롤을 구성합니다.
-
OCI 대기열에서만 호출할 수 있도록 OCI 함수를 구성합니다. 다음 예에서는 호출 소스를 대기열로만 제한합니다. 실제로는 리소스에 태그를 사용하여 호출 소스를 더 엄격하게 만들 수 있습니다. 자세한 내용은 태그를 사용하여 접근 관리를 참조하십시오.
Allow service faas to use functions-family in tenancy where request.principal.type='queues'
작업 3: OCI 함수 코드 작성
OCI 대기열에서 가져온 요청을 실제로 실행하려면 OCI 함수에 대한 Python 코드를 작성해야 합니다.
-
OCI 대기열 메시지가 data 객체의 함수로 전달됩니다.
def handler(ctx, data: bytes = None) -> response.Response: try: # Parse the message from the OCI Queue if data: message = json.loads(data.getvalue().decode('utf-8')) else: message = "no useremail received"
-
리소스 주체를 사용하여 인증합니다.
주: 다음 코드 행은 IDE에서 작동하지 않을 수 있습니다.
identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
-
사용자 OCID(Oracle Cloud 식별자)로 전달된 사용자 전자메일을 변환합니다.
def get_user_ocid_by_email(identity_client,email,tenancy_id): # List all users in the tenancy users = oci.pagination.list_call_get_all_results(identity_client.list_users,tenancy_id).data # Find the user with the matching email address for user in users: if user.email.lower() == email.lower(): return user.id return None
-
IdentityClient 함수를 사용하여 리소스 주체로 사용자 기능을 업데이트합니다.
# Get the user by email address user_ocid = get_user_ocid_by_email(identity,user_email,tenancy) # Update user capabilities (example: enable API keys) update_details = oci.identity.models.UpdateUserCapabilitiesDetails( can_use_api_keys=True, can_use_auth_tokens=True, can_use_console_password=True, can_use_customer_secret_keys=True, can_use_db_credentials=True, can_use_o_auth2_client_credentials=True, can_use_smtp_credentials=True ) # Update the user identity.update_user_capabilities(user_ocid, update_details)
-
방금 생성한 OCI 함수에 함수 코드를 배치합니다. OCI 함수 배치에 대한 자세한 단계는 OCI 함수에 대한 구성 노트를 참조하십시오.
작업 4: 변경 사항 테스트
대상 큐로 메시지를 보내 변경 사항을 테스트합니다. OCI 콘솔을 사용하거나 OCI Cloud Shell을 포함한 모든 SDK를 사용할 수 있습니다.
문제 해결
OCIR을 사용하도록 OCI 함수 구성
OCIR을 OCI 함수의 리포지토리로 사용하는 경우 몇 가지 문제로 인해 사용자를 차단할 수 있으며 해결 방법을 찾기란 쉽지 않습니다. 현재는 이러한 문제를 피하기 위한 명확한 지침이 제공되지 않습니다.
-
OCIR 리포지토리 및 OCI 함수에 대한 특정 컴파트먼트를 함수 컨텍스트로 구성합니다. 기본적으로 OCIR 저장소의 컨텍스트는 콘솔의 명령 페이지를 따라 클라우드 셸 명령 아래로 실행되는 경우에도 루트 구획을 가리킵니다.
fn update context oracle.compartment-id ocid1.tenancy.oc1.....
주: 이 부분은
oracle.compartment-id
와 마찬가지로 매우 오해의 소지가 있습니다. 이 속성은 이 속성이 함수와 OCIR 모두에 해당한다고 생각하지만 OCIR에 대해image-compartment-id
인 별도의 속성이 있습니다. 따라서 이름이 지정된 컴파트먼트를 사용하여 함수를 실행하고 이미지를 저장하는 경우 두 컴파트먼트 ID가 다음 OCI Cloud Shell 명령으로 명시적으로 설정되었는지 확인하십시오. OCIR과 함수 간의 작업이 서로 다른 명명된 구획에서 온 경우에도 허용하도록 적절한 OCI IAM 정책을 구성해야 합니다.fn update context oracle.image-compartment-id <compartment-ocid> fn update context oracle.compartment-id <compartment-ocid>
이 작업이 올바르게 수행되지 않은 경우 유선 403 오류가 발생하며
image-compartment-id
를 알지 못하기 때문에 단서를 찾기 어렵습니다. -
OCI Cloud Shell이 docker.io에 액세스할 수 있는 네트워크 환경에서 실행되는 동안 OCIR을 사용하도록 함수를 구성합니다. 이미지 처리를 위해 도커 API를 적용해야 하며, 일반적으로 OCI 서비스 네트워크는 사용자가 액세스할 수 없게 됩니다. OCI Cloud Shell을 사용 중인 경우 컨테이너 배치에 퍼블릭 네트워크를 사용하는 것이 좋습니다.
자세한 내용은 Functions: Get Started using Cloud Shell를 참조하십시오.
-
여기서 또 다른 잠재적 차단자는 대기열 메시지를 함수 입력으로 전달하려고 할 때입니다. 변수에서 전달하는 방법에 대한 다른 기사에서 여러 참조를 찾을 수 있지만 실제로는 JSON을 입력하고 Python 코드의 data 객체에서 수신하는 것이 간단합니다.
참고: Javascript 유형의 json을 작은 따옴표나 따옴표 없이 사용하지 마십시오. 이제는 엄격한 구문만 OCI 대기열에서 인식할 수 있습니다.
{"name":"John"}
관련 링크
확인
- 작성자 - Henry Deng(Principal Solution Engineer)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Use OCI Functions and OCI Queue to Authorize User Capabilities without Exposing Admin Privilege to Approvers
G16878-03
October 2024