계정에서 사용자 관리하기

IBM Cloud® Identity and Access Management (IAM)을 사용하여 계정의 사용자를 관리하세요. 사용자를 초대하거나, 초대를 취소하거나, 계정에서 사용자를 제거하거나, 사용자의 IBMid 을 업데이트할 수 있습니다.

모든 사용자는 새 계정 내에서 활성 사용자가 되기 위해 초대를 승인해야 합니다. 자세한 내용은 대기 중인 초대 취소 또는 다시 보내기를 참조하세요

시작하기 전에

계정에 사용자 초대

사용자를 초대하고 미처리 초대를 관리하려면 다음 유형의 액세스 권한 중 하나 이상이 있어야 합니다. 사용자만 다른 사용자를 초대할 수 있습니다. 인증할 서비스 ID를 사용하는 경우 새 사용자를 계정에 초대할 수 없습니다.

  • 계정 소유자
  • 사용자 관리 계정 관리 서비스에 대한 편집자 이상의 역할이 있는 IAM 액세스 정책
  • 사용자를 추가할 수 있는 사용자 관리 클래식 인프라 권한

액세스 레벨에 따라 새 사용자를 추가하고 모든 유형 또는 일부 유형의 액세스 권한을 지정할 수 있습니다.

Terraform을 사용하여 사용자를 초대하려면 먼저 다음 사항을 완료해야 합니다:

  • Terraform CLI를 설치하고 IBM Cloud 제공자 플러그인을 구성합니다. 자세한 내용은 테라폼 시작하기 IBM Cloud® 튜토리얼을 참조하세요. 플러그인은 이 태스크를 완료하는 데 사용되는 IBM Cloud API를 요약합니다.
  • 이름이 main.tf인 Terraform 구성 파일을 작성하십시오. 이 파일에서는 HashiCorp 구성 언어를 사용하여 리소스를 정의합니다. 자세한 내용은 테라폼 문서를 참조하세요.

계정에서 사용자 제거

계정 소유자와 올바른 액세스 권한이 있는 사용자만 다른 사용자를 삭제할 수 있습니다. 인증할 서비스 ID를 사용하는 경우 계정에서 사용자를 제거할 수 없습니다. 계정에서 사용자를 삭제하려면 다음 액세스 권한이 필요합니다:

  • 관리자 역할이 할당된 사용자 관리 계정 관리 서비스에 대한 ID 및 액세스 관리(IAM) 정책입니다.
  • 계정에 클래식 인프라가 있는 경우 사용자는 관리자 역할이 할당된 사용자 관리 계정 관리 서비스에 대한 IAM 정책이 있어야 하며, 사용자 클래식 인프라 관리 권한이 할당된 클래식 인프라 사용자 계층 구조에서 사용자의 조상이어야 합니다.

사용자의 IBM ID 변경

IBM ID를 변경하려면 대체 ID가 이미 존재해야 합니다. 새 IBM ID가 존재하는지 확실하지 않으면 사용자는 내 IBM으로 이동하여 IBM ID 작성을 클릭할 수 있습니다. 연합 ID 제공자(IdP) 도메인에 해당하는 이메일 주소를 입력하면 IBM ID가 해당 IdP의 사용자를 로그인 페이지로 경로 재지정합니다. 연합 IdP를 사용하여 IBM®에 처음 로그인하면 새 IBM ID의 작성이 트리거됩니다. 그렇지 않으면 단계에 따라 ID를 작성하십시오. 사용되는 이메일 주소는 사용자의 새 대체 IBM ID가 됩니다.

콘솔에서 사용자 초대

