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.

SSH力をつけよう

84,661 views

Published on

Published in: Technology

SSH力をつけよう

  1. 1. SSH力を付けようHardeningZeroからの反省 2012/05/29 #ssmjp @togakushi 1 / 62
  2. 2. もくじ► おさらい► クライアント(ssh/scp)の話 ポート転送の話 多段ssh その他の転送の話・他のオプション► サーバ(sshd)の話► ちょっとした疑問► セキュリティの話► まとめ 2 / 62
  3. 3. 前提知識► TCP/IPの基礎► SSHでサーバにログインできる 3 / 62
  4. 4. おさらい 4 / 62
  5. 5. RFCRFC 4250 The Secure Shell (SSH) Protocol Assigned NumbersRFC 4251 The Secure Shell (SSH) Protocol ArchitectureRFC 4252 The Secure Shell (SSH) Authentication ProtocolRFC 4253 The Secure Shell (SSH) Transport Layer ProtocolRFC 4254 The Secure Shell (SSH) Connection ProtocolRFC 4255 Using DNS to Securely Publish Secure Shell (SSH) Key FingerprintsRFC 4256 Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)RFC1928 : SOCKS Protocol Version 5 5 / 62
  6. 6. RFC(続き)RFC 4335 The Secure Shell (SSH) Session Channel Break ExtensionRFC 4344 The Secure Shell (SSH) Transport Layer Encryption ModesRFC 4345 Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer ProtocolRFC 4419 Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer ProtocolRFC 4432 RSA Key Exchange for the Secure Shell (SSH) Transport Layer ProtocolRFC 4462 Generic Security Service Application Program Interface (GSS-API) Authentication and Key Exchange for the Secure Shell (SSH) ProtocolRFC 4716 The Secure Shell (SSH) Public Key File FormatRFC 5656 Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer 6 / 62
  7. 7. 認証方式► 公開鍵認証► パスワード認証► ホストベース認証► などなど% ssh –v hoge :debug1: Authentications that can continue: publickey,passworddebug1:debug1: Next authentication method: publickeydebug1: : 他にもたくさん! 7 / 62
  8. 8. 関連ファイル(クライアント)► 設定ファイル ~/.ssh/config /etc/ssh/ssh_config► ホスト公開鍵の保存ファイル ~/.ssh/known_hosts /etc/ssh/ssh_known_hosts► ログイン後に実行するファイル ~/.ssh/rc /etc/ssh/sshrc 他にもたくさん! 8 / 62
  9. 9. 関連ファイル(サーバ)► 設定ファイル /etc/ssh/sshd_config► ログインユーザの公開鍵 ~/.ssh/authorized_keys► お知らせ /etc/motd► メンテナンス用 /etc/nologin (root以外のログインを拒否) 他にもたくさん! 9 / 62
  10. 10. 鍵の特徴► 秘密鍵と公開鍵は1対1のペアからなる► 秘密鍵からは公開鍵が生成できる► 公開鍵から秘密鍵は生成(予測)できない► 秘密鍵で暗号化したものは公開鍵でのみ復号 できる► 公開鍵で暗号化したものは秘密鍵でのみ復号 できる► フォーマットが3つある(RFC4716/PKCS8/PEM) 10 / 62
  11. 11. 公開鍵で制限出来ること► 実行するコマンドを強制(実行が終わったら即 ログアウト)► 各種オプションの強制上書き ssh-keygen –Oで指定できるのでマニュアル参照 sshdのマニュアルの”AUTHORIZED_KEYS ファイ ルの形式”を参照 11 / 62
  12. 12. ssh 12 / 62
  13. 13. ポートフォワーディングの種類► ローカル► リモート► ダイナミック 13 / 62
  14. 14. ローカルポートフォワード► クライアントからサーバに対してのトンネル -L [bind_address:]port:host:hostport 別のホスト 作業端末 サーバ 別のホスト ssh sshd port アプリ port port アプリ 14 / 62
  15. 15. 利用シーン► リモートデスクトップしたい!! ssh –L 3389:windows:3389 ssh-gateway rdesktop localhost インター 踏み台 作業端末 Windowsサーバ ネット SSH-GATEWAY リモートデスクトップtsclient TCP/3389 ssh sshd (TCP/3389) 15 / 62
  16. 16. リモートポートフォワード► サーバからクライアントに対してのトンネル -R [bind_address:]port:host:hostport別のホスト クライアント サーバ 別のホスト ssh sshd port port アプリ port アプリ 16 / 62
  17. 17. 利用シーン► 無理やりログを転送したい! ssh –g –R 1512:syslog-server:512 ssh-gateway 踏み台 サーバ SSH-GATEWAY サーバ 作業端末 syslogd TCP/1512 syslogd ssh サーバ sshd syslogd 17 / 62
  18. 18. ゲートウェイポート► フォワーディングの機能を使ってオープンした ポートに対しては「別のホスト」から接続できな い(デフォルトの動作)► -g を付けると0.0.0.0でバインドして接続可能に なる リモートポートフォワードはサーバで許可する必要 あり ►GatewayPorts=yes/clientspecified 18 / 62
  19. 19. ダイナミックフォワード► サーバをsocksのプロキシにする -D [bind_address:]port別のホスト クライアント サーバ 別のホスト Client sshd httpd ブラウザ port 別のホスト ブラウザ httpd ブラウザが指定したホスト 19 / 62
  20. 20. エスケープキャラクタ► エンター直後の「~」 ~. 切断 ~^Z バックグランドにする ~& バックグランドにする (通信がなくなるとログアウト) ~# ポートフォワードの情報を表示 ~~ ~ ~C コマンドラインを開く ~? ヘルプ 20 / 62
  21. 21. ~C► ログインしたままポートフォワードの追加ができ る ローカル/リモート/ダイナミック ゲートウェイポートは指定できない(設定値に従う)► リモートポートフォワードをキャンセルできる OpenSSH-6.0ですべてキャンセル可能になった► クライアントでコマンドが実行できる► 「help」って打ったらヘルプが出る 21 / 62
  22. 22. TCP over TCP► 遅い回線で使うと死ぬ TCPは再接続を行う タイムアウトが発生すると残念な結果に! 22 / 62
  23. 23. NetCatと絡める► 標準入力を加工せずにそのままネットワークに 流すプログラム► telnetと違うの? サーバにもなれます 右から左に受け流せます► GNUとBSDでオプションが違うのでハマル 23 / 62
  24. 24. 多段ssh► ダイナミックポートフォワード経由 ncでプロキシを指定してトンネル クライアントにncが必要 ssh –D 1080 <ssh-gateway> ssh –oProxyCommand=‘nc –x localhost:1080’ <target-host>► 踏み台からncを実行して繋ぐ 踏み台にncが必要 ssh –oProxyCommand=‘ssh <ssh-gateway> nc %h %p’ <target- host> 24 / 62
  25. 25. netcat mode► OpenSSH-5.4で実装(-Wオプション) CentOS6は5.3ベース -W <転送先ホスト>:<転送先ポート> 経由ホスト ssh –oProxyCommand=‘ssh –W %h:%p <ssh-gateway>’ <target- host> 踏み台がnetcat modeをサポートしてる必要なし 踏み台にログインできる必要なし(認証のみ必要) 25 / 62
  26. 26. 超多段 ユーザ名:login-a ポート:12345クライアント HOST-A 公開鍵:KeyA秘密鍵は HOST-A HOST-B ユーザ名:login-d全部ココ! ポート:60022 公開鍵:KeyD ユーザ名:login-b HOST-B HOST-C ポート:10022 公開鍵:KeyB ユーザ名:login-c HOST-C HOST-D ポート:22 公開鍵:KeyC 26 / 62
  27. 27. どうする?がんばる?ssh –oProxyCommand=’ssh – oProxyCommand=¥’ssh – oProxyCommand=¥¥¥’………¥¥¥’ ……… –W %h:%p –i KeyA login-a@HOST-A’ -i KeyD login-d@HOST-D► 四段ProxyCommandを重ねればOK► ポートやログイン名、鍵の指定を忘れずに ポートやログイン名 指定を► クォートのエスケープが必要 27 / 62
  28. 28. ~/.ssh/configHost HOST-A Host HOST-C User login-a User login-c Port 12345 IdentityFile KeyC IdentityFile KeyA ProxyCommand ssh – W %h:%p HOST-BHost HOST-B User login-b Host HOST-D Port 10022 User login-d IdentityFile KeyB Port 60022 ProxyCommand ssh – IdentityFile KeyD W %h:%p HOST-A ProxyCommand ssh – W %h:%p HOST-C 28 / 62
  29. 29. 内容「Host HOST-A」で定義クライアント HOST-A 「Host HOST-B」で定義 HOST-A HOST-B 「Host HOST-C」で定義HOST-B HOST-C 「Host HOST-D」で定義 HOST-C HOST-D 29 / 62
  30. 30. 一撃!! ユーザ名:login-a ポート:12345クライアント HOST-A 公開鍵:KeyA秘密鍵は HOST-A ssh HOST-B HO ユーザ名:login-d全部ココ! ST -D ポート:60022 公開鍵:KeyD ユーザ名:login-b HOST-B HOST-C ポート:10022 公開鍵:KeyB ユーザ名:login-c HOST-C HOST-D ポート:22 公開鍵:KeyC 30 / 62
  31. 31. scpも!! ユーザ名:login-a ポート:12345クライアント HOST-A 公開鍵:KeyA HOST-A秘密鍵は scp HOST-B ユーザ名:login-d全部ココ! HO ST ポート:60022 -D 公開鍵:KeyD :fil HOST-C ユーザ名:login-b HOST-B e. ポート:10022 公開鍵:KeyB ユーザ名:login-c HOST-C HOST-D ポート:22 公開鍵:KeyC 31 / 62
  32. 32. ~/.ssh/configの活用► 長くなりがちのコマンドラインを簡潔に► 多段をすっきりかける► デフォルトのオプションを好みに設定► ssh/scpで利用 32 / 62
  33. 33. ssh-agent► 秘密鍵を一時的に覚えさせることができる► 複数の鍵の登録が可能► パスフレーズはagentに登録するときだけ尋ねられる► 接続時に適切な鍵を自動的に選択► エージェントを使わせたいプロセスをエージェント配下 に置く形で起動 % ssh-agent bash % ssh-add .ssh/id_rsa注意:引数なしでssh-agentを立ち上げるとバックグラウンドで実行されるだけ で何も起こらない(プロセスはkillしないと残り続ける) 33 / 62
  34. 34. エージェント転送(鍵の転送)► 秘密鍵は接続元の端末にないとダメ► ssn-agentに鍵を登録した状態で-Aを指定して ログインし、ログイン先の/tmpから秘密鍵を読 めるようにする UNIX domain socketsを利用(ファイルサイズゼロ)► このファイルが読み込めると悪用できる 34 / 62
  35. 35. X転送► リモートのGUIアプリケーションをクライアントで 表示 クライアントがUnix/Linuxなら-X(-Y)を付けて実行 Windowsの場合はXmingを併用► ログイン後にリモートでアプリを起動させるだけ 35 / 62
  36. 36. 簡易VPN► -wでtun/tapをsshでトンネルできる OpenSSH-4.3で実装 クライアントのrootユーザがサーバに対してrootと してログインできることが条件 サーバ側で設定(許可)が必要 ►PermitTunnel=yes/point-to-point/ethernet 36 / 62
  37. 37. 利用シーン► インターネットに繋がってない環境のホストを アップデートする # ifconfig tap0 192.168.254.2 /proc/sys/net/ipv4/ip_forward # echo 1 > /proc/sys/net/ipv4/ip_forward インター # iptables –t nat -A POSTROUTING –o tap0 –j MASQUERADE ネット DefaultGW=192.168.254.1 DefaultGW=192.168.254.1 yum update したい! したい! 作業端末 踏み台 HOST-A oTunnel= ssh-# ssh –w0:0 –oTunnel=ethernet ssh-gateway DefaultGW= DefaultGW=踏み台のeth0# ifconfig tap0 192.168.254.1 Nameserver=作業端末から Nameserver=作業端末から見 から見# echo 1 > /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/ip_forward えるDNS えるDNS 37 / 62
  38. 38. scp 38 / 62
  39. 39. -3► OpenSSH-5.7で実装 HOST-A HOST-B HOST-A HOST-B file file file file 作業端末 作業端末% scp HOST-A:file HOST-B: % scp -3 HOST-A:file HOST-B:HOST-AからHOST-Bに接続する鍵交換はしてくれないので事前に済ませておく 39 / 62
  40. 40. sshd 40 / 62
  41. 41. chroot► OpenSSH-4.8で正式サポート► 認証完了後に指定ディレクトリにchroot(8)する► サブシステムにinternal-sftpが追加 chroot後の環境に簡単にsftpを提供 41 / 62
  42. 42. sftponly► シェルログインさせたくないなー► sshd_configにこんな感じのものを追加してあ げる Match group sftponly ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no internal- ForceCommand internal-sftp 42 / 62
  43. 43. ちょっとした疑問集 43 / 62
  44. 44. sshの接続が遅い► 認証が始まるまでが遅い→名前解決できてますか? /etc/hostsをちゃんと設定する UseDNSをnoにしてみる► ログインが遅い→認証メソッドの見直しを GSSAPIAuthenticationを無効にしてみる クライアント側で認証メソッドの順番、選択が出来る ►-oPreferredAuthentications=publickey,password ►-oGSSAPIAuthentication=no 44 / 62
  45. 45. うまく繋がらない► 保存してるホストの公開鍵が一致しない 意図的に再生成した(再インストール)/IPアドレスが 変わった/乗っ取られた@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that a host key has just been changed.The fingerprint for the RSA key sent by the remote host isXX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.Please contact your system administrator.Add correct host key in /home/username/.ssh/known_hosts to get rid of this message.Offending RSA key in /home/username/.ssh/known_hosts:20 remove with: ssh-keygen -f "/home/username/.ssh/known_hosts" -R XXXXXXXX 45 / 62
  46. 46. sshはちゃんと繋がるのに scpだけが失敗する► シェルの初期化ファイル(.profile, .*rcとか)が 何か出力してると失敗する scpはファイルの受け渡しに標準入出力を利用して いる► 接続先にもscpが必要(PATH通ってますか?)► どーしても何か設定したい人 scpのセッションはTERMがdumbなのでなんとかし て 46 / 62
  47. 47. X転送がうまくいかない► ただしく環境変数DISPLAYがセットされてます か?► xorg-x11-xauthがインストールされてますか? 47 / 62
  48. 48. sshdを再起動したら セッション切れますか?► 切れません 最初に起動するデーモン(再起動対象) ※落ちても通信中のセッションは切れない pstree(抜粋) pstree(抜粋) ├─sshd,682 ├─sshd,682 セッション管理用(落ちると切れる) └─sshd,2728 │ └─sshd,2728 │ └─sshd,2869 └─sshd,2869 │ └─zsh,2870 └─zsh,2870 通信してるプロセス(特権分離によりユーザ権限で実行) 48 / 62
  49. 49. sshd_configを編集したんだけど、 内容が正しいか検証したい► ポートを変えて新しく作った設定ファイルを指定して新しくデーモンを起動させてテストする new_sshd_config# /usr/sbin/sshd -f new_sshd_config -p 10022 –D•コマンドラインのオプションは設定ファイルより優先される コマンドラインのオプションは設定ファイルより優先される コマンドライン ファイルより優先•-Dでデーモンとして起動させない(Ctrl+Cで止めれる) - デーモンとして起動させない Ctrl+Cで めれる) として起動させない(•必要に応じてデバッグオプション(-d~-ddd)を付ける 必要に じてデバッグオプション 必要 デバッグオプション( ddd)•秘密鍵は読める場所に準備する 秘密鍵は める場所 準備する 秘密鍵 場所に 49 / 62
  50. 50. 接続元別に認証方式を変えたい► ローカルから繋いだときはパスワード認証で、インターネット経由のときは公開鍵認証にしたい Macthディレクティブで接続条件に応じて設定を上 書きできる(OpenSSH-4.4で実装) ►Macthが使えない環境(CentOS5とか)はポートを変えて sshdを2つあげる PasswordAuthentication no : Match 192.168.1.* PasswordAuthentication yes 50 / 62
  51. 51. セキュリティの話 51 / 62
  52. 52. sshにまつわる脆弱性► どんなにがんばっても65536種類の鍵しか生成 されない!! Debian3.2~3.9までに適応されていたOpenSSLの パッチのバグ(2008.05) 英数字(大小)3文字のパスワードのパターンより少 ない► 65536種類(×暗号化の種類・強度)の鍵はブ ラックリストとして登録 基本的に接続拒否 52 / 62
  53. 53. sshにまつわる攻撃► MITM攻撃 鍵のフィンガープリント見てますか? あなたがログインしようとしているホストは本物です か? Client 第三者 Server ドメインの詐称やarp poisoningなどによるなりすまし► パスワード認証に対しての総当り攻撃 53 / 62
  54. 54. SSH_AUTH_SOCKの横取り► 「ssh –Aは危ないから気を付けな」って先輩に 習いましたよね?► 信用できないホストを踏み台にてエージェント 転送してたらどうなるか 54 / 62
  55. 55. known_hostsのハッシュ化► 接続済みサーバの公開鍵を保存するファイル ホスト名、IPアドレスが書いてある このホストから次に接続したホストの一覧► ssh-keygen –H –f ~/.ssh/known_hosts OpenSSH-4.0で実装 HashKnownHosts=yesでハッシュ化してから追加 ハッシュ化してから追加 ホストを探すときは「-F ホスト名[:ポート]」 ホストを すときは「 ホスト名 削除するときは「-R ホスト名[:ポート] 」 削除するときは するときは「 ホスト名 55 / 62
  56. 56. まとめ 56 / 62
  57. 57. バージョンに注意► よく新しい機能(Features)が追加されるのでリ リースノートは読むべし► 使う環境によって使えないオプションがある CentOS5 → OpenSSH-4.3 CentOS6 → OpenSSH-5.3 Fedora16 → OpenSSH-5.8 MacOS → OpenSSH-5.6 Ubuntu12.04 → OpenSSH-5.9► ssh –Vで確認 57 / 62
  58. 58. 自前でコンパイルするなら► コンパイルオプションに注意 ○○をサポートする/しないが大量に選べる OpenSSH has been configured with the following options: PAM support: no OSF SIA support: no KerberosV support: no SELinux support: no Smartcard support: S/KEY support: no TCP Wrappers support: no MD5 password support: no libedit support: no Solaris process contract support: no Solaris project support: no BSD Auth support: no 58 / 62
  59. 59. 運用方法の再考► sshが保護してくれるのは通信経路だけ! アカウント/パスワード/鍵の運用方法を間違うとす べてが台無しに► FWの意味がなくなる! TCP/22(ssh)以外拒否してるから安心なの? ネットワークの利用規約はよく読んで► 踏み台を運用している人は設定の見直しを! その設定は本当に必要ですか? デフォルト値は把握しておくべき 59 / 62
  60. 60. ユーザの声 60 / 62
  61. 61. 参考資料► man ssh► man ssh_config► man ssh-keygen► http://www.openssh.org/ 61 / 62
  62. 62. exit 62 / 62

×