OpenSSHの設定をよりセキュアに

OpenSSHをよりセキュアに設定する方法を以下のサイトを参考にまとめました。
Securing OpenSSH
を参考にし、下記設定を行いました。
 
なお、本記事ではCentOS6.2の環境で確認した結果を示しています。

以下、上記の設定方法について記述します。なお、設定変更後はsshdサービスを下記コマンドでリスタートしています。

# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

 
※目次をクリックすると目次の下部にコンテンツが表示されます。

ログインを制限
①rootユーザーのログインを制限する
 

# vi /etc/ssh/sshd_config

PermitRootLogin no

 
②SSHでログインできるユーザーを制限する
 
例)
“unyo8″と”unyo9″というユーザーのみ許可する場合

# vi /etc/ssh/sshd_config

AllowUsers unyo8 unyo9

SSHプロトコル1を無効にする
SSHはプロトコル1とプロトコル2の二つを使用できますが、プロトコル1はセキュリティが弱いので、使用する特別な理由が無い限りは無効にします。
 
/etc/ssh/sshd_configで下記のようにプロトコル1の指定ははずします。
 
Protocol 2
 
●動作確認
 
TeraTermでSSH接続する際、SSHバージョンをSSH1を指定して接続すると”プロトコルバージョンが一致しません”と表示される事を確認しました。

デフォルト(22番ポート)以外のポートを使用
デフォルトでは、sshはtcpの22番ポートを使用してネットワーク接続します。
攻撃者もそれを知っているので、22番ポートをスキャンしてsshサービスが実行されているか確認しようとします。
 
上記を防ぐため、sshを22番ポート以外のポートに変更して運用することもできます。
 
代わりにどのポートを使用するかですが、1024以上の使われていないポートが適しているようです。
 
●変更方法
 
①使用していないポートを確認
/etc/servicesファイル内で設定されていない1024以上のポート番号を探す。
 
②”netstat -an | grep ポート番号”を実行し、使用されていないことを確認する。
 
③/etc/ssh/sshd_configファイルにポート番号を設定
 
例)ポート番号2345を設定する場合
Port 2345
 
④iptablesにsshを設定している場合は、ポート番号を22から変更し、iptablesをリスタート
 
※CentOS6以降で、SELinuxを有効にしている場合は、下記のようにして設定を追加する必要があるとの事です。
 
$ semanage port -a -t ssh_port_t -p tcp 2345

iptablesでSSH接続を制限
1)特定のIPアドレスからのみSSHに接続する場合
 
下記のように許可するIPアドレスを指定します。
 
iptables -A INPUT -p tcp -s 192.168.1.1 –dport 22 -j ACCEPT
 
2)送信元アドレスが固定されていない場合(recentモジュール使用)
 
インターネットから送信元アドレスが特定できない状態で接続を許可している場合、総当たり攻撃(brute force attack)のリスクがあります。
 
recentモジュールを使用して、1分間に4回以上の接続を試みた場合は許可しないようにする例を示します。
 
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name ssh –rsource
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent ! –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j ACCEPT
 
1行目のルールは、新規接続のIPアドレスを記録しています。
2行目のルールは、このIPアドレスが60秒間の間に4回以上の接続を試みているかチェックし、そうでない場合は接続を許可します。
 
このルールを使用する場合は、インプットチェーンのデフォルトのDROPポリシーが必要です。
 
3)送信元アドレスが固定されていない場合(limitモジュール使用)
 
limitモジュールを使って、1分間に許可する接続回数を3回に制限する設定例を示します。
 
iptables -A INPUT -p tcp –dport 22 –syn -m limit –limit 1/minute –limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 –syn -j DROP
 
1行目のルールで、直近1分間に3回以上の接続をしていなければ許可しています。
3回以上の接続をしている場合は、2行目のルールでドロップされます。

認証方式をパスワード認証から公開鍵認証へ
公開鍵認証を使用し、パスワード認証を無効にする事によってパスワード攻撃を防ぐ事ができます。
 
1)秘密鍵と公開鍵を作成して配置
 
以下の手順でクライアントマシンでSSHの公開鍵、秘密鍵ペアを作成し、公開鍵をサーバーのauthorized_keysファイル内にコピーします。
 
(Tera Termの場合)
①メニューから「設定」→「SSH鍵生成」
 
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・鍵の種類 RSA
・ビット数 2048
 
