· 6 years ago · Oct 06, 2019, 07:10 AM
1#
2# AWS CLIおよびAWS Tools for PowerShellで使用しているアクセスキーをローテーションする。
3# 新しいアクセスキーを発行し、片方もしくは両方のクレデンシャルファイルを更新します。
4# クレデンシャルファイルは同一フォルダーにバックアップされるため、意図しない動作をした場合は手動で復元してください。
5#
6# Usage:
7# > aws-iam-user-key-rotation.ps1 [profile]
8#
9
10$profileName = $args[0]
11
12if ($profileName -eq $null) {
13 $profileName = "default"
14}
15
16$awsCliInstalled = $false
17$awsPowerShellInstalled = $false
18
19# AWS CLIのインストールチェック
20try {
21 aws --version > $null
22 $awsCliInstalled = $true
23 echo "AWS CLIが見つかりました。"
24
25 $Env:AWS_DEFAULT_PROFILE = $profileName
26 $Env:AWS_DEFAULT_OUTPUT = "json"
27} catch {
28 # do nothing
29}
30
31# AWS Tools for PowerShellのインストールチェック
32if (Get-Module -ListAvailable -Name AWSPowerShell) {
33 echo "AWS Tools for PowerShellが見つかりました。"
34 $awsPowerShellInstalled = $true
35
36 Set-AWSCredential -ProfileName $profileName
37}
38
39# CoreおよびAWS Tools IdentityManagementのインストールチェック
40if (!$awsPowerShellInstalled) {
41 # どちらもPowerShell 6以上が必要
42 if ($PSVersionTable.PSVersion.Major -ge 6) {
43 if (Get-Module -ListAvailable -Name AWSPowerShell.NetCore) {
44 echo "AWS Tools for PowerShell Coreが見つかりました。"
45 $awsPowerShellInstalled = $true
46
47 Import-Module AWSPowerShell.NetCore
48 Set-AWSCredential -ProfileName $profileName
49 } elseif (Get-Module -ListAvailable -Name AWS.Tools.IdentityManagement) {
50 echo "AWS Tools IdentityManagementが見つかりました。"
51 $awsPowerShellInstalled = $true
52
53 Import-Module ("Common","IdentityManagement" | %{ "AWS.Tools.$_" })
54 Set-AWSCredential -ProfileName $profileName
55 }
56 } else {
57 $Host.UI.WriteErrorLine("PowerShellのバージョンが6より小さいため、CoreおよびAWS.Tools.*はチェックしません。")
58 }
59}
60
61if (!($awsCliInstalled -or $awsPowerShellInstalled)) {
62 $Host.UI.WriteErrorLine("AWS CLIおよびAWS Tools for PowerShellが見つかりませんでした。")
63 exit 1
64}
65
66echo "${profileName} プロファイルのアクセスキーをローテーションします。"
67
68#
69# main
70#
71
72$ErrorActionPreference = "Stop"
73
74if ($awsPowerShellInstalled) {
75 $user = Get-IAMUser
76} else {
77 $user = aws iam get-user | ConvertFrom-Json
78 $user = $user.User
79}
80
81echo "対象のIAMユーザーは $($user.UserName) です。"
82
83if ($awsPowerShellInstalled) {
84 $currentAccessKey = Get-IAMAccessKey
85} else {
86 $currentAccessKey = aws iam list-access-keys | ConvertFrom-Json
87 $currentAccessKey = $currentAccessKey.AccessKeyMetadata
88}
89
90# AWSのアクセスキーは一度に2個までしか作成できないため先にチェックしておく
91if ($currentAccessKey.Count -eq 2) {
92 $Host.UI.WriteErrorLine("アクセスキーが2個存在しています。使用していないアクセスキーを削除してから再実行してください。")
93 exit 1
94}
95
96if ($awsPowerShellInstalled) {
97 cp $Env:HOMEPATH\AppData\Local\AWSToolkit\RegisteredAccounts.json $Env:HOMEPATH\AppData\Local\AWSToolkit\RegisteredAccounts.json.bak
98}
99
100if ($awsCliInstalled) {
101 cp $Env:HOMEPATH\.aws\credentials $Env:HOMEPATH\.aws\credentials.bak
102}
103
104if ($awsPowerShellInstalled) {
105 $newAccessKey = New-IAMAccessKey -UserName $user.UserName
106} else {
107 $newAccessKey = aws iam create-access-key --user-name $user.UserName | ConvertFrom-Json
108 $newAccessKey = $newAccessKey.AccessKey
109}
110
111echo "新規アクセスキーを作成しました。"
112
113if ($awsPowerShellInstalled) {
114 Set-AWSCredential -AccessKey $newAccessKey.AccessKeyId -SecretKey $newAccessKey.SecretAccessKey -StoreAs $profileName
115}
116
117if ($awsCliInstalled) {
118 aws configure set aws_access_key_id $newAccessKey.AccessKeyId
119 aws configure set aws_secret_access_key $newAccessKey.SecretAccessKey
120}
121
122echo "クレデンシャルファイルを更新しました。"
123
124echo "新しいアクセスキーで試行します。"
125if ($awsPowerShellInstalled) {
126 $updateAccessKeys = Get-IAMAccessKey
127} else {
128 echo "10秒待機します..."
129 Start-Sleep -s 10
130
131 $updateAccessKeys = aws iam list-access-keys | ConvertFrom-Json
132 $updateAccessKeys = $updateAccessKeys.AccessKeyMetadata
133}
134
135if ($updateAccessKeys.Count -ne 2 ) {
136 $Host.UI.WriteErrorLine("アクセスキーが2個存在していません。何かおかしいようです。")
137 exit 1
138}
139
140if ($awsPowerShellInstalled) {
141 Remove-IAMAccessKey -UserName $currentAccessKey.UserName -AccessKeyId $currentAccessKey.AccessKeyId -Force
142} else {
143 aws iam delete-access-key --user-name $currentAccessKey.UserName --access-key-id $currentAccessKey.AccessKeyId
144}
145echo "古いアクセスキーを削除しました。"