More Related Content
More from (^-^) togakushi
More from (^-^) togakushi (10)
sshdのお話
- 3. はじめに
● 特に記述がない限り、全てプロトコル 2 が対
象
– OpenSSH-5.4 からプロトコル 1 はデフォルトで無
効
● 動作確認は Linux のみ( OpenSSH の移植
版)
● 暗号化とか認証とか詳しくないので、間違っ
てたら教えて欲しい!!
3 / 69
- 4. OpenSSH リリース状況
バージョン リリース日 バージョン リリース日
OpenSSH-4.1p1 2005/05/26 OpenSSH-5.2p1 2009/02/02
OpenSSH-4.2p1 2005/09/01 OpenSSH-5.3p1 2009/10/01
OpenSSH-4.3p2 2006/02/11 OpenSSH-5.4p1 2010/03/08
OpenSSH-4.4p1 2006/09/27 OpenSSH-5.5p1 2010/04/16
OpenSSH-4.5p1 2006/11/07 OpenSSH-5.6p1 2010/08/23
OpenSSH-4.6p1 2007/03/08 OpenSSH-5.7p1 2011/01/24
OpenSSH-4.7p1 2007/09/05 OpenSSH-5.8p2 2011/05/03
OpenSSH-4.8p1 ない OpenSSH-5.9p1 2011/09/06
OpenSSH-4.9p1 2008/03/31 OpenSSH-6.0p1 2012/04/22
OpenSSH-5.0p1 2008/04/03 OpenSSH-6.1p1 2012/08/29
OpenSSH-5.1p1 2008/07/21 OpenSSH-6.2p1 2013/03/22
4 / 69
- 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_353zyLz
5 / 69
- 10. パターン
● IP アドレスやドメインの一部を指定
– 0 個以上の非空白文字: *
– 1 個の非空白文字: ?
– 除外: !
– カンマで連結可能
● 例
– 192.168.1.? → 192.168.1.1 〜 9
– *.co.jp → 任意の .co.jp ドメイン
10 / 69
- 13. 最小構成コンフィグ
● 動作に必要な要件を満たせば OK
– 特権分離で使用するユーザ (sshd)
● このユーザは「 /var/empty 」に書き込みができる必要
がある
– サーバの秘密鍵 (1 種類以上、デフォルトは
/etc/ssh/ssh_host_{dsa,rsa,ecdsa}_key
と /etc/ssh/ssh_host_key)
# sshd_config
UsePrivilegeSeparation no
HostKey /path/to/key
13 / 69
- 14. 使いドコロ
● 動作確認など
– 役に立ちそうな sshd のコマンドラインオプショ
ン
オプション 説明
-d( 最大 3 つ ) デバッグモード
1 回の接続のみで終了する
-f 設定ファイルを指定
-t テストモード
設定の構文エラーのみチェックして終了する
-D デーモン化しない ( フォアグランドで動かす )
-e エラーを syslog ではなく、標準エラー出力に出す
-T 拡張テストモード
適応される全設定項目を表示して終了する
14 / 69
- 17. Too many authentication failures の回避
● エラーになる原因がわかっていれば回避でき
るかも?
● クライアント側で使用する認証メソッド指定
して接続
– ssh -oPreferredAuthentications=password, ...
17 / 69
- 21. 使いドコロ
● 公開鍵を LDAP や DB に探しに行く
– AuthorizedKeysCommand で見つからない場合は
AuthorizedKeysFile を探す
– ローカルファイルシステムの公開鍵を無視したい
場合は「 AuthorizedKeysFile none 」を指定
21 / 69
- 26. 使いドコロ
● 簡易 VPN を使うときに root でログインする必
要があるので、 PermitRootLogin や Match と
組み合わせてインターフェースの設定だけす
る
● Internal-sftp を指定して sftp しかできないよう
にする
– Match や ChrootDirectory と組み合わせると最強
26 / 69
- 29. 使いドコロ (2)
● sftp しかできないユーザを作る
– 「 sftponly 」グループに属するユーザは sftp 以外
のセッションが開始できない
Subsystem sftp internal-sftp
Match Group sftponly
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
29 / 69
- 32. 最低限必要なもの
● プログラムが使うライブラリは ldd で調べる
– 認証は chroot 前に済まされる ( 使用するログイン
シェルは chroot 前に決定する )
# find /opt/chroot -printf '%M %u %g %pn'
drwxr-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.6
drwxr-xr-x root root /opt/chroot/bin
-rwxr-xr-x root root /opt/chroot/bin/bash
drwxr-xr-x root root /opt/chroot/dev
crw-rw-rw- root root /opt/chroot/dev/tty
crw-rw-rw- root root /opt/chroot/dev/null
cr--r--r-- root root /opt/chroot/dev/urandom
32 / 69
- 33. 使いドコロ (2)
● sftponly ユーザをさらに制限する
● chroot 環境にはユーザが使うディレクトリだ
け用意する
Subsystem sftp internal-sftp
Match Group sftponly
ChrootDirectory /sftp-top
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
33 / 69
- 36. PermitOpen
● TCP ポートフォワードで利用できるポートを
制限 (OpenSSH-4.4 で追加 )
– any :すべてのポートで許可
– none :すべてのポートで拒否
– 複数指定するときは空白で区切る
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
36 / 69
- 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,arcfour
38 / 69
- 39. 使いドコロ
● 脆弱性の見つかった暗号プロトコルを外す
● cbc plaintext disclosure
– 2 の -14 ~ -18 乗の確率で 14 ~ 32bit の平文を回
復できる可能性
– 「 CPNI-957037 」( SSH 通信において一部デー
タが漏洩する可能性)
● OpenSSH-5.2 から CBC の優先順位が下げら
れた
39 / 69
- 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. 設定方法 (2/3)
● 署名された鍵をユーザへ
– id_rsa-cert.pub が生成される
● ユーザはペアの秘密鍵でアクセス
– ssh -i id_rsa remotehost
– 末尾に -cert.pub の付いている証明書が利用されるので
秘密鍵と同じディレクトリに配置
– OpenSSH-5.4 以降の ssh の動作
– ssh-agent で秘密鍵を登録する時に証明書も同時に登録
される
49 / 69
- 50. 設定方法 (3/3)
● 公開鍵の失効リスト
– 廃止された公開鍵のリスト
– 登録された公開鍵を使用した認証は失敗する
– ssh-keygen -k filename < 鍵 >
– RevokedKeys で設定
– 一度登録したら取り消せない
– 公開鍵が手元になくてもフィンガープリントや証
明書のシリアルで登録可能
50 / 69
- 51. 証明書の中身
% ssh-keygen -L -f id_rsa-cert.pub
id_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: 0
Valid: from 2013-04-22T00:44:00 to 2014-04-22T00:45:11
Principals: (none)
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
51 / 69
- 52. MaxStartups
● 認証を受け付ける sshd の数を 3 つのパラメー
タで指定
– < 起動数 > : < 切断確率 > : < 最大起動数 >
– 起動数を超える接続は、 2 つ目のパラメータで指
定した確率で失敗し、最大で 3 つ目のパラメータ
まで増え、それ以降は必ず接続に失敗する。
– デフォルト値: 10:100:10 (OpenSSH-6.1 まで )
– : 10:30:100 (OpenSSH-6.2 から )
52 / 69
- 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 34
5.1 openssh-4.3p2-24.el5.src.rpm 2007/11/07 38 2007/12/02 38
5.2 openssh-4.3p2-26.el5.src.rpm 2008/05/21 39 2008/06/24 39
5.3 openssh-4.3p2-29.el5.src.rpm 2009/01/20 45 2009/03/31 45
5.4 openssh-4.3p2-36.el5.src.rpm 2009/09/02 49 2009/10/21 49
5.5 openssh-4.3p2-41.el5.src.rpm 2010/03/30 51 2010/05/14 51
5.6 openssh-4.3p2-72.el5.src.rpm 2011/01/12 56 2011/04/08 56
5.7 openssh-4.3p2-72.el5_6.3.src.rpm 2011/07/21 57 2011/09/13 57
5.8 openssh-4.3p2-82.el5.src.rpm 2012/02/21 63 2012/03/07 63
5.9 openssh-4.3p2-82.el5.src.rpm 2013/01/08 63 2013/01/16 63
6.0 openssh-5.3p1-20.el6.src.rpm 2010/11/10 31 2010/07/09 31
6.1 openssh-5.3p1-52.el6.src.rpm 2011/05/19 42 2011/12/09 42
6.2 openssh-5.3p1-70.el6.src.rpm 2011/12/06 45 2011/12/20 45
6.3 openssh-5.3p1-81.el6.src.rpm 2012/06/20 51 2012/07/09 51
6.4 openssh-5.3p1-84.1.el6.src.rpm 2013/02/21 53 2013/03/09 53
56 / 69
- 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. 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
- 62. ユーザ権限で sshd を動かす
● 制約事項
– PAM が使えない
– 1024 より小さいポート番号が使えない
● 準備
– 鍵とコンフィグはユーザ権限で読める場所に
62 / 69
- 63. 楕円曲線暗号 (ECC)
● OpenSSH-5.7 から楕円 DSA(ECDSA) をサポ
ート
– OpenSSL のライブラリに依存
– RHEL6/CentOS6 標準の OpenSSL は今のところ
非対応
● 短い鍵長で今までと同じ強度
– 負荷が下がる
– RSA:3072bit ECC:256bit≒
63 / 69
- 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
- 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.html
68 / 69