- 更新日: 2014年8月4日
- Vagrant & Chef
SSH 接続の設定・セキュリティ周りを Serverspec でテストして Chef Recipe 作成
SSH 接続設定・セキュリティ周りを serverspec でテストした後、Chef Cookbook を作成して SSH 接続の設定を行います。行う作業は以下のページに準ずるもの。
SSH 接続での root によるログイン禁止と公開鍵認証を強制 〜 CentOS6 | EasyRamble
SSH 接続での、root による SSH ログインを禁止、パスワード認証を禁止して公開鍵認証を強制する設定などを行います。
このエントリーは、CentOS サーバー設定用 Chef Cookbook/Recipe の目次 の一部です。
serverspec で SSH 接続の設定・セキュリティ周りをテスト
spec/centos.vagrant/base_ssh_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
require 'spec_helper' # backup sshd_config original describe file('/etc/ssh/sshd_config.org') do it { should be_file } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } it { should be_mode 600 } end # sshd_config settings describe file("/etc/ssh/sshd_config") do it { should be_file } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } it { should be_mode 600 } # use sshd2 protocol its(:content) { should match(/^Protocol 2$/) } # log its(:content) { should match(/^SyslogFacility AUTHPRIV$/) } its(:content) { should match(/^LogLevel INFO$/) } # deny root login its(:content) { should match(/^PermitRootLogin no$/) } # use rsa public key authentication its(:content) { should match(/^RSAAuthentication yes$/) } its(:content) { should match(/^PubkeyAuthentication yes$/) } its(:content) { should match(/^AuthorizedKeysFile\t+\.ssh\/authorized_keys$/) } # deny rhosts authentication its(:content) { should match(/^RhostsRSAAuthentication no$/) } # deny empty password its(:content) { should match(/^PermitEmptyPasswords no$/) } # deny password authentication its(:content) { should match(/^PasswordAuthentication no$/) } # deny challenge response authentication its(:content) { should match(/^ChallengeResponseAuthentication no$/) } # allow users its(:content) { should match(/^AllowUsers username1 username2 vagrant veewee$/) } end |
テストが失敗するのを確認
serverspec によるテストができたので、テストを実行します。
1 2 3 4 5 6 7 8 9 |
$ bundle exec rspec spec/centos.vagrant/base_ssh_spec.rb ... Finished in 4.79 seconds 20 examples, 13 failures Failed examples: ... |
デフォルトの /etc/ssh/sshd_config で有効になっているもの以外は、予定通りテストが失敗しました。
SSH 接続設定用の Recipe 作成
続いて、SSH 接続設定の Chef Recipe を作成します。
site-coobooks/base_cookbook/recipes/ssh.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# ssh security settings. eg.) deny root login, use ssh-key authentication # backup sshd_config original sshd_config = "/etc/ssh/sshd_config" bash 'copy_sshd_config_original' do code <<-EOC cp #{sshd_config} #{sshd_config}.org EOC creates "#{sshd_config}.org" end settings = { '#Port 22' => node.set['sshd_config']['port'], '#*Protocol 2' => 'Protocol 2', # SSH2プロトコル '#*SyslogFacility AUTHPRIV' => 'SyslogFacility AUTHPRIV', # ログ '#LogLevel INFO' => 'LogLevel INFO', # ログレベル '#PermitRootLogin yes' => 'PermitRootLogin no', # rootログインを禁止 '#RSAAuthentication yes' => 'RSAAuthentication yes', # RSA公開鍵認証 '#PubkeyAuthentication yes' => 'PubkeyAuthentication yes', '#AuthorizedKeysFile' => 'AuthorizedKeysFile', # AuthorizedKeysFileの場所 '#RhostsRSAAuthentication no' => 'RhostsRSAAuthentication no', # rhosts認証を禁止 '#PermitEmptyPasswords no' => 'PermitEmptyPasswords no', # 空パスワードを禁止 'PasswordAuthentication yes' => 'PasswordAuthentication no', # パスワード認証を禁止 '#*ChallengeResponseAuthentication no' => 'ChallengeResponseAuthentication no' # チャレンジレスポンス認証を禁止 } settings.each do |k, v| bash "set_sshd_config_#{v.split(' ').first}" do code <<-EOC sed -i -e "s/^#{k}/#{v}/g" #{sshd_config} EOC not_if "cat #{sshd_config} | grep '^#{v}'" end end # ssh allow users bash 'allow_users' do allow = "AllowUsers #{(node.set['users'] + ['vagrant', 'veewee']).join(' ')}" code <<-EOC echo '#{allow}' >> #{sshd_config} EOC not_if "cat #{sshd_config} | grep '#{allow}'" end |
今回は、/etc/ssh/sshd_config のオリジナルのバックアップを取った後、sed コマンドを使って sshd_config の設定を行いました。sed じゃなくて template ファイルを使っても良いかと思います。template(または cookbook_file)を使うか、sed コマンドを使うべきかたまに悩みます。どちらを使うべきか何か基準があるのだろうか…
【追記 2014/08/06】
sshd のようなデーモン・アプリケーションの設定ファイルは、やはり sed を使わずに template, cookbook_file リソースで作成したほうが良いと考え直しました。
理由は、template, cookbook_file リソースを使っておけば、notifies :restart で、設定ファイルを編集した後にサービスを自動で再起動させることができますので。
ということで、いずれ時間をとって書き直そうと思います。
【追記ここまで】
プロビジョニング実行。
1 2 3 |
$ vagrant provision |
Cookbook 適用後にもう一回テスト
プロビジョニングが終了したら、もう一度テストを実行。
1 2 3 4 5 6 7 |
$ bundle exec rspec spec/centos.vagrant/base_ssh_spec.rb .................... Finished in 5.15 seconds 20 examples, 0 failures |
無事にテストが全部通りました。SSH 接続周りはセキュリティに直結する箇所なので、しっかりと Serverspec のテストを書いたほうが良いかと思います。
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!