[toc]
Vuls祭り#1のときにec2-vuls-configというツールを作ってLTしたのですが、Vuls祭り#3に向けてv0.1.0をリリースしたのでブログで宣伝です。
https://github.com/ohsawa0515/ec2-vuls-config
どういうツールなのか
EC2インスタンスの一覧から指定されたタグを付けたインスタンスのみを取得して、Vulsの設定ファイルの作成します。 このツールによって、Vulsスキャンの対象をEC2のタグで動的に制御することが可能になります。
なぜ作ったのか
AWS上でサーバ運用していると、インスタンスの状況が常に変わり続けていきます。あるときはEC2を作成したり、またあるときは削除したり。特にオートスケールによって起動しているインスタンス数やホスト名が自動的に変わっていきます。
Vulsで脆弱性スキャンを行うにあたり、予めスキャン対象を選定し、設定ファイルに記述しておく必要があります。しかし、インスタンスの状況が常に変動する環境だと設定ファイルを都度修正しなければなりません。
また、オートスケールなどで同じAMIから複数のインスタンスを作った場合を想定してみてください。そのサーバ群に対してChefやAnsibleなどのプロビジョニングツールで自動構成されており、手動でインストールなどされていない(=Immutable Infrastructureである)場合は、そのサーバ群にインストールされているパッケージやデプロイされているアプリケーションはすべて同じである可能性が高いです。 そのサーバ群すべてをVulsスキャンする必要はなく、1台だけをスキャンすれば良いはずです。
スキャン対象をカジュアルに設定する仕組みがほしいと思い、ec2-vuls-configを作りました。 EC2タグでスキャンする対象を選定するのは、Amazon Inspectorを参考にしました。
どうやって使うのか
READMEを見てみてください。日本語版 READMEもあります。
Nameタグとvuls:scan
タグさえ設定すれば、以下のようにスキャン対象を設定ファイルに含めて書き換えてくれます。元の設定ファイルに対して[servers]
セッションに追記する形で書き換えるため、設定ファイルの中身が大きく変わることはありません。
[default]
port = "22"
user = "vuls"
keyPath = "/opt/vuls/.ssh/id_rsa"
[servers]
### Generate by ec2-vuls-config ###
# Updated 2000-01-01T00:01:00+09:00
[servers.web-server-1]
host = "192.0.2.11"
### ec2-vuls-config end ###
Vuls v0.4.0 を使う上での注意点
Vuls v0.4.0からはデフォルトのSSH接続方法の挙動が変更されています。v0.3.0まではGoのネイティブ実装によるSSH接続がデフォルトで、OSにインストールされている外部SSH接続は-ssh-external
オプションを指定する必要がありました。
v0.4.0から -ssh-external
オプションが廃止され、デフォルトで外部SSHを使うようになりました。理由はホストキーの検証をしないとMITM(中間者攻撃)の可能性があるとのことですが、ホストキーの検証がGoだと難しいとのことです。 そのため、予めSSH接続をしてフィンガープリントを~/.ssh/known_hosts
に記載しておく必要があります。
https://github.com/future-architect/vuls/issues/415
しかし、EC2インスタンスが高頻度で追加・削除されている状況だとスキャン対象が予めSSH接続されている可能性が低いため、ec2-vuls-config とあまり相性がよくありません。そのため、ec2-vuls-configで取得したホストに対しては ssh-keyscan
コマンドでホストキーを取得するか、-ssh-native-insecure
オプションでホストキーの検証をしないことで回避することができます。
ホストキーの検証をしないことで、SSH接続先が自分が本当に接続したいホストなのかを担保することができなくなるため、最終的には自己責任になってしまいますが、VPC内でプライベートな環境であればそこまでリスクが高くないと思われます。
最後に
自分が便利だと思って作ったツールですが、もし同じような悩みがある方がいましたらぜひ使ってみてください。良いツールだと思えばGitHubスターをいただけると嬉しいです!