IAMによるAWS権限管理運用ベストプラクティス (1)
よく訓練されたアップル信者、都元です。AWSにはIAMという権限管理のサービスがあります。AWSを専門としている我々にとっては当たり前の知識なのですが、皆さんはこの機能を上手く使えているでしょうか。
AWSにおけるクレデンシャルとプリンシパル
まず、AWSにおけるクレデンシャルは大きく2種類 *1に分かれます。
- Sign-In Credential:Management Consoleログインのためのクレデンシャル(要するにパスワード)
- Access Credentials:APIアクセスのためのクレデンシャル(要するにAPIキー)
また、プリンシパル(ログインする主体、ユーザ名等)にも大きく2種類 *2があります。
- AWSアカウント
- IAMユーザ
これらの組み合わせとして「AWSアカウントのパスワード」「AWSアカウントのAPIキー」「IAMユーザのパスワード」「IAMユーザのAPIキー」という4つのクレデンシャルがあることになります。
AWSを使い始める際、サインアップの時にメールアドレスとパスワードを登録したと思います。これが「AWSアカウントのパスワード」です。また、Your Security CredentialsページのAccess Keysの項で確認できるのが「AWSアカウントのAPIキー」です。
また、IAMのManagement Consoleにおいてユーザを作成した場合、そこで設定したパスワード *3が「IAMユーザのパスワード」、そこで生成したアクセスキーが「IAMユーザのAPIキー」となります。
細かいことですが、1つのIAMユーザにつきパスワードは1つしかありませんが、APIキーは複数持つことができます。APIキーを持たない場合もあります。
さて、これらのクレデンシャルは「開発運用スタッフ」や、AWS上で稼働する「システム」が利用します。発展形としては、AWS上で稼働するサービスの「エンドユーザ」自身や「エンドユーザが持つモバイルアプリ等」が利用することもあります。が、まずは「開発運用スタッフ」にフォーカスしてみましょう。
開発運用スタッフが利用するクレデンシャル
プラクティス1 : 「AWSアカウントのパスワード」は普段使いしない
さて、AWSアカウントというのは、権限制御ができません。言い換えれば、常にそのアカウント内のリソースに対する全権を持ちます。つまり、AWSアカウントとしてAWSにログインするのは危険と考えるべきです。
これに対して、IAMユーザは設定により権限を制御可能です。たとえ管理作業を行う場合でも、別にIAMユーザを作成し、そのIAMユーザに管理権限を与えて、普段はIAMユーザを利用すべきです。
ちなみに「AWSアカウント」に出来て「管理権限を与えられたIAMユーザ」に出来ないことは主に以下の通り *4です。
- 請求に関する操作(コンソリの手続きや、支払い情報の変更等)
- 登録情報(名前や住所等)に関する操作
- アカウントの解約
上記の通り、技術的な業務を行う範囲では何ら支障がないはずですので、是非IAMユーザを使うようにしましょう。AWSアカウントのパスワードによるログインは、プロジェクトの管理者(多くても2〜3名程度)が、上記のような非技術的な管理業務を行う際のみに利用する、という体制が望ましいと思っています。
プラクティス2 : 「AWSアカウントのAPIキー」は使わない
前述の通り、AWSアカウントというのは全権を持っています。そしてそのAPIキーも、もちろん全権を持ちます。しかし、このキーがどうしても必要な場面というのは、恐らくありません。
このキーは、かつてIAMというプロダクトが無かった頃の遺物です。つまり、互換性のためだけに用意されている機能ですので、そもそもこのキーを発行しないのがベストです。
というわけで、プラクティス1と同様、このキーも利用しないようにしましょう。
プラクティス3 : 同じプリンシパルを複数人で共有しない
プラクティス1でIAMユーザを作成することをお勧めしましたが、これにはもうひとつメリットがあります。複数人でAWSを利用する際に、プリンシパルを共有する必要がなくなります。
AWSアカウントというプリンシパルは1つしかありませんので、IAMを使わない場合は複数人でAWSアカウント及びパスワードを共有することになります。しかし、このような運用にはいくつかの重大な問題があります。
- 誰が権限を持っているのか把握が難しい
- 何かトラブルが発生した際、誰が操作したのかログ等から判断できない
- メンバーが離脱した際に、パスワードの変更を迫られる(が、めんどくさいので大抵放置される)
このような問題を回避するためにも、メンバーに対して個別のIAMユーザを作成しましょう。プラクティス1に従ってIAMユーザを作ったとしても、そのIAMユーザのパスワードを複数人で共有しないようにしましょう。同一のIAMユーザというプリンシパルを共有することになってしまいます。
ひとまずまとめ
意外と長くなりそうなので、一旦ここまでで。まとめますと以下の通りです。
- 「AWSアカウントのパスワード」は、基本的に使わない。主に登録情報等の管理と請求関連操作にだけ使う。
- 「AWSアカウントのAPIキー」は、使うべきではない。そもそも作成すべきでもない。
- 「IAMユーザのパスワード」は、個人に対して割り当てるべき。
- 「IAMユーザのAPIキー」も、個人に対して割り当てるべき。個人がawscliを等を使う時用。
以上の体制で「開発運用スタッフ」が行うAWSに対するアクションは、ほとんどがカバーできると思います。次回は、AWS上で稼働する「システム」が行うAWSに対するアクションについて、プラクティスを見て行きたいと思います。システム(=プログラム)はSign-In Credentialを使いませんので、次回はAccess Credentialsに絞った話になる見込みです。