dev-sec.ssh-hardening
ssh-hardening(Ansibleロール)
注意: このロールは、私たちのハードニングコレクションに移行されました:
問題やプルリクエストは、そちらでお願いします!
要件
- Ansible > 2.5
ロールの変数
network_ipv6_enable
- デフォルト: false
- 説明: IPv6が必要な場合はtrue。
ssh_listen_to
もIPv6アドレスにリッスンするように設定する必要があります(例:[::]
)。
ssh_server_ports
- デフォルト: ['22']
- 説明: sshサーバがリッスンすべきポート
ssh_client_port
- デフォルト: '22'
- 説明: sshクライアントが接続するポート
ssh_listen_to
- デフォルト: ['0.0.0.0']
- 説明: sshサーバがリッスンすべきIPアドレス。デフォルトはすべてのIPv4アドレスですが、安全上の理由から特定のアドレスに設定する必要があります。
ssh_host_key_files
- デフォルト: []
- 説明: sshdのホストキー。空の場合は、サポートされているsshのバージョンに基づいて、
/etc/ssh/ssh_host_rsa_key
、/etc/ssh/ssh_host_ecdsa_key
、/etc/ssh/ssh_host_ed25519_key
が使用されます。
ssh_host_key_algorithms
- デフォルト: []
- 説明: サーバが提供するホストキーアルゴリズム。空の場合はデフォルトリストが使用され、それ以外の場合は指定のアルゴリズムリストで上書きされます。
ssh_client_alive_interval
- デフォルト: 600
- 説明: keepaliveメッセージを送信する間隔を指定します。
ssh_client_alive_count
- デフォルト: 3
- 説明: keep-aliveメッセージが送信される頻度を定義します。
ssh_permit_tunnel
- デフォルト: false
- 説明: SSHポートトンネリングが必要な場合はtrue。
ssh_remote_hosts
- デフォルト: []
- 説明: sshクライアントのための1つ以上のホストとカスタムオプション。デフォルトは空です。詳しくは
defaults/main.yml
の例を参照してください。
ssh_permit_root_login
- デフォルト: no
- 説明: rootログインを無効にします。rootログインを有効にするには
without-password
またはyes
に設定します。
ssh_allow_tcp_forwarding
- デフォルト: no
- 説明: TCPフォワーディングを無効にするには
'no'
。TCPフォワーディングを許可するには'yes'
。OpenSSH >= 6.2バージョンを使用している場合、'yes'
、'no'
、'all'
、または'local'
を指定できます。
注意: この変数に渡される値は文字列である必要があり、したがって値は引用符で囲む必要があります。
ssh_gateway_ports
- デフォルト: false
- 説明: リダイレクトされたポートを非ループバックアドレスにバインドすることを無効にするには
false
。ワイルドカードアドレスへのバインドを強制するにはtrue
に設定します。クライアントにどのアドレスにバインドするか指定させるにはclientspecified
に設定します。
ssh_allow_agent_forwarding
- デフォルト: false
- 説明: エージェントフォワーディングを無効にするにはfalse。エージェントフォワーディングを許可するにはtrueに設定します。
ssh_x11_forwarding
- デフォルト: false
- 説明: X11フォワーディングを無効にするにはfalse。X11フォワーディングを許可するにはtrueに設定します。
ssh_pam_support
- デフォルト: true
- 説明: SSHにPAMサポートがある場合はtrue。
ssh_use_pam
- デフォルト: true
- 説明: pam認証を無効にするにはfalse。
ssh_gssapi_support
- デフォルト: false
- 説明: SSHにGSSAPIサポートがある場合はtrue。
ssh_kerberos_support
- デフォルト: true
- 説明: SSHにKerberosサポートがある場合はtrue。
ssh_deny_users
- デフォルト: ''
- 説明: 指定された場合、一致するユーザー名のログインを拒否します。
ssh_allow_users
- デフォルト: ''
- 説明: 指定された場合、一致するユーザー名のみログインを許可します。
ssh_deny_groups
- デフォルト: ''
- 説明: 指定された場合、主グループまたは補助グループリストがパターンと一致するユーザーのログインを拒否します。
ssh_allow_groups
- デフォルト: ''
- 説明: 指定された場合、主グループまたは補助グループリストがパターンと一致するユーザーのみログインを許可します。
ssh_authorized_keys_file
- デフォルト: ''
- 説明: ユーザー認証に使用できる公開鍵を含むデフォルトファイルを変更します。
ssh_trusted_user_ca_keys_file
- デフォルト: ''
- 説明: ユーザー証明書に署名するために使用される信頼された証明機関の公開鍵を含むファイルを指定します。
ssh_trusted_user_ca_keys
- デフォルト: []
- 説明: ユーザー証明書に署名するために使用される信頼された証明機関の公開鍵を設定します。
ssh_trusted_user_ca_keys_file
が設定されている場合のみ使用されます。
ssh_authorized_principals_file
- デフォルト: ''
- 説明: 許可されたプリンシパルを含むファイルを指定します。
ssh_trusted_user_ca_keys_file
が設定されている場合のみ使用されます。
ssh_authorized_principals
- デフォルト: []
- 説明: ファイルパスと許可されたプリンシパルを含むハッシュのリスト、すべてのオプションについては
default_custom.yml
を参照してください。ssh_authorized_principals_file
が設定されている場合のみ使用されます。
ssh_print_motd
- デフォルト: false
- 説明: MOTDの印刷を無効にするにはfalse。
ssh_print_pam_motd
- デフォルト: false
- 説明: pam経由でのMOTDの印刷を無効にするにはfalse(DebianおよびUbuntu)。
ssh_print_last_log
- デフォルト: false
- 説明: 最後のログイン情報の表示を無効にするにはfalse。
sftp_enabled
- デフォルト: false
- 説明: sftpの設定を有効にするにはtrue。
sftp_umask
- デフォルト: '0027'
- 説明: sftpのumaskを指定します。
sftp_chroot
- デフォルト: true
- 説明: sftpのchrootを無効にするにはfalse。
sftp_chroot_dir
- デフォルト: /home/%u
- 説明: デフォルトのsftp chrootロケーションを変更します。
ssh_client_roaming
- デフォルト: false
- 説明: 実験的なクライアントローミングを有効にします。
sshd_moduli_file
- デフォルト: '/etc/ssh/moduli'
- 説明: SSHモジュリファイルへのパス。
sshd_moduli_minimum
- デフォルト: 2048
- 説明: 定義されたサイズより小さいDiffie-Hellmanパラメーターを削除してログジャムを軽減します。
ssh_challengeresponseauthentication
- デフォルト: false
- 説明: チャレンジレスポンス認証が許可されているか指定します(例: PAM経由)。
ssh_client_password_login
- デフォルト: false
- 説明: sshクライアントのパスワードベースの認証を許可するには
true
。
ssh_server_password_login
- デフォルト: false
- 説明: sshサーバーのパスワードベースの認証を許可するには
true
。
ssh_banner
- デフォルト: false
- 説明: ログイン時にバナーを表示するには
true
。
ssh_banner_path
- デフォルト: '/etc/sshd/banner.txt'
- 説明: SSHバナーファイルへのパス。
ssh_client_hardening
- デフォルト: true
- 説明: クライアントのハードニングを停止するには
false
。
ssh_client_port
- デフォルト: '22'
- 説明: リモートホストに接続するポート番号を指定します。
ssh_client_compression
- デフォルト: false
- 説明: クライアントが圧縮を要求するかどうかを指定します。
ssh_compression
- デフォルト: false
- 説明: ユーザーが正常に認証された後にサーバー側の圧縮が有効になっているかどうかを指定します。
ssh_login_grace_time
- デフォルト: 30s
- 説明: SSHサーバーへの成功した認証のために許可される時間を指定します。
ssh_max_auth_retries
- デフォルト: 2
- 説明: 接続ごとに許可される最大認証試行回数を指定します。
ssh_max_sessions
- デフォルト: 10
- 説明: 特定の接続から許可される最大オープンセッション数を指定します。
ssh_print_debian_banner
- デフォルト: false
- 説明: Debian特有のバナーを表示するには
true
。
ssh_server_enabled
- デフォルト: true
- 説明: opensshdサーバーを無効にするには
false
。
ssh_server_hardening
- デフォルト: true
- 説明: サーバーのハードニングを停止するには
false
。
ssh_server_match_address
- デフォルト: ''
- 説明: 条件付きブロックを導入します。Match行の全ての条件が満たされた場合、次の行のキーワードが設定ファイルのグローバルセクションの設定を上書きします。
ssh_server_match_group
- デフォルト: ''
- 説明: 条件付きブロックを導入します。Match行の全ての条件が満たされた場合、次の行のキーワードが設定ファイルのグローバルセクションの設定を上書きします。
ssh_server_match_user
- デフォルト: ''
- 説明: 条件付きブロックを導入します。Match行の全ての条件が満たされた場合、次の行のキーワードが設定ファイルのグローバルセクションの設定を上書きします。
ssh_server_match_local_port
- デフォルト: ''
- 説明: 条件付きブロックを導入します。Match行の全ての条件が満たされた場合、次の行のキーワードが設定ファイルのグローバルセクションの設定を上書きします。
ssh_server_permit_environment_vars
- デフォルト: no
- 説明:
yes
に設定すると、/.ssh/environmentと/.ssh/authorized_keysのenvironment=オプションがsshdによって処理されます。opensshバージョン7.8以降は、グローバルな「yes」または「no」設定に加えて環境変数名のホワイトリストを指定できます。
ssh_server_accept_env_vars
- デフォルト: ''
- 説明: クライアントから送信される環境変数がセッションの環境にコピーされるよう指定します。複数の環境変数は空白で区切れます。
ssh_use_dns
- デフォルト: false
- 説明: sshdがリモートホスト名を調べ、解決されたホスト名がリモートIPアドレスと同じIPアドレスにマッピングされることを確認するかどうかを指定します。
ssh_server_revoked_keys
- デフォルト: []
- 説明: sshサーバーが常に拒否する公開鍵のリストで、既知の弱い鍵や侵害された鍵を無効化するのに役立ちます。
ssh_max_startups
- デフォルト: '10:30:100'
- 説明: SSHデーモンへの最大同時未認証接続数を指定します。
ssh_macs
- デフォルト: []
- 説明: これらのリストを変更してmacを上書きします。デフォルトは
defaults/main.yml
にあります。
ssh_kex
- デフォルト: []
- 説明: これらのリストを変更してkexを上書きします。デフォルトは
defaults/main.yml
にあります。
ssh_ciphers
- デフォルト: []
- 説明: これらのリストを変更して暗号を上書きします。デフォルトは
defaults/main.yml
にあります。
ssh_custom_options
- デフォルト: []
- 説明: SSHクライアント設定のためのカスタム行。
sshd_custom_options
- デフォルト: []
- 説明: SSHデーモン設定のためのカスタム行。
sshd_syslog_facility
- デフォルト: 'AUTH'
- 説明: sshdからのメッセージをログ記録する際に使用される施設コード。
sshd_log_level
- デフォルト: 'VERBOSE'
- 説明: sshdからのメッセージをログ記録する際の冗長性レベル。
sshd_strict_modes
- デフォルト: true
- 説明: ログインを受け入れる前に、ユーザーのファイルとホームディレクトリのファイルモードや所有権を確認します。
sshd_authenticationmethods
- デフォルト:
publickey
- 説明: ユーザーがアクセスを許可されるために正常に完了しなければならない認証方法を指定します。選択した認証方法のために必要な変数をすべて設定します。デフォルトは
defaults/main.yml
にあります。
- デフォルト:
ロール変数に記載されていない設定の構成
上記に記載されていないsshオプションを構成したい場合は、ssh_custom_options
(/etc/ssh/ssh_config
用)またはsshd_custom_options
(/etc/ssh/sshd_config
用)を使用して設定できます。これらのオプションは、ファイルの先頭に設定されるため、ファイルの下部にあるオプションを上書きできます。
例プレイブック:
- hosts: localhost
roles:
- dev-sec.ssh-hardening
vars:
ssh_custom_options:
- "Include /etc/ssh/ssh_config.d/*"
sshd_custom_options:
- "AcceptEnv LANG"
デフォルトポートの変更と冪等性
このロールは、サーバに接続するためにデフォルトポート22またはインベントリで構成されたポートを使用します。デフォルトのssh
ポートがssh_server_ports
を介して変更されると、sshサーバーが再起動されても以前のポートで接続を試みます。このロールを同じサーバーで再び実行するには、インベントリを新しいsshポートを使用するように更新する必要があります。
冪等性が重要な場合は、構成されたポートが到達できない場合にポート22にフォールバックするロールssh-hardening-fallback
の使用を検討してください。このロールは、フォールバック用のラッパーです。
例プレイブック
- hosts: localhost
roles:
- dev-sec.ssh-hardening
ローカルテスト
ロールをローカルでテストするための推奨方法はDockerを使用することです。システムにDockerをインストールする必要があります。開始するを参照して、あなたのシステムに適したDockerパッケージを見つけてください。
また、VagrantとVirtualboxまたはVMWareを使用してローカルでテストを実行することもできます。これには、システムにVirtualboxとVagrantをインストールする必要があります。あなたのシステムに適したVagrantパッケージはVagrant Downloadsを参照してください。すべてのテストにはtest-kitchen
を使用します。test-kitchen
に不慣れな場合は、彼らのガイドをチェックしてください。
次に、テストキッチンをインストールします:
# 依存関係をインストール
gem install bundler
bundle install
Dockerを使用したテスト
# 一台のマシンでの迅速なテスト
bundle exec kitchen test ssh-ubuntu1804-ansible-latest
# すべてのマシンでのテスト
bundle exec kitchen test
# 開発用
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest
# クリーンアップ
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest
Virtualboxを使用したテスト
# 一台のマシンでの迅速なテスト
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804
# すべてのマシンでのテスト
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test
# 開発用
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804
詳しい情報はtest-kitchenを参照してください。
よくある質問 / 注意事項
自分のアカウントにログインできません。クライアントキーは登録していますが、それでもログインできません。
一般的な問題(ファイアウォール、ネットワーク、キーの欠如、誤った鍵、アカウントが無効など)をすべて試した場合、アカウントがロックされているかもしれません。最も簡単に確認する方法は、ユーザーのパスワードハッシュを見ることです:
sudo grep myuser /etc/shadow
ハッシュの中に!
があれば、アカウントはロックされています:
myuser:!:16280:7:60:7:::
適切な解決方法は、アカウントをアンロックすることです(passwd -u myuser
)。ユーザーにパスワードがない場合は、次のコマンドでアンロックできます:
usermod -p "*" myuser
あるいは、PAMを使用するつもりなら、ssh_use_pam: true
を有効にしてください。PAMは、ロックされたユーザーが鍵でログインできるようにします。
なぜ私のアプリケーションはもうSSHで接続できないのか?
最初にログファイルを確認し、可能であればクライアントとサーバーの間の交渉を確認してください。
アプリケーション(PythonおよびRubyベース)によっては、古い暗号セットを使用しているために発生する問題が見られます。これは、このハードニングモジュールによって暗号、メッセージ認証コード(MAC)、および鍵交換(KEX)アルゴリズムのリストがより安全な選択肢に減少したため、発生します。
このロールを使用した後、Ansibleのtemplate/copy/fileモジュールがもう動作しません!
このロールはデフォルトでSFTPを無効にします。Ansibleはデフォルトでリモートホストにファイルを転送するためにSFTPを使用します。あなたのansible.cfgにscp_if_ssh = True
を設定する必要があります。この設定により、AnsibleはSCPを使用してファイルをコピーします。または、sftp_enabled
をtrue
に設定してSFTPを再び有効にすることもできます。
特権がないためにsshdサービスを再起動できません
"restart sshd"ハンドラを実行すると次のエラーが発生する場合:
サービスsshの再起動に失敗しました。アクセスが拒否されました。
または
'ssh'のsystemctl showを実行中に失敗しました: busに接続できません: そのようなファイルまたはディレクトリはありません。
playbookをroot
として実行するか(playbookレベルでbecome: yes
を指定しない)、ハンドラにbecome: yes
を追加してください。
これはAnsibleのバグです: 詳細はこちらとこちらを参照してください。
貢献
貢献者ガイドラインを参照してください。
ライセンスと著者
- 著者:: Sebastian Gumprich
- 著者:: Christoph Hartmann chris@lollyrock.com
Apache License, Version 2.0の下でライセンスされています(「ライセンス」)。 このファイルを使用するにはライセンスに従う必要があります。 ライセンスのコピーは次のURLから入手できます:
http://www.apache.org/licenses/LICENSE-2.0
適用される法律および書面による合意により、ライセンスの下で配布されるソフトウェアは「現状のまま」で提供され、いかなる種類の明示的または暗示的な保証や条件もありません。 ライセンスの詳細については、ライセンスに記載された特定の権利と制限を参照してください。
This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
ansible-galaxy install dev-sec.ssh-hardening