③「生成」ボタン押下
鍵が生成されます。
 
④公開鍵と秘密鍵をファイルに保存
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”空のパスフレーズを使用しますか?”と聞かれます。
 パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
 
⑤上記公開鍵ファイルをサーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
 
例)公開鍵ファイル名がid_rsa.pubの場合
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
 
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
 
(WinSCPの場合)
①WinSCP同梱のPuTTY Key Generatorを起動
 
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・タイプ   SSH-2 RSA
・ビット数  1024
 
③「Generateボタン」押下
ウィンドウ内でマウスを動かしながら作成が終了するまで待つ
 
④公開鍵が生成されるので、サーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
 ”Public key for pasting in to OpenSSH authorized_keys file”欄の文字列をコピーしてサーバー内の~/.ssh/authorized_keysファイル内にコピーする。
 
⑤クライアントマシンで秘密鍵をファイルに保存
「Save private key」ボタンを押下。
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”Are you sure you want to save this key without a passphrase to protect it?”と聞かれます。
 パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
 
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
 
2)パスワード認証を無効にする
 
デフォルトでは、sshは最初にキーを使って認証を試み、キーが無い場合や認証が失敗した場合はパスワード認証に切り替えます。
 
上記(1)の設定で公開鍵認証が正常に実施できるようになったらパスワード認証は無効にします。
 
# vi /etc/ssh/sshd_config
 
PasswordAuthentication no

関連記事の目次
 