사용자를 초대하려면 다음 단계를 완료하십시오.

  1. IBM Cloud 콘솔에서 관리 > **액세스(IAM)**를 클릭하고 사용자를 선택하십시오.
  2. 사용자 초대를 클릭하십시오.
  3. 사용자의 이메일 주소를 지정하십시오. 한 번의 초대에서 두 명 이상의 사용자를 초대하는 경우에는 모든 사용자에게 동일한 액세스가 지정됩니다. 초대된 사용자의 도메인을 기반으로 계정의 멤버십을 제한할 수 있습니다. 이 방법으로 특정 도메인의 사용자만 계정에 초대할 수 있습니다. 자세한 정보는 계정 초대에 대한 사용자 도메인 제한의 내용을 참조하십시오.

기업에서 관리하는 계정에서는 사용자를 자동으로 초대할 수 없으며 수동으로 추가해야 합니다.

  1. 관리 중인 하나 이상의 액세스 옵션을 추가하십시오. 최소한 하나의 액세스 옵션을 지정해야 합니다. 추가 및 구성하지 않은 액세스 옵션의 경우 기본값인 액세스 없음이 지정됩니다. 관리할 권한이 부여된 옵션에 따라 다음과 같은 유형의 액세스를 지정할 수 있습니다.
    • 사용자를 액세스 그룹에 추가합니다. 사용자가 속할 각 액세스 그룹에 대해 추가를 클릭하십시오.
    • 수동으로 사용자에게 액세스 권한을 지정합니다. 섹션을 확장하여 개별 IAM 액세스 정책 또는 클래식 인프라 권한을 할당합니다.
      • 클래식 인프라를 선택한 후 세 개의 권한 세트 중에서 선택하십시오.
      • 모든 ID 및 액세스 사용 서비스, 모든 계정 관리 서비스, 모든 IAM 계정 관리 서비스와 같은 서비스 그룹 또는 특정 서비스를 선택합니다. 다음으로 액세스 권한의 범위를 전체 계정 또는 하나의 리소스 그룹만으로 지정할 수 있습니다. 그런 다음 적용되는 모든 역할을 선택하십시오. 각 역할에 맵핑된 조치를 보려면 각 역할 옆에 나열된 숫자를 클릭하십시오. 일부 서비스에서는 특정 이름 지정 규칙을 충족하는 리소스에 대한 액세스 권한을 부여할 수 있는 고급 연산자의 사용을 지원합니다. 자세한 정보는 와일드카드 정책을 사용한 액세스 권한 지정을 참조하십시오.
      • 계정 관리를 선택한 후 모든 계정 관리 서비스 옵션 중에서 선택하거나 특정 서비스를 선택하십시오. 그런 다음 적용되는 모든 역할을 선택하십시오.
  2. 추가를 선택하여 초대에 대한 액세스 지정을 저장하십시오.
  3. 필요한 모든 액세스 지정을 추가한 후 초대를 클릭하십시오.

사용자 페이지의 상태 열에서 처리 또는 보류 중 상태에 표시된 사용자에 대한 초대를 취소할 수 있습니다. 초대된 사용자가 초대장을 받지 못한 경우에는 보류 중 상태인 사용자에게 초대를 재전송할 수 있습니다. 사용자가 초대를 수락한 후에만 추가 정책 및 권한을 추가할 수 있습니다.

VPN 전용 사용자 추가

다음 권한이 있는 모든 사용자가 VPN 전용 사용자를 추가할 수 있습니다.

  • 클래식 인프라의 경우 계정에 사용자 관리 권한이 있어야 합니다.
  • IAM 액세스의 경우 사용자 관리 계정 관리 서비스에 관리자 또는 편집자 역할이 있어야 합니다.

VPN 전용 사용자를 추가하려면 다음 단계를 사용하십시오.

  1. 사용자 페이지에서 VPN 전용 사용자 추가를 클릭하십시오.
  2. 사용자의 개인 정보 세부사항을 입력하십시오.
  3. 저장 을 클릭하십시오.

CLI를 사용하여 사용자 초대

CLI를 사용하여 사용자를 초대하려면 다음 명령을 실행하십시오.

ibmcloud account user-invite USER_EMAIL [--access-groups ACCESS_GROUP_1,ACCESS_GROUP_2...]

