【AWS】EC2のインスタンス情報からssh/configを作成するRubyスクリプト

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。サーバー管理者の皆様bash脆弱性対応お疲れ様でした。

今回の脆弱性については上記ブログの「対処方法」にもあるように--releaseverをしていしてyum update bashすれば更新されるという、対応としては比較的容易なものでした。しかしサーバー台数が20台、30台規模になると、サーバー1台1台にログインしてコマンドを実行してまわるのは大変です。そこで今回はAnsibleを使って、全サーバーにコマンドを実行してまわることにしました。(Chef使ってないサーバーもあったので)

Ansibleはsshを使ってサーバーへログインします。そのためまずは管理対象の全サーバーにsshログインするための準備が必要です。1台ずつ$HOME/.ssh/configにログイン情報を設定していくのも大変なので、EC2の情報からconfigファイルを作成するスクリプトをRubyで作ってみました。

スクリプトの説明

機能

  • ssh踏台サーバー(bastion)経由でプライベートIPアドレスのサーバーにログインする場合も考慮しています。
  • 同一AWSアカウントに複数VPCがあった場合には踏台サーバーも分けてくれます。
  • Route53で名前解決ができるホストについては、IPアドレスでなくホスト名で接続できます。
  • 名前解決できないサーバーはプロファイル名_NAMEタグという名前で接続できるようにしています。
  • マルチリージョン対応です。--regionでリージョン指定した場合はそこにあるEC2だけを対象にします。

前提条件

  • ssh踏台サーバー(bastion)となるEC2はNameタグにbastionという文字列が含めてください。
  • Linuxサーバーへのログインユーザーはec2-user固定となっています。
  • sshの鍵ファイルは$HOME/.ssh以下に保存しておいてください。
  • 対象ホストがLinuxかWindowsかの判定は入れていません。Windowsサーバーも出力されてしまいます。ごめんなさい。

上記の前提条件にそぐわない場合は、適当にスクリプトを修正してください。改変・再配布はご自由に。

スクリプト

今回もお約束、望月さん作 aws-profile_parser を利用しています。

2015/07/08修正

  • コードを gist に掲載しました。
  • aws-profile_parserに依存しないコードに修正しました。

以下のように$HOME/.aws/configに記載されたプロファイル名を指定して実行してください。

$ ruby cm-ec2-create-sshconfig.rb --profile default > default.config

出力された結果を確認したら、cat default.config >> ~/.ssh/configで、現在のconfigファイルにマージしましょう。

まとめ

bash脆弱性対応時は、ssh設定ファイル作成後にAnsibleを使ってyum updateをしてまわりました。以下のような感じです。

$ brew install ansible

$ mkdir ansible
$ cd ansible

$ grep "^Host" default.config | awk '{ print $2 }' | sort > hosts
$ ansible all -i hosts -m shell -a "rpm -qv bash"
$ ansible all -i hosts -m shell -a "yum --releasever=2013.09 update bash -y" -s
$ ansible all -i hosts -m shell -a "rpm -qv bash"

今回多くのLinuxサーバーがアップデート対象になったように、今後も似たような対応が必要なケースがでてくるでしょう。全サーバーにsshでログインしシェルコマンドを実行できる仕組みを作って準備しておきたいですね。