ネットワーク、ポート番号
  • iptablesを使ってCentOSのファイアウォール設定
  • nmapでオープンしているポート番号とバージョンを確認
  •  
    yum、rpmパッケージ、サービス
  • CentOSで不要なサービスは起動しないようにする
  • RPMパッケージのインテグリティチェック
  •  
    パーミッション
  • cronで使用するファイルのパーミッション設定
  • CentOSのumaskの設定
  • ユーザーホームディレクトリ内の権限設定をセキュアにする
  • CentOSのパスワードファイルのパーミッション設定
  • findコマンドでファイル書込権限をいっせいにチェック
  • findコマンドでセットユーザ(グループ)IDが不要にセットされていないかチェック
  • findコマンドで所有者、グループが存在しないファイルを抽出
  •  
    ログイン、認証、パスワード、アカウント制御
  • ログイン時などに表示されるシステムバナーを変更するには?
  • CentOSのユーザーアカウントのパスワードポリシーを設定
  • pam_cracklibモジュールでパスワードポリシーを設定
  • pam_unix.soモジュールを使って過去のパスワード再使用を制限する
  • システムコンソールでのrootログインを制限する方法
  • suコマンドによるrootへのスイッチを制限する
  • root権限でのコマンド実行、sudoだと監査ログが取得できる
  • デーモン用アカウントなどに対しシェルを使用を無効にする
  • パスワード認証を失敗時にアカウントをロックアウトする設定
  • rootアカウントのPATH環境変数のセキュリティについて
  •  
    auditdでシステム監査
  • auditdを使ってシステム監査
  • auditdのログ容量の設定
  • auditd監査ルールの設定方法
  • auditdで時間設定変更操作を監査する
  • auditdでユーザー・グループ設定ファイル変更操作を監査する
  • auditdでネットワーク関連の設定変更を監査する
  • auditdでログイン記録のログファイルの変更を監査する
  • auditdでファイル所有者や権限の変更に関するイベントを監査する
  • auditdでsetuid、setgidプログラムの実行を監査する
  • auditdでマウント操作を監査する
  • auditdでファイル削除操作を監査する
  • auditdでsudo設定ファイルに対する操作を監査する
  • auditdでカーネルモジュールのロード、アンロードを監査する
  • マシン再起動後にauditdの設定変更を有効にする設定
  • ausearch、aureportで監査ログのサマリレポートを作成
  •  
    ツール
  • NTPのセキュリティを考慮した設定
  • セキュリティを考慮してX Windowsを設定または削除する方法
  • ファイルの改ざん対策用にTripwireを導入
  • CentOSにホスト型侵入検知ソフトAIDE(Advanced Intrusion Detection Environment)を導入
  •  
    トラブルシューティング
  • アイドルのシェルを自動で強制終了させるには?
  • CentOSでコアダンプを無効にする方法
  • Linuxのbash脆弱性CVE-2014-6271、Shellshockを修整
  • CentOSでバッファーオーバーフロー脆弱性に対する防御機能が有効になっているか確認する
  • VPSサーバーでスナップショットを取得
    ~障害に備え、リカバリーポイントを作成。
    VPSサーバーにログインして、設定内容を確認
    ~グローバルIPアドレス確認、SSHキーを作成。
    VPSサーバーにSSHでログイン
    ~Tera Term、SSH、公開鍵認証方式
    yumコマンドで最新のパッケージにアップデート
    ~全パッケージを最新にアップデート
    Apacheのインストール
    ~yumコマンドでApacheインストール、iptablesでファイアウォールの設定
    PHPとMySQLをインストール
    ~yumコマンドでPHP、MySQLインストール
    WinSCPを使ってWordPressをアップロード
    ~WinSCPをクライアントPCにインストール、ファイルアップロード方法
    WordPressをインストール
    ~MySQLでWordPress用データベース作成、wp-config.phpファイルの設定
    CentOSのファイアウォール設定
    ~iptablesを使ってネットワークフィルタリング設定を一から行う
    OpenSSHの設定をよりセキュアに
    ~ログイン制限、ポート変更、認証方式
    ApacheでTCPのTraceメソッドを無効にする
    ~Apacheの設定変更、Telnetで動作確認
    ヘッダーにApacheバージョンが表示されないようにする
    ~Apacheの設定変更、Telnetで動作確認
    Apacheでディレクトリ内一覧表示を無効にする
    ~autoindex_moduleのロードを無効にする
    セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
    ~MySQLの匿名ユーザーにパスワードを設定、または削除
    PHPのバージョンが表示されないようにする
    ~php.iniの設定変更
    WordPressディレクトリのパーミッションをセキュアに
    ~WordPress用ディレクトリの所有グループ、ユーザー、パーミッション設定
    パーマリンク設定時のApache設定
    ~WordPressパーマリンクの設定、Apache .htaccessの設定
    WordPressテーマの選定
    ~テーマ追加の特徴フィルターの項目、テンプレートキング
    WordPressで画像のアップロード、サイズ調整、リンクを設定
    ~アップロード画像の画像サイズ、サムネイル、画像編集、リンク設定
    更新可能なRPMパッケージのリストをメールで送信する
    ~yumコマンド、Bashスクリプト、Cron
    Linuxでディスク使用量が多いディレクトリを調べる方法(1)
    ~du --max-depth
    Linuxでディスク使用量が多いディレクトリを調べる方法(2)
    ~duコマンド、sortコマンド
    WordPressデータベースのバックアップとリストア
    ~コマンドラインでバックアップ、リストア
    WordPressのバージョンアップと旧バージョンへの戻し
    ~データベースとディレクトリのバックアップ、リストア
    BashスクリプトでWordPressデータベースを自動バックアップ
    ~MySQLデータベースをBash、Cronを使って自動バックアップ、メール通知
    BashスクリプトでDos攻撃など大量アクセスのログを検知
    ~Apacheアクセスログ、Dos、Cron、メール通知
    テーマ作成
     
    ブートストラップ3を使って自作テーマ作成
    ~Bootstrap3、自作テーマ作成、TwentyFourteen
    Bootstrapのフリーのテーマを使ってデザインを簡単にカスタマイズ
    ~Bootstrap3のスタイルをカスタマイズ
     
    WordPresssショートコード
     
    簡単なショートコードを作ってみる
    ~ショートコードの作り方
    ショートコードを使って関連記事のリンクを自動で挿入
    ~ショートコードの簡単なサンプル
    ショートコードを使ってディレクトリ内のファイル名を取得し、投稿内にリンクを挿入
    ~カスタムフィールド利用、PHPで日本語文字列検索などのコーディング
     
    AJAX、AngularJSなどその他応用
     
    WordPress投稿内でAngularJSを使用
    ~AngularJS、Bootstrap、アコーディオン
    Bootstrap3で作成したナビゲーションメニューをAngularJSに変更
    ~AngularJS、Bootstrap、自作テーマheder.php
    WordPressでAngularJSを使ったGoogleマップを使えるようにする
    ~AngularJSを使って投稿内にGoogleマップ

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です