CLI를 사용하면 액세스 권한을 할당하지 않도록 선택하고 나중에 액세스 권한을 할당하는 작업을 할 수 있습니다. 명령 매개변수에 대한 자세한 정보는 ibmcloud account user-invite를 참조하십시오.

API를 사용하여 사용자 초대

API를 사용하여 사용자를 대량으로 초대할 수 있습니다. 한 번의 초대에 포함되는 모든 사용자에게 동일한 액세스 권한이 지정됩니다. API를 사용하여 사용자를 초대하는 경우 각 항목을 따옴표로 묶어 쉼표로 구분된 목록으로 이메일을 입력합니다. 이 예에서는 사용자를 액세스 그룹에 추가하여 액세스를 지정합니다.

curl -X POST https://user-management.cloud.ibm.com/v2/accounts/987d4cfd77b04e9b9e1a6asdcc861234/users -H 'Authorization: Bearer <IAM_TOKEN>'
  -H 'Content-Type: application/json' -d '{
      "users": [
      {
        "email": "cloud_api_example_member@ibm.com",
        "account_role": "Member"
      }],
      "iam_policy": [{
        "type": "access",
        "roles": [{
          "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
        }],
        "resources": [{
          "attributes": [{
              "name": "accountId",
              "value": "987d4cfd77b04e9b9e1a6asdcc861234"
            },
            {
              "name": "resourceType",
              "value": "resource-group"
            },
            {
              "name": "resource",
              "value": "2c7449dd871049c29ec3a53853ce123e"
            }
          ]
        }]
      }],
      "access_groups":[
        "AccessGroupId-******-0f54-4d4f-89c2-e5fdc0b9a28c",
        "AccessGroupId-******-3087-4395-a382-a8e8ff9ccc23"
      ]
    }'
InviteUser inviteUserModel = new InviteUser.Builder()
        .email(memberEmail)
        .accountRole("Member")
        .build();
Role roleModel = new Role.Builder()
        .roleId(viewerRoleId)
        .build();
Attribute attributeModel = new Attribute.Builder()
        .name("accountId")
        .value(accountId)
        .build();
Attribute attributeModel2 = new Attribute.Builder()
        .name("resourceGroupId")
        .value("*")
        .build();
Resource resourceModel = new Resource.Builder()
        .addAttributes(attributeModel)
        .addAttributes(attributeModel2)
        .build();
InviteUserIamPolicy inviteUserIamPolicyModel = new InviteUserIamPolicy.Builder()
        .type("access")
        .addRoles(roleModel)
        .addResources(resourceModel)
        .build();
InviteUsersOptions inviteUsersOptions = new InviteUsersOptions.Builder()
        .accountId(accountId)
        .addUsers(inviteUserModel)
        .addIamPolicy(inviteUserIamPolicyModel)
        .addAccessGroups(accessGroupId)
        .build();
