AWS アクセスキーについてとTerraformでのアクセスキーに関して

##アクセスキーとは

https://and-engineer.com/articles/YKdczhQAACkAtksa

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のロール__は、__立ち上げ時に指定__します。


https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html

##アクセスキーに付与するポリシーについて

アクセスキーを取得するIAMユーザーに付与するポリシーは最低限に留めることがセキュリティ上、重要。


###Terraform用AWSアクセスキーのポリシーをスイッチロールだけに限定し、セキュリティをあげる方法

https://blog.mmmcorp.co.jp/blog/2021/01/27/terraform_with_assume_role/

個人開発の場合、Full権限を与えたアクセスキーを用いてしまいがちだが、アクセスキーが流出してAWSを不正利用される怖さがある。
その対応策としてTerraformのコマンド実行をスイッチロールを用いた形に差し替え、不正利用できにくいようにする方法をメモしておく。　

####目指す体制

+ アクセスキー自体にはスイッチロール（Assume Role）するためだけの最低限の権限のみ。(アクセスキー単体ではAssume Role以外は何もできない）
+ Terraformのインフラ実装自体はスイッチロール後のIAMロールが持つ権限で行う
+ スイッチロール自体の実行条件を絞り込む

###手順

1. スイッチ用ロールの作成
2. スイッチ用ロールの「信頼関係」の設定
3. IAMユーザーの権限設定
4. Terraform側の設定

具体的な方法は上記参考サイトに画像付きで説明してある。
ただし、Terraform側の設定に関しては、今回は下記__Terraform側の設定コード__で記した。

####IAMロールの参考サイト

https://dev.classmethod.jp/articles/iam-role-and-assumerole/

>「AssumeRoleはRoleArnを入力するとCredentialsを返すAPIだ」
・・・（中略）

>RoleArnというのは、IAM Roleの一意な名前で、arn:aws:iam::123456789012:role/role-nameといった文字列 *4です。返されるCredentialsは一時キー *5で、有効期限は1時間でした。
・・・（中略）

>ロールに設定された権限を持った一時キーを入手することを「役割(role)の引き受け(assume)」と言います。

####Terraform側の設定コード

https://blog.serverworks.co.jp/2020/09/28/terraform-by-assumerole

>IAM User に sts:AssumeRole の権限を与えることで IAM Role の権限を引き受けることができます。・・・（中略）・・・
 Terraform でも AssumeRole した権限で実行できるので、その方法を紹介します。・・・（中略）・・・
providers.tf 等のファイル名で provider を定義します。

```providers.tf
# 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__ブロックを追加する

```providers.tf
# assume_roleブロック
assume_role {
    role_arn = "arn:aws:iam::<自分のAWSアカウントID>:role/<スイッチロール先のIAMロール名>"
```

AWSアカウントIDは外部に漏れると危険なので、git等を使う場合は変数を用いて`.tfvars`ファイルで管理し、__gitの管理外におく__こと。

```terraform.tfvars
role_arn = "xxxxxxxxxxxxxxxxxxx"
```

```main.tf
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ロール名>
    }
}
```

https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/

###AWSアクセスキーの取得方法

https://qiita.com/miriwo/items/a513c91eac7186db59fe

アクセスキーとシークレットアクセスキーはAWSにグループを作成しユーザを作成したタイミングに発行される。
シークレットアクセスキーはユーザを新規作成したタイミングでのみ確認可能（新規作成後にシークレットアクセスキーが分からなくなってしまった場合は再度キーを作成する必要がある）。

####手順
1. グループの作成
2. ユーザの作成
3. 各キーの確認

詳細は上記サイトを参照。下記サイトは公式。

https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-appendix-sign-up.html