Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
2013/04/23 #ssmjp @togakushi2013/06/02 MaxStartups 追記 (P.52)sshd のお話
アジェンダ● はじめに● 前回までのあらすじ● 設定ファイルの書式● 設定事例集● 小ネタ2 / 69
はじめに● 特に記述がない限り、全てプロトコル 2 が対象– OpenSSH-5.4 からプロトコル 1 はデフォルトで無効● 動作確認は Linux のみ( OpenSSH の移植版)● 暗号化とか認証とか詳しくないので、間違ってたら教えて欲...
OpenSSH リリース状況バージョン リリース日 バージョン リリース日OpenSSH-4.1p1 2005/05/26 OpenSSH-5.2p1 2009/02/02OpenSSH-4.2p1 2005/09/01 OpenSSH-5.3...
前回までのあらすじ● SSH クライアント– http://www.slideshare.net/tohakushi/ssh-13118950● 周辺ツール– http://www.slideshare.net/tohakushi/ssh-15...
設定ファイルの書式6 / 69
サーバで編集する主なファイル● /etc/ssh/sshd_config– sshd が読み込む設定ファイル● /etc/ssh/sshrc– ユーザがログインした時に最初に実行する内容● /etc/motd– 今日のお知らせ● その他– 認証...
書式● 設定項目と設定値は空白で区切る● 空白を含む設定値はダブルクォート囲むことができる● 設定値を複数持つ場合は空白で区切る● 「 # 」から始まる行と空行はコメント扱い● 設定項目の大文字小文字の区別はない– 設定値は区別される例:設定項...
数字とか記号とか● 数字は時間やポート番号などを指定– 秒 (s 、単位なし )/ 分 (m)/ 時 (h)/ 日 (d)/ 週 (w)● 「 % 英字」は特定の文字列に置き換わる– %u :認証しようとしているユーザ名– %h :そのユーザの...
パターン● IP アドレスやドメインの一部を指定– 0 個以上の非空白文字: *– 1 個の非空白文字: ?– 除外: !– カンマで連結可能● 例– 192.168.1.? → 192.168.1.1 〜 9– *.co.jp → 任意の ....
ファイルのパス● 絶対パスで指定– AuthorizedKeysFile と AuthorizedPrincipalsFile のみ例外– 絶対パス or 認証しようとしているユーザのホームディレクトリからの相対パス11 / 69
設定事例集12 / 69
最小構成コンフィグ● 動作に必要な要件を満たせば OK– 特権分離で使用するユーザ (sshd)● このユーザは「 /var/empty 」に書き込みができる必要がある– サーバの秘密鍵 (1 種類以上、デフォルトは/etc/ssh/ssh_h...
使いドコロ● 動作確認など– 役に立ちそうな sshd のコマンドラインオプションオプション 説明-d( 最大 3 つ ) デバッグモード1 回の接続のみで終了する-f 設定ファイルを指定-t テストモード設定の構文エラーのみチェックして終了す...
UsePrivilegeSeparation● 特権分離を使うか指定– 認証済みの sshd を root 以外のユーザ権限で動かす (OpenSSH-3.4 からデフォルト有効 )– sandbox が指定されていると認証前の sshd も制...
MaxAuthTries● 1 回の接続で何回まで認証を試みれるか– 全ての認証メソッドを通してのトータル回数– デフォルト 6 回表示されるエラー2: Too many authentication failures for <usernam...
Too many authentication failures の回避● エラーになる原因がわかっていれば回避できるかも?● クライアント側で使用する認証メソッド指定して接続– ssh -oPreferredAuthentications=p...
ChallengeResponseAuthentication● /etc/login.conf に記述されてる全ての認証形式が使える( BSD のはなし?)● Linux では keyboard-interactive が有効になる– PAM...
PubkeyAuthentication● 公開鍵認証を有効にする19 / 69
AuthorizedKeysCommand● ユーザの公開鍵を検索するプログラムを指定する (OpenSSH-6.2 で追加 )– プログラムを実行するユーザはAuthorizedKeysCommandUser で指定 ( 必須 )● 引数に認...
使いドコロ● 公開鍵を LDAP や DB に探しに行く– AuthorizedKeysCommand で見つからない場合はAuthorizedKeysFile を探す– ローカルファイルシステムの公開鍵を無視したい場合は「 Authorize...
AuthenticationMethods● 指定した複数の認証メソッド全ての認証に成功することを要求する (OpenSSH-6.2 で追加 )– カンマで区切って並べたものが要求される認証メソッド– スペースで区切って複数パターンを指定できる...
使いドコロ● 公開鍵認証した後に、パスワード認証を要求する– AuthenticationMethods publickey,passwordpublickey,keyboard-interactive– 公開鍵認証に成功しないとパスワードは要...
PermitRootLogin● root ユーザが直接ログイン可能か指定設定値 意味yes 許可するno 許可しないwithout-password パスワード認証では許可しないforced-commands-only 強制コマンドが指定され...
ForceCommand● クライアントが指定したコマンドを無視(OpenSSH-4.4 で追加 )– 指定したコマンドを強制的に実行– .ssh/rc( 存在すれば ) を実行25 / 69
使いドコロ● 簡易 VPN を使うときに root でログインする必要があるので、 PermitRootLogin や Match と組み合わせてインターフェースの設定だけする● Internal-sftp を指定して sftp しかできないよ...
Match● 指定した全ての条件を満たした時に、設定値を上書きする (OpenSSH-4.4 で追加 )– ユーザ名 / グループ名 / ホスト名 / アドレス / ローカルアドレス / ローカルポート– 全ての項目は上書きできないので注意 (...
使いドコロ (1)● 外からの接続は公開鍵、中からの接続はパスワード認証も許可したいPubkeyAuthentication yesPasswordAuthentication noMatch Address 192.168.1.0/24Pas...
使いドコロ (2)● sftp しかできないユーザを作る– 「 sftponly 」グループに属するユーザは sftp 以外のセッションが開始できないSubsystem sftp internal-sftpMatch Group sftponl...
ChrootDirectory● 認証完了後、ユーザの環境を chroot で閉じ込める (OpenSSH-4.8 で追加 )– ログインさせるならそれなりの準備を– 設定値に指定するディレクトリパスは上位層を含め、所有者は root のみで他...
使いドコロ (1)● ログインしたユーザを制限された環境に閉じ込める● 必要なもの– ログインシェル ( とそれが動く環境 )– デバイス (null, zero,urandom, tty)– 動かしたいコマンド ( とそれが動く環境 )31 ...
最低限必要なもの● プログラムが使うライブラリは ldd で調べる– 認証は chroot 前に済まされる ( 使用するログインシェルは chroot 前に決定する )# find /opt/chroot -printf %M %u %g %p...
使いドコロ (2)● sftponly ユーザをさらに制限する● chroot 環境にはユーザが使うディレクトリだけ用意するSubsystem sftp internal-sftpMatch Group sftponlyChrootDirect...
AllowTcpForwarding● TCP ポートフォワードの制限– 「させる」か「させない」かの二択● OpenSSH-6.2 から「 remote 」と「 local 」が追加34 / 69
使いドコロ● 踏み台での TCP ポートフォワードを制限したり35 / 69
PermitOpen● TCP ポートフォワードで利用できるポートを制限 (OpenSSH-4.4 で追加 )– any :すべてのポートで許可– none :すべてのポートで拒否– 複数指定するときは空白で区切るPermitOpen host...
使いドコロ● 目的のサーバの目的のポートのみへの転送だけに絞る● ぶっちゃけ、、、– ユーザがログインできるなら stone や nc などプログラムを動かして転送を重ねれば目的のポートにたどり着く ( 転送先のホストが制限されてなければ )–...
Ciphers● 使用する暗号化プロトコルの順序の指定● デフォルト値– aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-...
使いドコロ● 脆弱性の見つかった暗号プロトコルを外す● cbc plaintext disclosure– 2 の -14 ~ -18 乗の確率で 14 ~ 32bit の平文を回復できる可能性– 「 CPNI-957037 」( SSH 通信...
Banner● ユーザ認証する前に表示するテキスト● scp や sftp で接続したときでも表示される40 / 69
PrintLastLog● ログインした時に最後にログインした日付(lastlog) を表示する– ~/.hushlogin があると表示されない41 / 69
PrintMotd● ログインした時に /etc/motd( 今日のお知らせ )の内容を表示する– ~/.hushlogin があると表示しない42 / 69
使いドコロ● 殺伐としたコンソールに突如黒魔道士が!!● curlhttps://gist.github.com/shin1x1/5230392/raw/b27b4> /etc/motd43 / 69
UsePAM● ChallengeResponseAuthentication で PAM の使用を許可する● PasswordAuthentication で PAM を使う44 / 69
使いドコロ● ワンタイムパスワード– pam_otpw を入れて設定– PAM →でワンタイムパスワードが有効になる sshでも使う● PAM でできることならなんでもできる45 / 69
certificate authentication● 証明書認証 (OpenSSH-5.4 で追加 )– ユーザ ( またはホスト ) の公開鍵を CA 局の秘密鍵で署名– 署名された公開鍵 ( 証明書 ) と秘密鍵をセットで使う– 証明書に...
簡略図ユーザ秘密鍵ユーザ公開鍵CA 局公開鍵CA 局公開鍵CA 局秘密鍵CA 局の秘密鍵で署名されたユーザ公開鍵の証明書ホスト秘密鍵/公開鍵コピー秘密鍵と証明書のセットで認証クライアントサーバ証明局47 / 69
設定方法 (1/3)● CA 局で署名用の鍵を作成– ssh-keygen -f ca-key● サーバに CA 局の公開鍵を登録– AuthorizedKeysFile で指定– cert-authority オプションを追加● ユーザの公開...
設定方法 (2/3)● 署名された鍵をユーザへ– id_rsa-cert.pub が生成される● ユーザはペアの秘密鍵でアクセス– ssh -i id_rsa remotehost– 末尾に -cert.pub の付いている証明書が利用されるの...
設定方法 (3/3)● 公開鍵の失効リスト– 廃止された公開鍵のリスト– 登録された公開鍵を使用した認証は失敗する– ssh-keygen -k filename < 鍵 >– RevokedKeys で設定– 一度登録したら取り消せない– 公...
証明書の中身% ssh-keygen -L -f id_rsa-cert.pubid_rsa-cert.pub:Type: ssh-rsa-cert-v01@openssh.com user ...Public key: RSA-CERT 13...
MaxStartups● 認証を受け付ける sshd の数を 3 つのパラメータで指定– < 起動数 > : < 切断確率 > : < 最大起動数 >– 起動数を超える接続は、 2 つ目のパラメータで指定した確率で失敗し、最大で 3 つ目のパラ...
CVE-2010-5107● MaxStartups のデフォルト値が適切ではないから認証 DoS ができますよって指摘● telnet や対話式になる認証 ( パスワードやパスフレーズの入力 ) を完了させずに連続で接続すると簡単に引き起こせ...
その他● アクセスコントロール– DenyUsers/AllowUsers/DenyGroups /AllowGroups● パーミッションのチェック ( 厳格なモード )– StrictModes● バージョン番号追加文字列– Version...
小ネタ55 / 69
RHEL/CentOS リリース状況(2013/04 現在 )OS 含まれているOpenSSH RHEL CentOSリリース日 パッチ数 リリース日 パッチ数5.0 openssh-4.3p2-16.el5.src.rpm 2007/03/1...
5 にバックポートされてるもの● openssh-4.3p2-chroot.patch(5.4 〜 )● openssh-4.3p2-forced.patch(5.4 〜 )● openssh-4.3p2-biguid.patch(5.7 〜 ...
6 にバックポートされてるもの● openssh-5.3p1-sftp_umask.patch(6.1 〜 )● openssh-5.3p1-biguid.patch(6.1 〜 )● openssh-5.3p1-linux-oomkiller...
Out Of Memory killer● 起動時に oom_adj を -17 にセット (OpenSSH-5.4 以降 /* kernels <= 2.6.35 */)● 起動時に oom_score_adj を -1000 にセット(Op...
RHEL/CentOS では● RHEL6.3 でバックポートrpm/rhel/6.3/openssh-5.3p1-linux-oomkiller.patch:+ {"/proc/self/oom_score_adj", -1000}, /* ...
RedHat の独自パッチ?● openssh-5.3p1-ldap.patch(6.1 〜 )– openssh-ldap.x86_64 : A LDAP support for opensource SSH server daemon– 簡...
ユーザ権限で sshd を動かす● 制約事項– PAM が使えない– 1024 より小さいポート番号が使えない● 準備– 鍵とコンフィグはユーザ権限で読める場所に62 / 69
楕円曲線暗号 (ECC)● OpenSSH-5.7 から楕円 DSA(ECDSA) をサポート– OpenSSL のライブラリに依存– RHEL6/CentOS6 標準の OpenSSL は今のところ非対応● 短い鍵長で今までと同じ強度– 負荷...
mosh っぽい何か● roaming.h(OpenSSH-6.2)– OpenSSH-5.3 の頃からあるvoid request_roaming(void);int get_snd_buf_size(void);int get_recv_b...
実装がなかった!● roaming_serv.c(OpenSSH-6.2)24 /*25 * Wait for the roaming client to reconnect. Returns 0 if a connect ocurred.26...
実装がなかった!● roaming_serv.c(OpenSSH-6.2)24 /*25 * Wait for the roaming client to reconnect. Returns 0 if a connect ocurred.26...
まとめ● いろんな認証方式や暗号方式があるよ– ひとつに絞ると問題が見つかったときに全滅する● ユーザに便利に使ってもらう設定もあれば制限する設定もあるよ● 万能じゃないので過信するな67 / 69
参考資料● OpenSSH.org– http://www.openssh.org/ja/● OpenSSH 日本語マニュアルページ– http://www.unixuser.org/~euske/doc/openssh/jman/● Open...
Connection closed69 / 69
Upcoming SlideShare
Loading in …5
×

sshdのお話

10,562 views

Published on

Published in: Technology
  • MaxStartupsとCVE-2010-5107の話を追記しておいた。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

sshdのお話

  1. 1. 2013/04/23 #ssmjp @togakushi2013/06/02 MaxStartups 追記 (P.52)sshd のお話
  2. 2. アジェンダ● はじめに● 前回までのあらすじ● 設定ファイルの書式● 設定事例集● 小ネタ2 / 69
  3. 3. はじめに● 特に記述がない限り、全てプロトコル 2 が対象– OpenSSH-5.4 からプロトコル 1 はデフォルトで無効● 動作確認は Linux のみ( OpenSSH の移植版)● 暗号化とか認証とか詳しくないので、間違ってたら教えて欲しい!!3 / 69
  4. 4. OpenSSH リリース状況バージョン リリース日 バージョン リリース日OpenSSH-4.1p1 2005/05/26 OpenSSH-5.2p1 2009/02/02OpenSSH-4.2p1 2005/09/01 OpenSSH-5.3p1 2009/10/01OpenSSH-4.3p2 2006/02/11 OpenSSH-5.4p1 2010/03/08OpenSSH-4.4p1 2006/09/27 OpenSSH-5.5p1 2010/04/16OpenSSH-4.5p1 2006/11/07 OpenSSH-5.6p1 2010/08/23OpenSSH-4.6p1 2007/03/08 OpenSSH-5.7p1 2011/01/24OpenSSH-4.7p1 2007/09/05 OpenSSH-5.8p2 2011/05/03OpenSSH-4.8p1 ない OpenSSH-5.9p1 2011/09/06OpenSSH-4.9p1 2008/03/31 OpenSSH-6.0p1 2012/04/22OpenSSH-5.0p1 2008/04/03 OpenSSH-6.1p1 2012/08/29OpenSSH-5.1p1 2008/07/21 OpenSSH-6.2p1 2013/03/224 / 69
  5. 5. 前回までのあらすじ● SSH クライアント– http://www.slideshare.net/tohakushi/ssh-13118950● 周辺ツール– http://www.slideshare.net/tohakushi/ssh-15554045● ~/.ssh/config– https://docs.google.com/presentation/d/1TGaiAIKUAC2Y_hgN● 多段– https://docs.google.com/presentation/d/1Zdg6qe0eA_353zyLz5 / 69
  6. 6. 設定ファイルの書式6 / 69
  7. 7. サーバで編集する主なファイル● /etc/ssh/sshd_config– sshd が読み込む設定ファイル● /etc/ssh/sshrc– ユーザがログインした時に最初に実行する内容● /etc/motd– 今日のお知らせ● その他– 認証用の設定ファイル ( 鍵とかいろいろ )– ホームディレクトリのユーザ個別のファイル7 / 69
  8. 8. 書式● 設定項目と設定値は空白で区切る● 空白を含む設定値はダブルクォート囲むことができる● 設定値を複数持つ場合は空白で区切る● 「 # 」から始まる行と空行はコメント扱い● 設定項目の大文字小文字の区別はない– 設定値は区別される例:設定項目 設定値   TCPKeepAlive yes8 / 69
  9. 9. 数字とか記号とか● 数字は時間やポート番号などを指定– 秒 (s 、単位なし )/ 分 (m)/ 時 (h)/ 日 (d)/ 週 (w)● 「 % 英字」は特定の文字列に置き換わる– %u :認証しようとしているユーザ名– %h :そのユーザのホームディレクトリ9 / 69
  10. 10. パターン● IP アドレスやドメインの一部を指定– 0 個以上の非空白文字: *– 1 個の非空白文字: ?– 除外: !– カンマで連結可能● 例– 192.168.1.? → 192.168.1.1 〜 9– *.co.jp → 任意の .co.jp ドメイン10 / 69
  11. 11. ファイルのパス● 絶対パスで指定– AuthorizedKeysFile と AuthorizedPrincipalsFile のみ例外– 絶対パス or 認証しようとしているユーザのホームディレクトリからの相対パス11 / 69
  12. 12. 設定事例集12 / 69
  13. 13. 最小構成コンフィグ● 動作に必要な要件を満たせば OK– 特権分離で使用するユーザ (sshd)● このユーザは「 /var/empty 」に書き込みができる必要がある– サーバの秘密鍵 (1 種類以上、デフォルトは/etc/ssh/ssh_host_{dsa,rsa,ecdsa}_keyと /etc/ssh/ssh_host_key)# sshd_configUsePrivilegeSeparation noHostKey /path/to/key13 / 69
  14. 14. 使いドコロ● 動作確認など– 役に立ちそうな sshd のコマンドラインオプションオプション 説明-d( 最大 3 つ ) デバッグモード1 回の接続のみで終了する-f 設定ファイルを指定-t テストモード設定の構文エラーのみチェックして終了する-D デーモン化しない ( フォアグランドで動かす )-e エラーを syslog ではなく、標準エラー出力に出す-T 拡張テストモード適応される全設定項目を表示して終了する14 / 69
  15. 15. UsePrivilegeSeparation● 特権分離を使うか指定– 認証済みの sshd を root 以外のユーザ権限で動かす (OpenSSH-3.4 からデフォルト有効 )– sandbox が指定されていると認証前の sshd も制限する (OpenSSH-5.9 で追加 )15 / 69
  16. 16. MaxAuthTries● 1 回の接続で何回まで認証を試みれるか– 全ての認証メソッドを通してのトータル回数– デフォルト 6 回表示されるエラー2: Too many authentication failures for <username>16 / 69
  17. 17. Too many authentication failures の回避● エラーになる原因がわかっていれば回避できるかも?● クライアント側で使用する認証メソッド指定して接続– ssh -oPreferredAuthentications=password, ...17 / 69
  18. 18. ChallengeResponseAuthentication● /etc/login.conf に記述されてる全ての認証形式が使える( BSD のはなし?)● Linux では keyboard-interactive が有効になる– PAM を使ってパスワード認証する18 / 69
  19. 19. PubkeyAuthentication● 公開鍵認証を有効にする19 / 69
  20. 20. AuthorizedKeysCommand● ユーザの公開鍵を検索するプログラムを指定する (OpenSSH-6.2 で追加 )– プログラムを実行するユーザはAuthorizedKeysCommandUser で指定 ( 必須 )● 引数に認証しようとしているユーザ名が渡される20 / 69
  21. 21. 使いドコロ● 公開鍵を LDAP や DB に探しに行く– AuthorizedKeysCommand で見つからない場合はAuthorizedKeysFile を探す– ローカルファイルシステムの公開鍵を無視したい場合は「 AuthorizedKeysFile none 」を指定21 / 69
  22. 22. AuthenticationMethods● 指定した複数の認証メソッド全ての認証に成功することを要求する (OpenSSH-6.2 で追加 )– カンマで区切って並べたものが要求される認証メソッド– スペースで区切って複数パターンを指定できる● プロトコル 1 では使えない ( エラーで起動しない )22 / 69
  23. 23. 使いドコロ● 公開鍵認証した後に、パスワード認証を要求する– AuthenticationMethods publickey,passwordpublickey,keyboard-interactive– 公開鍵認証に成功しないとパスワードは要求されない23 / 69
  24. 24. PermitRootLogin● root ユーザが直接ログイン可能か指定設定値 意味yes 許可するno 許可しないwithout-password パスワード認証では許可しないforced-commands-only 強制コマンドが指定されている場合だけ許可( 公開鍵に command="..." が設定されてるときのみ )24 / 69
  25. 25. ForceCommand● クライアントが指定したコマンドを無視(OpenSSH-4.4 で追加 )– 指定したコマンドを強制的に実行– .ssh/rc( 存在すれば ) を実行25 / 69
  26. 26. 使いドコロ● 簡易 VPN を使うときに root でログインする必要があるので、 PermitRootLogin や Match と組み合わせてインターフェースの設定だけする● Internal-sftp を指定して sftp しかできないようにする– Match や ChrootDirectory と組み合わせると最強26 / 69
  27. 27. Match● 指定した全ての条件を満たした時に、設定値を上書きする (OpenSSH-4.4 で追加 )– ユーザ名 / グループ名 / ホスト名 / アドレス / ローカルアドレス / ローカルポート– 全ての項目は上書きできないので注意 ( マニュアル参照 )– 上書きできる項目、条件 ( 書式 ) はバージョンによって増えている● 接続元やユーザ名によって異なる設定を使うことが可能になる27 / 69
  28. 28. 使いドコロ (1)● 外からの接続は公開鍵、中からの接続はパスワード認証も許可したいPubkeyAuthentication yesPasswordAuthentication noMatch Address 192.168.1.0/24PasswordAuthentication yes28 / 69
  29. 29. 使いドコロ (2)● sftp しかできないユーザを作る– 「 sftponly 」グループに属するユーザは sftp 以外のセッションが開始できないSubsystem sftp internal-sftpMatch Group sftponlyX11Forwarding noAllowTcpForwarding noForceCommand internal-sftp29 / 69
  30. 30. ChrootDirectory● 認証完了後、ユーザの環境を chroot で閉じ込める (OpenSSH-4.8 で追加 )– ログインさせるならそれなりの準備を– 設定値に指定するディレクトリパスは上位層を含め、所有者は root のみで他のユーザが書き込みできてはイケナイ30 / 69
  31. 31. 使いドコロ (1)● ログインしたユーザを制限された環境に閉じ込める● 必要なもの– ログインシェル ( とそれが動く環境 )– デバイス (null, zero,urandom, tty)– 動かしたいコマンド ( とそれが動く環境 )31 / 69
  32. 32. 最低限必要なもの● プログラムが使うライブラリは ldd で調べる– 認証は chroot 前に済まされる ( 使用するログインシェルは chroot 前に決定する )# find /opt/chroot -printf %M %u %g %pndrwxr-xr-x root root /opt/chroot/lib64-rwxr-xr-x root root /opt/chroot/lib64/ld-linux-x86-64.so.2-rwxr-xr-x root root /opt/chroot/lib64/libdl.so.2-rwxr-xr-x root root /opt/chroot/lib64/libtinfo.so.5-rwxr-xr-x root root /opt/chroot/lib64/libc.so.6drwxr-xr-x root root /opt/chroot/bin-rwxr-xr-x root root /opt/chroot/bin/bashdrwxr-xr-x root root /opt/chroot/devcrw-rw-rw- root root /opt/chroot/dev/ttycrw-rw-rw- root root /opt/chroot/dev/nullcr--r--r-- root root /opt/chroot/dev/urandom32 / 69
  33. 33. 使いドコロ (2)● sftponly ユーザをさらに制限する● chroot 環境にはユーザが使うディレクトリだけ用意するSubsystem sftp internal-sftpMatch Group sftponlyChrootDirectory /sftp-topX11Forwarding noAllowTcpForwarding noForceCommand internal-sftp33 / 69
  34. 34. AllowTcpForwarding● TCP ポートフォワードの制限– 「させる」か「させない」かの二択● OpenSSH-6.2 から「 remote 」と「 local 」が追加34 / 69
  35. 35. 使いドコロ● 踏み台での TCP ポートフォワードを制限したり35 / 69
  36. 36. PermitOpen● TCP ポートフォワードで利用できるポートを制限 (OpenSSH-4.4 で追加 )– any :すべてのポートで許可– none :すべてのポートで拒否– 複数指定するときは空白で区切るPermitOpen host:portPermitOpen IPv4_addr:portPermitOpen [IPv6_addr]:port36 / 69
  37. 37. 使いドコロ● 目的のサーバの目的のポートのみへの転送だけに絞る● ぶっちゃけ、、、– ユーザがログインできるなら stone や nc などプログラムを動かして転送を重ねれば目的のポートにたどり着く ( 転送先のホストが制限されてなければ )– 本気で制限したいなら SELinux などで37 / 69
  38. 38. Ciphers● 使用する暗号化プロトコルの順序の指定● デフォルト値– aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour38 / 69
  39. 39. 使いドコロ● 脆弱性の見つかった暗号プロトコルを外す● cbc plaintext disclosure– 2 の -14 ~ -18 乗の確率で 14 ~ 32bit の平文を回復できる可能性– 「 CPNI-957037 」( SSH 通信において一部データが漏洩する可能性)● OpenSSH-5.2 から CBC の優先順位が下げられた39 / 69
  40. 40. Banner● ユーザ認証する前に表示するテキスト● scp や sftp で接続したときでも表示される40 / 69
  41. 41. PrintLastLog● ログインした時に最後にログインした日付(lastlog) を表示する– ~/.hushlogin があると表示されない41 / 69
  42. 42. PrintMotd● ログインした時に /etc/motd( 今日のお知らせ )の内容を表示する– ~/.hushlogin があると表示しない42 / 69
  43. 43. 使いドコロ● 殺伐としたコンソールに突如黒魔道士が!!● curlhttps://gist.github.com/shin1x1/5230392/raw/b27b4> /etc/motd43 / 69
  44. 44. UsePAM● ChallengeResponseAuthentication で PAM の使用を許可する● PasswordAuthentication で PAM を使う44 / 69
  45. 45. 使いドコロ● ワンタイムパスワード– pam_otpw を入れて設定– PAM →でワンタイムパスワードが有効になる sshでも使う● PAM でできることならなんでもできる45 / 69
  46. 46. certificate authentication● 証明書認証 (OpenSSH-5.4 で追加 )– ユーザ ( またはホスト ) の公開鍵を CA 局の秘密鍵で署名– 署名された公開鍵 ( 証明書 ) と秘密鍵をセットで使う– 証明書には有効期限を設けれる46 / 69
  47. 47. 簡略図ユーザ秘密鍵ユーザ公開鍵CA 局公開鍵CA 局公開鍵CA 局秘密鍵CA 局の秘密鍵で署名されたユーザ公開鍵の証明書ホスト秘密鍵/公開鍵コピー秘密鍵と証明書のセットで認証クライアントサーバ証明局47 / 69
  48. 48. 設定方法 (1/3)● CA 局で署名用の鍵を作成– ssh-keygen -f ca-key● サーバに CA 局の公開鍵を登録– AuthorizedKeysFile で指定– cert-authority オプションを追加● ユーザの公開鍵を CA 局の秘密鍵で署名– ssh-keygen -s ca-key -I keyid -V +30d id_rsa.pub– 「 -V 」で有効期限を指定 ( 省略時無期限 )48 / 69
  49. 49. 設定方法 (2/3)● 署名された鍵をユーザへ– id_rsa-cert.pub が生成される● ユーザはペアの秘密鍵でアクセス– ssh -i id_rsa remotehost– 末尾に -cert.pub の付いている証明書が利用されるので秘密鍵と同じディレクトリに配置– OpenSSH-5.4 以降の ssh の動作– ssh-agent で秘密鍵を登録する時に証明書も同時に登録される49 / 69
  50. 50. 設定方法 (3/3)● 公開鍵の失効リスト– 廃止された公開鍵のリスト– 登録された公開鍵を使用した認証は失敗する– ssh-keygen -k filename < 鍵 >– RevokedKeys で設定– 一度登録したら取り消せない– 公開鍵が手元になくてもフィンガープリントや証明書のシリアルで登録可能50 / 69
  51. 51. 証明書の中身% ssh-keygen -L -f id_rsa-cert.pubid_rsa-cert.pub:Type: ssh-rsa-cert-v01@openssh.com user ...Public key: RSA-CERT 13:33:cc:d8:31:83:...Signing CA: RSA ac:a6:ba:61:5a:fc:ff:92:...Key ID: "keyid"Serial: 0Valid: from 2013-04-22T00:44:00 to 2014-04-22T00:45:11Principals: (none)Critical Options: (none)Extensions:permit-X11-forwardingpermit-agent-forwardingpermit-port-forwardingpermit-ptypermit-user-rc51 / 69
  52. 52. MaxStartups● 認証を受け付ける sshd の数を 3 つのパラメータで指定– < 起動数 > : < 切断確率 > : < 最大起動数 >– 起動数を超える接続は、 2 つ目のパラメータで指定した確率で失敗し、最大で 3 つ目のパラメータまで増え、それ以降は必ず接続に失敗する。– デフォルト値: 10:100:10 (OpenSSH-6.1 まで )–       : 10:30:100 (OpenSSH-6.2 から )52 / 69
  53. 53. CVE-2010-5107● MaxStartups のデフォルト値が適切ではないから認証 DoS ができますよって指摘● telnet や対話式になる認証 ( パスワードやパスフレーズの入力 ) を完了させずに連続で接続すると簡単に引き起こせる● LoginGraceTime が過ぎるまで新しい接続ができない53 / 69
  54. 54. その他● アクセスコントロール– DenyUsers/AllowUsers/DenyGroups /AllowGroups● パーミッションのチェック ( 厳格なモード )– StrictModes● バージョン番号追加文字列– VersionAddendumまだまだある54 / 69
  55. 55. 小ネタ55 / 69
  56. 56. RHEL/CentOS リリース状況(2013/04 現在 )OS 含まれているOpenSSH RHEL CentOSリリース日 パッチ数 リリース日 パッチ数5.0 openssh-4.3p2-16.el5.src.rpm 2007/03/14 34 2007/04/12 345.1 openssh-4.3p2-24.el5.src.rpm 2007/11/07 38 2007/12/02 385.2 openssh-4.3p2-26.el5.src.rpm 2008/05/21 39 2008/06/24 395.3 openssh-4.3p2-29.el5.src.rpm 2009/01/20 45 2009/03/31 455.4 openssh-4.3p2-36.el5.src.rpm 2009/09/02 49 2009/10/21 495.5 openssh-4.3p2-41.el5.src.rpm 2010/03/30 51 2010/05/14 515.6 openssh-4.3p2-72.el5.src.rpm 2011/01/12 56 2011/04/08 565.7 openssh-4.3p2-72.el5_6.3.src.rpm 2011/07/21 57 2011/09/13 575.8 openssh-4.3p2-82.el5.src.rpm 2012/02/21 63 2012/03/07 635.9 openssh-4.3p2-82.el5.src.rpm 2013/01/08 63 2013/01/16 636.0 openssh-5.3p1-20.el6.src.rpm 2010/11/10 31 2010/07/09 316.1 openssh-5.3p1-52.el6.src.rpm 2011/05/19 42 2011/12/09 426.2 openssh-5.3p1-70.el6.src.rpm 2011/12/06 45 2011/12/20 456.3 openssh-5.3p1-81.el6.src.rpm 2012/06/20 51 2012/07/09 516.4 openssh-5.3p1-84.1.el6.src.rpm 2013/02/21 53 2013/03/09 5356 / 69
  57. 57. 5 にバックポートされてるもの● openssh-4.3p2-chroot.patch(5.4 〜 )● openssh-4.3p2-forced.patch(5.4 〜 )● openssh-4.3p2-biguid.patch(5.7 〜 )とかいろいろ57 / 69
  58. 58. 6 にバックポートされてるもの● openssh-5.3p1-sftp_umask.patch(6.1 〜 )● openssh-5.3p1-biguid.patch(6.1 〜 )● openssh-5.3p1-linux-oomkiller.patch(6.3 〜 )● openssh-5.3p1-netcat-mode.patch(6.4 〜 )とかいろいろ58 / 69
  59. 59. Out Of Memory killer● 起動時に oom_adj を -17 にセット (OpenSSH-5.4 以降 /* kernels <= 2.6.35 */)● 起動時に oom_score_adj を -1000 にセット(OpenSSH-5.7 以降 /* kernels >= 2.6.36 */)openssh-server/src> grep -r oom_score_adj *openssh-5.7p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */openssh-5.8p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */openssh-5.9p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */openssh-6.0p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */openssh-6.1p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */openssh-6.2p1/openbsd-compat/port-linux.c: {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */59 / 69
  60. 60. RHEL/CentOS では● RHEL6.3 でバックポートrpm/rhel/6.3/openssh-5.3p1-linux-oomkiller.patch:+ {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */...+ {"/proc/self/oom_adj", -17}, /* kernels <= 2.6.35 */...rpm/rhel/6.4/openssh-5.3p1-linux-oomkiller.patch:+ {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */…+ {"/proc/self/oom_adj", -17}, /* kernels <= 2.6.35 */...( openssh-5.3p1-81.el6.src.rpm 調べ)60 / 69
  61. 61. RedHat の独自パッチ?● openssh-5.3p1-ldap.patch(6.1 〜 )– openssh-ldap.x86_64 : A LDAP support for opensource SSH server daemon– 簡単なドキュメントと鍵検索用のプログラムとスキーマが付属● AuthorizedKeysCommand とAuthorizedKeysCommandRunAs で設定61 / 69
  62. 62. ユーザ権限で sshd を動かす● 制約事項– PAM が使えない– 1024 より小さいポート番号が使えない● 準備– 鍵とコンフィグはユーザ権限で読める場所に62 / 69
  63. 63. 楕円曲線暗号 (ECC)● OpenSSH-5.7 から楕円 DSA(ECDSA) をサポート– OpenSSL のライブラリに依存– RHEL6/CentOS6 標準の OpenSSL は今のところ非対応● 短い鍵長で今までと同じ強度– 負荷が下がる– RSA:3072bit ECC:256bit≒63 / 69
  64. 64. mosh っぽい何か● roaming.h(OpenSSH-6.2)– OpenSSH-5.3 の頃からあるvoid request_roaming(void);int get_snd_buf_size(void);int get_recv_buf_size(void);void add_recv_bytes(u_int64_t);int wait_for_roaming_reconnect(void);void roaming_reply(int, u_int32_t, void *);void set_out_buffer_size(size_t);ssize_t roaming_write(int, const void *, size_t, int *);ssize_t roaming_read(int, void *, size_t, int *);size_t roaming_atomicio(ssize_t (*)(int, void *, size_t), int, void *, size_t);u_int64_t get_recv_bytes(void);u_int64_t get_sent_bytes(void);void roam_set_bytes(u_int64_t, u_int64_t);void resend_bytes(int, u_int64_t *);void calculate_new_key(u_int64_t *, u_int64_t, u_int64_t);int resume_kex(void);64 / 69
  65. 65. 実装がなかった!● roaming_serv.c(OpenSSH-6.2)24 /*25 * Wait for the roaming client to reconnect. Returns 0 if a connect ocurred.26 */27 int28 wait_for_roaming_reconnect(void)29 {30 return 1;31 }65 / 69
  66. 66. 実装がなかった!● roaming_serv.c(OpenSSH-6.2)24 /*25 * Wait for the roaming client to reconnect. Returns 0 if a connect ocurred.26 */27 int28 wait_for_roaming_reconnect(void)29 {30 return 1;31 }66 / 69
  67. 67. まとめ● いろんな認証方式や暗号方式があるよ– ひとつに絞ると問題が見つかったときに全滅する● ユーザに便利に使ってもらう設定もあれば制限する設定もあるよ● 万能じゃないので過信するな67 / 69
  68. 68. 参考資料● OpenSSH.org– http://www.openssh.org/ja/● OpenSSH 日本語マニュアルページ– http://www.unixuser.org/~euske/doc/openssh/jman/● OpenSSH 情報– http://www.unixuser.org/~haruyama/security/openssh/● 入門 OpenSSH– http://www.unixuser.org/~euske/doc/openssh/book/index.html68 / 69
  69. 69. Connection closed69 / 69

×