Response<InvitedUserList> response = adminService.inviteUsers(inviteUsersOptions).execute();
InvitedUserList invitedUserList = response.getResult();
System.out.println(invitedUserList);
const inviteUserModel = {
  email: memberEmail,
  account_role: 'Member',
};
const roleModel = {
  role_id: viewerRoleId,
};
const attributeModel = {
  name: 'accountId',
  value: accountId,
};
const attributeModel2 = {
  name: 'resourceGroupId',
  value: '*',
};
const resourceModel = {
  attributes: [attributeModel, attributeModel2],
};
const inviteUserIamPolicyModel = {
  type: 'access',
  roles: [roleModel],
  resources: [resourceModel],
};
const params = {
  accountId: accountId,
  users: [inviteUserModel],
  iamPolicy: [inviteUserIamPolicyModel],
  accessGroups: [accessGroupId],
};
userManagementAdminService.inviteUsers(params)
  .then(res => {
    deleteUserId = res.result.resources[0].id;
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
invite_user_model = {
  'email': member_email,
  'account_role': 'Member'
}
role_model = {'role_id': viewer_role_id}
attribute_model = {'name': 'accountId', 'value': account_id}
attribute_model2 = {'name': 'resourceGroupId', 'value': '*'}
resource_model = {'attributes': [attribute_model, attribute_model2]}
invite_user_iam_policy_model = {
  'type': 'access',
  'roles': [role_model],
  'resources': [resource_model]
}
invite_user_response = user_management_admin_service.invite_users(
  account_id=account_id,
  users=[invite_user_model],
  iam_policy=[invite_user_iam_policy_model],
  access_groups=[access_group_id]
).get_result()
print(json.dumps(invite_user_response, indent=2))
inviteUserModel := &usermanagementv1.InviteUser{
  Email:       &memberEmail,
  AccountRole: core.StringPtr("Member"),
}
roleModel := &usermanagementv1.Role{
  RoleID: &viewerRoleID,
}
attributeModel := &usermanagementv1.Attribute{
  Name:  core.StringPtr("accountId"),
  Value: &accountID,
}
attributeModel2 := &usermanagementv1.Attribute{
  Name:  core.StringPtr("resourceGroupId"),
  Value: core.StringPtr("*"),
}
resourceModel := &usermanagementv1.Resource{
  Attributes: []usermanagementv1.Attribute{*attributeModel, *attributeModel2},
}
inviteUserIamPolicyModel := &usermanagementv1.InviteUserIamPolicy{
  Type:      core.StringPtr("access"),
  Roles:     []usermanagementv1.Role{*roleModel},
  Resources: []usermanagementv1.Resource{*resourceModel},
}
inviteUsersOptions := &usermanagementv1.InviteUsersOptions{
  AccountID:    &accountID,
  Users:        []usermanagementv1.InviteUser{*inviteUserModel},
  IamPolicy:    []usermanagementv1.InviteUserIamPolicy{*inviteUserIamPolicyModel},
  AccessGroups: []string{accessGroupID},
}
invitedUserList, response, err := userManagementAdminService.InviteUsers(inviteUsersOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(invitedUserList, "", "  ")
fmt.Println(string(b))

서비스 그룹에 액세스 권한을 할당할 수 있습니다. 모든 ID 및 액세스 사용 서비스에 대한 액세스 권한을 할당하려면 name 속성에 serviceType 을 지정하고 value service 을 사용합니다. 모든 계정 관리 서비스에 대한 액세스 권한을 할당하려면 name 속성에 serviceType 을 지정하고 value platform_service 을 사용합니다. 계정 관리 서비스의 하위 집합인 모든 IAM 계정 관리 서비스에 대한 액세스 권한을 할당하려면 name 속성에 service_group_id 을 지정하고 value IAM 을 사용합니다.

Terraform을 사용하여 사용자 초대

Terraform을 사용하여 사용자를 IBM Cloud 계정에 초대할 수 있습니다.

  1. main.tf 파일에 인수를 생성합니다. 다음 예는 ibm_iam_user_invite 리소스를 사용하여 사용자를 초대하는 것으로, 여기서 users 은 초대할 사용자 이메일 ID 목록입니다.
    resource "ibm_iam_user_invite" "invite_user" {
     users = ["test@in.ibm.com"]
    }
    
    자세한 내용은 Terraform Identity and Access Management(IAM) 페이지의 인수 참조 세부 정보를 참조하세요.
  2. main.tf 파일에서 리소스를 프로비저닝합니다. 자세한 내용은 Terraform으로 인프라 프로비저닝을 참조하세요.
    1. terraform plan 을 실행하여 테라폼 실행 계획을 생성하여 제안된 작업을 미리 볼 수 있습니다.
      terraform plan
      
    2. terraform apply 을 실행하여 플랜에 정의된 리소스를 만듭니다.
      terraform apply
      

보류 중인 초대 취소 또는 재발송

IBM Cloud에서 계정에 참여하도록 새 사용자를 초대한 후 VPN 전용 사용자를 제외한 모든 사용자가 계정에서 활성 사용자가 되도록 초대를 수락해야 합니다.

초대는 30일 후에 만료됩니다. IBM Cloud의 새 사용자는 이메일을 통해 받은 초대 링크만 사용하여 초대를 수락할 수 있습니다.

사용자 페이지의 상태 열에서 처리 또는 보류 중 상태에 표시된 사용자에 대한 초대를 취소할 수 있습니다. 초대된 사용자가 초대장을 받지 못한 경우에는 보류 중 상태인 사용자에게 초대를 재전송할 수 있습니다.

  1. 사용자 페이지로 이동하십시오.
  2. Processing 또는 Pending 상태에서 사용자의 행을 찾으십시오.
  3. 조치 아이콘 추가 조치 아이콘를 클릭한 후 초대 재발송 또는 초대 취소를 선택하십시오.

콘솔에서 초대 수락

초대된 사용자가 이미 IBM Cloud의 구성원인 경우 알림 및 이메일로 초대 링크를 수신합니다. 알림 페이지에서 사용자는 검색 필드를 사용하여 초대를 찾거나 account 이라는 알림 유형으로 필터링할 수 있습니다. 자세한 내용은 초대 알림 관리하기알림 보기를 참조하세요.

CLI를 사용하여 초대 수락

초대된 사용자가 이미 IBM Cloud의 구성원인 경우, CLI를 사용하여 초대를 수락할 수 있습니다. 다음 ibmcloud login 명령에서 ACCOUNT_ID는 사용자가 참여하도록 초대받은 대상 지정 계정의 ID입니다.

ibmcloud login -c ACCOUNT_ID --accept

API를 사용하여 초대 수락

초대된 사용자가 이미 IBM Cloud의 구성원인 경우 API를 사용하여 초대를 수락할 수 있습니다. 다음 예에서 ACCOUNT_ID는 사용자가 참여하도록 초대받은 대상 계정의 ID이며 IAM_TOKEN은 초대된 사람에 속합니다.

curl -X POST \
  'https://iam.cloud.ibm.com/v2/users/accept' \
  --header 'Authorization: Bearer <IAM_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "account_id": "<ACCOUNT ID>"
  }

콘솔을 사용하여 계정에서 사용자 제거하기

계정에서 사용자를 제거하면, 사용자는 더 이상 콘솔에 로그인하거나 계정으로 전환하거나 계정 리소스에 액세스할 수 없습니다. 계정에서 사용자를 제거해도 해당 사용자의 IBM ID가 삭제되지는 않습니다.

계정에서 사용자를 제거하려면 다음 단계를 완료하십시오.

  1. IBM Cloud® 콘솔에서 관리 > **액세스(IAM)**를 클릭하고 사용자를 선택하십시오.
  2. 제거하려는 사용자의 행에서 조치 아이콘 조치 아이콘 > 사용자 제거를 클릭하십시오.

사용자에 의해 작성된 모든 리소스가 계정에 남아 있지만 사용자가 작성한 모든 IBM Cloud API 키가 제거됩니다. 사용자는 더 이상 작성한 리소스로 작업할 수 있는 액세스 권한이 없습니다. 계정 소유자 또는 서비스 또는 서비스 인스턴스의 관리자는 기타 사용자가 리소스로 작업하도록 지정하거나 계정에서 해당 리소스를 삭제할 수 있습니다.

클래식 인프라 사용자를 제거할 수 없음을 나타내는 오류 메시지가 표시되면 해당 사용자의 사용자 계층 구조에 있는 하위 항목에 새 상위가 지정되었는지, 계정에서 사용 안함으로 설정되었는지 아니면 삭제되었는지 확인하십시오. 그런 다음 다시 시도할 수 있습니다.

계정에서 사용자를 삭제하는 대신 임시 시간 기반 조건이 포함된 액세스 정책을 할당할 수 있습니다. 이렇게 하면 사용자는 콘솔에 로그인하여 계정 목록에서 계정을 볼 수 있지만 정책이 시작되기 전이나 정책이 만료된 후에는 계정의 리소스에 액세스할 수 없습니다. 자세한 내용은 임시 시간 기반 조건 만들기를 참조하세요.

CLI를 사용하여 계정에서 사용자 제거

계정에서 사용자를 제거하려면 다음 명령을 실행하십시오.

ibmcloud account user-remove USER_ID [-c ACCOUNT_ID] [-f, --force]

명령 옵션은 계정 및 사용자 관리하기 CLI 명령어를 참조하세요.

API를 사용하여 계정에서 사용자 제거

계정에서 사용자를 제거하려면 다음 샘플 요청에 표시된 대로 사용자 관리 API를 호출하십시오.

변수를 사용자의 IAM ID로 바꾸십시오. 권한 부여를 위해 사용자 토큰을 사용해야 합니다. 서비스 ID를 사용하여 계정에서 사용자를 제거할 수 없습니다.

curl -X DELETE https://user-management.cloud.ibm.com/v2/accounts/987d4cfd77b04e9b9e1a6asdcc861234/users/IBMid-1000000000 -H 'Authorization: Bearer <IAM_TOKEN>' -H 'Content-Type: application/json'
RemoveUserOptions removeUserOptions = new RemoveUserOptions.Builder()
  .accountId(accountId)
  .iamId(deleteUserId)
  .build();
service.removeUser(removeUserOptions).execute();
const params = {
  accountId: accountId,
  iamId: deleteUserId,
};
userManagementAdminService.removeUser(params)
  .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
response = user_management_admin_service.remove_user(
  account_id=account_id,
  iam_id=delete_user_id,
).get_result()
print(json.dumps(response, indent=2))
removeUserOptions := userManagementService.NewRemoveUserOptions(
  accountID,
  deleteUserID,
)
response, err := userManagementAdminService.RemoveUser(removeUserOptions)
if err != nil {
  panic(err)
}

사용자 ID 또는 이메일 주소와 영역으로 사용자를 삭제할 수도 있습니다. 사용자 ID 또는 이메일과 영역이 필요합니다. 자세한 내용은 사용자 아이디 또는 이메일로 계정에서 사용자 제거하기를 참조하세요.

curl -X DELETE https://user-management.cloud.ibm.com/v2/accounts/987d4cfd77b04e9b9e1a6asdcc861234/users?user_id=user%40ibm.com&email=user.email%40ibm.com&realm=ibmid -H 'Authorization: Bearer <IAM_TOKEN>' -H 'Content-Type: application/json'

콘솔을 사용하여 사용자의 IBMid 변경하기

계정 소유자는 사용자의 IBM ID를 업데이트할 수 있습니다. 현재의 IBM ID를 대체하는 데 사용하는 새 IBM ID가 이미 존재해야 합니다. 대체 중인 IBM ID가 계정에서 제거됩니다. 계속해서 계정의 구성원이 되도록 기존의 IBM ID가 필요한 경우에는 사용자를 다시 초대하고 액세스를 다시 설정해야 합니다.

계정 소유자는 고유한 IBM ID를 변경할 수 없습니다.

사용자가 새 IBMid 이 존재하는지 확인한 후 다음 단계를 완료하여 사용자의 IBMid 을 변경합니다:

  1. IBM Cloud® 콘솔에서 관리 > 액세스(IAM) > 사용자로 이동하여 IBMid를 업데이트할 사용자를 선택하십시오.
  2. 세부 정보 섹션에서 업데이트 IBMid 를 클릭합니다.
  3. 새 IBM ID를 입력하고 업데이트를 클릭하십시오.

이제 사용자는 새 IBM ID를 사용하여 ibm.com에 로그인할 수 있으며 이전에 사용한 IBM ID에 지정된 액세스 권한을 사용하여 IBM Cloud 계정에서 계속 작업할 수 있습니다.