Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

Azure - New-AzureRmADServicePrincipal / New-AzureRmRoleAssignment 명령어

지난 글에서,

Azure - PowerShell로 Access control(IAM)에 새로운 계정 만드는 방법
; https://www.sysnet.pe.kr/2/0/11479

계정 생성 및 권한 부여를 다음과 같은 명령어로 요약할 수 있습니다.

PS C:> Login-AzureRmAccount

PS C:> $plainText = "TestPlainText"
PS C:> $secureString = ConvertTo-SecureString $plainText -AsPlainText -Force

PS C:> $sp = New-AzureRmADServicePrincipal -DisplayName "NewUser1" -Password $secureString

PS C:> New-AzureRmRoleAssignment -ServicePrincipalName $sp.ApplicationId -RoleDefinitionName Contributor

일단 New-AzureRmADServicePrincipal은,

New-AzureRmADServicePrincipal
; https://docs.microsoft.com/en-us/powershell/module/azurerm.resources/new-azurermadserviceprincipal?view=azurermps-5.7.0

"Creates a new azure active directory service principal."라는 설명에도 나오지만 Azure Active Directory에 사용자를 생성합니다. 그다음 New-AzureRmRoleAssignment는 Azure 리소스의 Access control에 권한을 부여하는 것입니다. 보시면, New-AzureRmRoleAssignment 명령어에 별도의 리소스 위치를 지정하지 않았으므로 해당 사용자는 구독 수준의 Access control에 Contributor role이 부여됩니다.

그런데 New-AzureRmADServicePrincipal 명령어의 결과를 확인할 수 있는 방법이 현재의 Azure Portal에서는 제공되지 않습니다. 즉, AAD에 생성된 계정은 Azure Portal의 AAD 메뉴에서는 볼 수 없고, 대신 New-AzureRmRoleAssignment로 Azure 리소스의 Access control에 "App" 타입으로 생성된 것을 확인할 수 있습니다.

그래도 분명히 해당 계정이 AAD에 생성되어 있는 것은 맞습니다. 왜냐하면 New-AzureRmRoleAssignment 명령을 실행하지 않은 상태에서 다음과 같이 다시 동일한 사용자 이름으로 New-AzureRmADServicePrincipal 명령을 내리면,

PS C:\WINDOWS\system32> $sp = New-AzureRmADServicePrincipal -DisplayName "NewUser1" -Password $secureString
New-AzureRmADServicePrincipal : Another object with the same value for property identifierUris already exists.
At line:1 char:7
+ $sp = New-AzureRmADServicePrincipal -DisplayName "NewUser1" -Password ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-AzureRmADServicePrincipal], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ActiveDirectory.NewAzureADServicePrincipalCommand

이미 등록된 유저라고 오류가 발생하기 때문입니다. 그렇다면, 문제는 해당 사용자를 어떻게 삭제하느냐입니다. "Azure Active Directory" 메뉴로 가도 목록에는 해당 사용자가 나타나지 않기 때문에 당연히 Azure Portal을 통해서는 삭제할 수 없습니다. 대신 PowerShell 명령어로 가능합니다.

이를 위해 Get-AzureRmADServicePrincipal 명령을 내려 ObjectId를 확인한 후,

PS C:\WINDOWS\system32> Get-AzureRmADServicePrincipal -SearchString "NewUser1"

