##アクセスキーとは
AWSのアクセスキーとは__認証情報__のことで、__IAMユーザ__または__AWSアカウント__の__長期的認証情報__を指す。AWSのアクセスキー認証により、外部からAWSのサービスへプログラムアクセスが可能。
AWSのアクセスキーは、__アクセスキーIDとシークレットアクセスキー__から構成されている。また、ユーザ名とパスワードによる認証と同様の処理をプログラムアクセス時にアクセスキーIDとシークレットアクセスキーを用いて行う。
この為、ユーザ名とパスワード更新の影響を受けずにプログラムアクセスが可能。
プログラムアクセスがユーザ名とパスワードなしに実行できるために、重大なセキュリティリスクが生じる__為、アクセスキー__管理の徹底が必須!!!
####AWSのアクセスキー管理が不十分な場合のセキュリティリスク
・アクセスキーの漏洩
アクセスキーはアクセスキーIDとシークレットアクセスキーから構成される文字列のため、外部サイトに流出したり公開リポジトリ―に誤ってプッシュ登録したりすることで生じます。
・AWSサービス内の情報漏洩
アクセスキーを利用して、サービス内に蓄積された業務データが持ち出しされるリスクがあります。
・サービスの不正利用
1度外部にアクセスキー情報が漏洩してしまうと、AWSサービスを不正利用されたり、それによって高額なAWSサービス利用費の請求が発生したりすることが懸念されます。
・セキュリティ攻撃に悪用
AWSのサービスを経由した成りすましや、仲介者攻撃として第3者へのセキュリティ攻撃に悪用されるリスクがあります。
####セキュリティ対策
・極力使用しない
AWSのアクセスキーは、外部からのプログラムアクセスを用います。外部からのプログラムアクセスをしない場合はアクセスキーを使用せず、可能であれば不要なアクセスキーを削除します。
・共有しない
不特定の方への情報共有を避け、必要最低限のメンバーのみ共有とするか、全く共有しない運用をします。
・権限を絞る
アクセスキーを開示する場合は、専用の権限を絞ったアクセスキーを作成し提示します。
・MFAを設定する
多要素認証(MFA)により、第3者の利用をブロックします。
・IAM ユーザーのアクセスキー定期更新
IAM ユーザーは定期的にアクセスキーを更新し、意図しない流出影響を抑えます。
・IAM ロールの使用
アクセスキーを用いず、処理するためにIAMロールをインスタンスに設定します。
参考:AWS ドキュメント リファレンスガイド AWS アクセスキーを管理するためのベストプラクティス
参考:AWS Identity and Access Management ユーザーガイド IAM でのセキュリティのベストプラクティス
####IAM ロールの使用 (アクセスキーを用いないプログラムアクセス)
AWSのアクセスキーは情報漏洩のリスクがありますので、慎重な管理が求められます。そのため、AWSの__アクセスキーを極力使用せず__に運用することが望まれます。AWSでは、IAMを用いて__ロール__を作成することができるので、AWS アクセスキーを用いずにプログラムアクセスを実行することが可能です。これにより、慎重な管理を要するアクセスキーの__セキュリティリスクを低減することが可能__です。
####IAM ロールの設定方法
AWSのコンピューティングサービスであるAmazon Elastic Compute Cloud(EC2)を用いたロールの設定について説明します。Amazon __EC2のロール__は、__立ち上げ時に指定__します。
##アクセスキーに付与するポリシーについて
アクセスキーを取得するIAMユーザーに付与するポリシーは最低限に留めることがセキュリティ上、重要。
###Terraform用AWSアクセスキーのポリシーをスイッチロールだけに限定し、セキュリティをあげる方法
個人開発の場合、Full権限を与えたアクセスキーを用いてしまいがちだが、アクセスキーが流出してAWSを不正利用される怖さがある。
その対応策としてTerraformのコマンド実行をスイッチロールを用いた形に差し替え、不正利用できにくいようにする方法をメモしておく。
####目指す体制
- アクセスキー自体にはスイッチロール(Assume Role)するためだけの最低限の権限のみ。(アクセスキー単体ではAssume Role以外は何もできない)
- Terraformのインフラ実装自体はスイッチロール後のIAMロールが持つ権限で行う
- スイッチロール自体の実行条件を絞り込む
###手順
- スイッチ用ロールの作成
- スイッチ用ロールの「信頼関係」の設定
- IAMユーザーの権限設定
- Terraform側の設定
具体的な方法は上記参考サイトに画像付きで説明してある。
ただし、Terraform側の設定に関しては、今回は下記__Terraform側の設定コード__で記した。
####IAMロールの参考サイト
「AssumeRoleはRoleArnを入力するとCredentialsを返すAPIだ」
・・・(中略)
RoleArnというのは、IAM Roleの一意な名前で、arn:aws:iam::123456789012:role/role-nameといった文字列 *4です。返されるCredentialsは一時キー *5で、有効期限は1時間でした。
・・・(中略)
ロールに設定された権限を持った一時キーを入手することを「役割(role)の引き受け(assume)」と言います。
####Terraform側の設定コード
IAM User に sts:AssumeRole の権限を与えることで IAM Role の権限を引き受けることができます。・・・(中略)・・・
Terraform でも AssumeRole した権限で実行できるので、その方法を紹介します。・・・(中略)・・・
providers.tf 等のファイル名で provider を定義します。
# Definition of Variables
variable "aws_access_key_id" {}
variable "aws_secret_access_key" {}
# Definition of AWS provider
provider "aws" {
region = "ap-northeast-1"
access_key = var.aws_access_key_id
secret_key = var.aws_secret_access_key
assume_role {
role_arn = "arn:aws:iam::<自分のAWSアカウントID>:role/<スイッチロール先のIAMロール名>"
}
ポイント:__assume_role__ブロックを追加する
# assume_roleブロック
assume_role {
role_arn = "arn:aws:iam::<自分のAWSアカウントID>:role/<スイッチロール先のIAMロール名>"
AWSアカウントIDは外部に漏れると危険なので、git等を使う場合は変数を用いて.tfvars
ファイルで管理し、__gitの管理外におく__こと。
role_arn = "xxxxxxxxxxxxxxxxxxx"
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "ap-northeast-1"
# assume_roleブロック
assume_role {
role_arn = "${var.role_arn}" #<自分のAWSアカウントID>:role/<スイッチロール先のIAMロール名>
}
}
###AWSアクセスキーの取得方法
アクセスキーとシークレットアクセスキーはAWSにグループを作成しユーザを作成したタイミングに発行される。
シークレットアクセスキーはユーザを新規作成したタイミングでのみ確認可能(新規作成後にシークレットアクセスキーが分からなくなってしまった場合は再度キーを作成する必要がある)。
####手順
- グループの作成
- ユーザの作成
- 各キーの確認
詳細は上記サイトを参照。下記サイトは公式。