今週もAWSです。前回の記事で、ある程度AWSのサービスプロダクトについては理解できたかな、と思っていましたが、未だに意味不明なものがあります。そう、IAMです。
EC2を起動する機会もだいぶ増えたわけですが、毎回毎回「IAM Role」という項目は意味不明だ〜〜〜とぼやきつつ、無視し続けていました。とはいえ、AWSのソリューションアーキテクトでもIAMは重要必須項目と聞いていましたので、触らないわけにはいかないです。
IAMとは、AWS Identity and Access Managementの略称で、AWS上で権限の設定や別アカウントの作成などを実現できるサービスです。複数人でAWSアカウントを利用しており、管理者がデベロッパーに余計な操作をさせないように制限するものという印象が強いです。
つまり、私のようなぼっちAWSユーザには、とりあえず不必要なサービスか・・・勉強する気にならないな・・・と思っていたわけです。しかし、意外とぼっちでもできることは多いですし、そのノウハウはチーム開発などでもきっと活用できるものだと思います。何より、想像以上にいろいろできるので、単なる権限設定に留まらない面白さがあります。
また、IAM roleの概念を理解するために、AWSのサービスをマネージメントコンソール以外から操作できるAWS CLIを使用することを推奨します。それでは、さっそくやっていきましょー
AWS IAMでrootユーザ以外を作成し、MFAで認証する
まず、マネージメントコンソールから、Identity & Access Managementをクリックすると、Security Statusで以下のような画面が表示されていると思います。
英語だらけで意味不明に感じるかもしれませんが、まぁよい状態でないことは確かです。セキュリティの向上のためには、MFAやIAMユーザによるログインを行う必要があります。
IAMユーザとは、IAMによって作成されるユーザです。最初に登録したアカウントがスーパーユーザであり、IAMユーザはその配下で管理される、権限が限定されたユーザです。例えば、IAMユーザでは請求情報などを見ることは原則できません。与えるパーミッションによっては、別リージョンでサービスを起動できなくなったり、新しいEC2インスタンスを起動できなくしたりと、柔軟な設定が可能になります。
IAMユーザを設定することで、管理者は枕を高くして寝ることができるわけですが、ぼっちでもrootユーザ以外を作成し、IAMユーザで基本的にログインすることで、無駄なrootアクセスを行わず、セキュリティを高めることができます。
MFAとはMulti-Factor Authenticationの略称で、二段階承認です。デフォルトでは、ユーザ名とパスワードのみでログインできますが、それではやはり不安です。今回はAuthyによるワンタイムパスワードを組み合わせることで、よりセキュアな設定をすることができます。
さて、では実践内容を・・・と言いたいところですが、実際何も調べておらず、ほとんど以下の記事の通りに設定しただけでさらっとできてしまったので、ここでは書きません。こちらの方が綺麗にまとまっているのでぜひこっちを読んで下さい(丸投げ
上記の記事どおりに進めれば、IAMにおけるユーザとかグループの概念がなんとなく理解できるようになると思います。順序良く進めれば、以下のようにステータスがオールOKになります。これで完了です。
クライアントPCからAWS CLIでEC2インスタンスを操作する
さて、上記の設定を終えたならIAMの基本設定はなんとなくつかめたと思いますが、未だにIAM roleについて理解できていない状況に気づきます。
IAM roleの理解には、AWSをAPIから利用する、という状況を経験することをおすすめしたいので、まずはAWSのサービスをコマンドライン上で活用できる、AWS CLIを使ってみます。Mac OSのクライアントPCにAWS CLIをインストールして、操作してみます。
まずコンソールを起動し、pipをインストールします。次に、pipを利用してAWS CLIをインストールしましょう。
$ sudo easy_install pip
$ sudo pip install awscli
以上でインストール完了です。バージョン情報を見てみましょう。
$ aws --version
aws-cli/1.6.5 Python/2.7.5 Darwin/13.4.0
よさそうですね。
AWS CLIを利用するためには、AWSアカウントと紐付ける必要がありますので、Access Keyなどを設定する必要があります。aws configureコマンドで設定ができます。
$ aws configure AWS Access Key ID [None]: ******** AWS Secret Access Key [None]: ******** Default region name [None]: ap-northeast-1 Default output format [None]:
Access KeyやSecret Access Keyってどこで確認できるんですか?って感じですが、IAMユーザを作成したときに、credentials.csvをダウンロードしたことを覚えていますよね。あれに書いてあります。region nameは利用しているリージョンを。Tokyoリージョンならap-northeast-1ですね。output formatに関しては、ちょっとよくわかんなかったんでそのままにしてあります。これでAWS CLIを利用する準備はOKです。
早速EC2インスタンスをAWS CLIから操作してみましょう。現状のインスタンスは以下のような状況になっています。
ここでインスタンスID:i-3a0754c8を以下のコマンドで起動してみます。
$ aws ec2 start-instances --instance-ids i-3a0754c8 { "StartingInstances": [ { "InstanceId": "i-3a0754c8", "CurrentState": { "Code": 0, "Name": "pending" }, "PreviousState": { "Code": 80, "Name": "stopped" } } ] }
JSON形式で実行結果が返ってきました。なんだか実行できたみたいですね。こうやって返り値がしっかり返ってくることを見ると、プログラムに組み込むのも非常にやりやすそうです。
マネージメントコンソールから見てみると・・・?
おおっ!起動してる!
ちょっと感動ですね。ちなみに、以下のコマンドで停止もできます。
$ aws ec2 stop-instances --instance-ids i-3a0754c8 { "StoppingInstances": [ { "InstanceId": "i-3a0754c8", "CurrentState": { "Code": 64, "Name": "stopping" }, "PreviousState": { "Code": 16, "Name": "running" } } ] }
これでシェルスクリプトを書くようにEC2インスタンスを操作できることがわかりましたね。各種操作の自動化が簡単にできる未来がイメージできるかと思います。後は夢が広がるばかり・・・なわけですが、ここでちょっと考えていただきたいのは、Access KeyやSecret Access Keyの設定です。
もしもEC2インスタンス上で、cronなり回してEC2インスタンスを操作するとしたとき、Access Keyなどの情報をインスタンス上に丸裸でおいておくのはセキュリティ的に非常に不安です。これはAWS CLIに限らず、SDKなどを使ってphpとかからAWSリソースにアクセスする際にも発生する問題です。
そこで本題に入れます。そう、IAM roleです。IAM roleはEC2インスタンスに付与することで、Access Keyなどを設定せずとも、権限の範囲でAWS上のリソースにアクセスができるようになります。セキュリティ的にも安心ですし、AutoScalingなどで新規に生成されたインスタンスなどにも簡単に設定できるので、いろいろ優しいです。
正確にはIAM roleはEC2などに権限委託するだけのものではない、らしいのですが、とりあえず今回はこんな認識でいかせてもらいます。最初はたぶんこの認識でもそんなに困らないと思います。正確なところはクラスメソッドさんの記事で詳細に説明されているので、参考記事のところから是非読んでください。私も後でじっくり読みます。
IAM roleを作成する
それでは、まずEC2インスタンスに付与する、EC2インスタンスを操作できる権限のIAM roleを作成します。IAMのダッシュボードにアクセスし、RoleメニューのCreate new roleをクリックします。後は指示にしたがって、作成するロールの設定を進めていきます。以下で項目についてざっと説明します。
Set Role Name
ロールの名前です。今回はEC2インスタンスに対する操作権限を全部与えるので、manage-ec2としてみました。
Set Role Type
付与するサービスの対象です。今回はEC2用なので、Amazon EC2を選択します。
Set Permissons
権限の詳細です。今回はEC2インスタンスに関する全権なので、Amazon EC2 full accessを選択します。
後はレビューして、作成完了です。
このIAM roleを利用するには、最初から別のIAM roleを設定されたインスタンスに紐付けるか、新規にこのIAM roleを適用したインスタンスを起動するしかないようです。今まで作成したインスタンスはIAM roleを設定していなかったので、新規にmanage-ec2という名前でこのIAM roleを紐付けて作成します。
EC2インスタンスからAWS CLIでインスタンスを操作する
作成したIAM roleを適用したインスタンスにログインします。
Amazon Linux AMIを利用していれば、既にAWS CLIはインストール済みのようです。確認してみましょう。
$ aws --version
aws-cli/1.5.0 Python/2.6.9 Linux/3.14.20-20.44.amzn1.x86_64
OKですね。
クライアントPC上では、この後、Access Keyの設定が必要になりますが、このEC2にはIAM roleが設定されていますので、設定せずともEC2に関するAWS CLIの操作が可能です。ただ、リージョンの設定はしていないので、コマンドで実行する際に、リージョンを明記するようにしてください。
なので、以下のような状態のEC2インスタンスが・・・
EC2インスタンス上のこのコマンドで・・・
$ aws --region ap-northeast-1 ec2 start-instances --instance-ids i-210285d2 { "StartingInstances": [ { "InstanceId": "i-210285d2", "CurrentState": { "Code": 0, "Name": "pending" }, "PreviousState": { "Code": 80, "Name": "stopped" } } ] }
こうなります!
これでEC2上からも簡単にコマンドベースで操作できるようになりました。
なんとなくIAM roleの使い勝手が見えた気がしますね。
まとめ
- IAMの基本設定とMFAの設定はまず最初にやっとけ!(受け売り)
- IAM roleはAccess Keyなどを設定せずともAPIから設定された権限でAWSリソースにアクセスできる
- ぼっちでもIAMを理解することは大事
奥が深いねIAM
今回はIAMをさらっと触ってみました。
User,Group,Roleに関しては、今回の体験でだいぶわかるようになったかなと思いました。
Password Policyでは他ユーザのパスワードを定期的に更新させたり、一定の文字数以上じゃないとダメにしたりなど、設定できるようになっています。Credentials Reportでは他ユーザの設定状況などを確認することもできます。権限設定というと、だいぶ地味な印象だったんですが、設定が自由自在で色々いじれるので、なかなかに楽しいですね。
また、Identitiy ProviderではSAMLの設定とかもできるようですね。あんまよくわからない現状ですが、IAMでできることはまだまだありそうです。奥が深い!でもこればっかりに執着していると、本業のプログラミングができない今みたいな状況になりかねないので、注意ですね。来週にはもうちょっとプログラマーっぽい記事を書きたいと思います。はい。
余談なんですけど、Command Line Interface (CLI)が主流なんですかね。ずっとCUI (Console User Insterface)を使ってきたんですが。まぁ、確かにGUIと見間違えやすいからな〜
参考にした記事
AWSアカウント作ったらこれだけはやっとけ!IAMユーザーとAuthyを使ったMFAで2段階認証 - Qiita
# 記事内でも紹介したいくらいわかりやすくていい記事でした。とりあえずやっとけって感じです。マジで。
強化されたAWS IAMパスワード管理を理解する | Developers.IO
# 安定のクラスメソッドさんの記事。IAMにおけるパスワード管理機能についてです。
IAMロール徹底理解 〜 AssumeRoleの正体 | Developers.IO
# IAM roleはEC2に権限委託するだけのものじゃないぞ!って記事。必読だと思います。
aws-cli を試してみる - ようへいの日々精進 XP
# AWS CLIの初期設定とかインストールでお世話になりました。
AWS Tips:AWS APIでAWSの操作を自動化する - @IT
# AWS APIでググってたどりついた@ITさんの記事。APIは資格試験でも必須範囲ですね。
AWS CLIでサービスの各種コマンドを動かしてみる(EC2編1: インスタンス) | Developers.IO
# AWS CLIの操作について参考にさせてもらいました。クラスメソッドさんありがとう。