ServicePrincipalNames : {http://NewUser1, 5c7c5d23-0449-4d8d-8cd8-81e75985c802}
ApplicationId         : 5c7c5d23-0449-4d8d-8cd8-81e75985c802
DisplayName           : NewUser1
Id                    : 927a257b-b08e-42c3-9d3d-e564e2b95795
Type                  : ServicePrincipal

Remove-AzureRmADServicePrincipal 명령으로 삭제할 수 있습니다.

PS C:\WINDOWS\system32> Remove-AzureRmADServicePrincipal -ObjectId 927a257b-b08e-42c3-9d3d-e564e2b95795

이후 다음의 명령어로 실제로 삭제되었는지 확인해 볼 수 있습니다.

Get-AzureRmADServicePrincipal -SearchString "NewUser1"

재미있는 것은, 분명히 AAD에서 삭제는 되었지만 이 상태에서 동일한 계정명으로 New-AzureRmADServicePrincipal 명령어를 실행하면 여전히 "Another object with the same value for property identifierUris already exists" 오류가 발생합니다.

이유는 간단합니다. New-AzureRmADServicePrincipal은 AAD에 사용자 계정과 함께 동일한 이름으로 Application을 생성해 두기 때문이라고 합니다.

Creation of user fails after deletion of user with same signInName
; https://stackoverflow.com/questions/39981988/creation-of-user-fails-after-deletion-of-user-with-same-signinname

그래서, Get-AzureRmADApplication 명령을 내리면 동일한 이름의 응용 프로그램 항목을 볼 수 있고 마찬가지로 출력된 ObjectId로 삭제해야 합니다.

PS C:\> Get-AzureRmADApplication

...[생략]...

DisplayName             : NewUser1
ObjectId                : 7cb013b8-945a-4bff-a445-79ab599c47e8
IdentifierUris          : {http://NewUser1}
HomePage                : http://NewUser1
Type                    : Application
ApplicationId           : 5c7c5d23-0449-4d8d-8cd8-81e75985c802
AvailableToOtherTenants : False
AppPermissions          : 
ReplyUrls               : {}

PS C:\> Remove-AzureRmADApplication -ObjectId 7cb013b8-945a-4bff-a445-79ab599c47e8

정리해 보면, New-AzureRmADServicePrincipal은 명령어 수행 시 다음과 같은 2가지 역할을 수행합니다.

  • AAD에 사용자 계정 등록
  • Application 등록




New-AzureRmADServicePrincipal/New-AzureRmRoleAssignment 명령어로 생성되는 3가지 항목 중에,

  1. AAD에 사용자 계정 등록
  2. Application 등록
  3. Azure 구독의 리소스에 AAD 사용자에 대한 Role

첫 번째 "AAD에 사용자 계정 등록" 확인은 Get-AzureRmADServicePrincipal 명령어로만 할 수 있습니다.

두 번째 "Application 등록"은 Azure Portal에서 "App registrations(앱 등록)"라는 메뉴를 통해 들어가야 하는데, 문제는 기본적으로 이 메뉴가 목록에 없다는 것입니다. 따라서 다음의 글에 설명한 데로,

Azure Portal에서 구독(Subscriptions) 메뉴가 보이지 않는 경우
; https://www.sysnet.pe.kr/2/0/11496

"모든 서비스"로 들어가 "보안 + ID" 범주의 "App registrations(앱 등록)" 메뉴를 선택해 둡니다. 그럼, 해당 메뉴를 통해 New-AzureRmADServicePrincipal 명령어로 생성한 Application 목록을 확인할 수 있습니다.

마지막으로 세 번째 "Azure 구독의 리소스에 AAD 사용자에 대한 Role" 역시 Azure Portal에서 해당 Azure 리소스에 들어가 "Access control" 메뉴를 통해 볼 수 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/17/2018]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  [48]  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12430정성태11/27/20209896오류 유형: 686. Ubuntu - E: The repository 'cdrom://...' does not have a Release file.
12429정성태11/25/20209971디버깅 기술: 175. windbg - 특정 Win32 API에서 BP가 안 걸리는 경우
12428정성태11/25/20208902VS.NET IDE: 154. Visual Studio - .NET Core App 실행 시 dotnet.exe 실행 화면만 나오는 문제
12427정성태11/24/202010031.NET Framework: 975. .NET Core를 직접 호스팅해 (runtimeconfig.json 없이) EXE만 배포해 실행파일 다운로드1
12426정성태11/24/20208648오류 유형: 685. WinDbg Preview - error InitTypeRead
12425정성태11/24/20209668VC++: 141. Visual C++ - "Treat Warnings As Errors" 옵션이 꺼져 있는데도 일부 경고가 에러 처리되는 경우
12424정성태11/24/202010076VC++: 140. C++의 연산자 동의어(operator synonyms), 대체 토큰 [1]
12423정성태11/22/202011040.NET Framework: 974. C# 9.0 - (16) 제약 조건이 없는 형식 매개변수 주석(Unconstrained type parameter annotations)파일 다운로드1
12422정성태11/21/20208831.NET Framework: 973. .NET 5, .NET Framework에서만 허용하는 UnmanagedCallersOnly 사용예파일 다운로드1
12421정성태11/19/20208562.NET Framework: 972. DNNE가 출력한 NE DLL을 직접 생성하는 방법파일 다운로드1
12420정성태11/19/20207757오류 유형: 684. Visual C++ - MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
12419정성태11/19/20208967VC++: 139. Visual C++ - .NET Core의 nethost.lib와 정적 링크파일 다운로드1
12418정성태11/19/202011053오류 유형: 683. Visual C++ - error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug'파일 다운로드1
12417정성태11/19/20208457오류 유형: 682. Visual C++ - warning LNK4099: PDB '...pdb' was not found with '...lib(pch.obj)' or at '...pdb'; linking object as if no debug info
12416정성태11/19/20209735오류 유형: 681. Visual C++ - error LNK2001: unresolved external symbol _CrtDbgReport
12415정성태11/18/20209765.NET Framework: 971. UnmanagedCallersOnly 특성과 DNNE 사용파일 다운로드1
12414정성태11/18/202010816VC++: 138. x64 빌드에서 extern "C"가 아닌 경우 ___cdecl name mangling 적용 [4]파일 다운로드1
12413정성태11/17/202010501.NET Framework: 970. .NET 5 / .NET Core - UnmanagedCallersOnly 특성을 사용한 함수 내보내기파일 다운로드1
12412정성태11/16/202012789.NET Framework: 969. .NET Framework 및 .NET 5 - UnmanagedCallersOnly 특성 사용파일 다운로드1
12411정성태11/12/20209754오류 유형: 680. C# 9.0 - Error CS8889 The target runtime doesn't support extensible or runtime-environment default calling conventions.
12410정성태11/12/20209723디버깅 기술: 174. windbg - System.TypeLoadException 예외 분석 사례
12409정성태11/12/202011123.NET Framework: 968. C# 9.0의 Function pointer를 이용한 함수 주소 구하는 방법파일 다운로드1
12408정성태11/9/202022388도서: 시작하세요! C# 9.0 프로그래밍 [8]
12407정성태11/9/202011372.NET Framework: 967. "clr!JIT_DbgIsJustMyCode" 호출이 뭘까요?
12406정성태11/8/202012954.NET Framework: 966. C# 9.0 - (15) 최상위 문(Top-level statements) [5]파일 다운로드1
12405정성태11/8/202010460.NET Framework: 965. C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods)파일 다운로드1
... 46  47  [48]  49  50  51  52  53  54  55  56  57  58  59  60  ...