SlideShare a Scribd company logo
SSH力を付けよう
HardeningZeroからの反省



      2012/05/29 #ssmjp @togakushi
                              1 / 62
もくじ
► おさらい
► クライアント(ssh/scp)の話
   ポート転送の話
   多段ssh
   その他の転送の話・他のオプション
► サーバ(sshd)の話
► ちょっとした疑問
► セキュリティの話
► まとめ

                      2 / 62
前提知識
► TCP/IPの基礎
► SSHでサーバにログインできる




                     3 / 62
おさらい



       4 / 62
RFC
RFC 4250   The Secure Shell (SSH) Protocol Assigned Numbers
RFC 4251   The Secure Shell (SSH) Protocol Architecture
RFC 4252   The Secure Shell (SSH) Authentication Protocol
RFC 4253   The Secure Shell (SSH) Transport Layer Protocol
RFC 4254   The Secure Shell (SSH) Connection Protocol
RFC 4255   Using DNS to Securely Publish Secure Shell (SSH) Key
           Fingerprints
RFC 4256   Generic Message Exchange Authentication for the Secure
           Shell Protocol (SSH)

RFC1928 : SOCKS Protocol Version 5



                                                                    5 / 62
RFC(続き)
RFC 4335   The Secure Shell (SSH) Session Channel Break Extension
RFC 4344   The Secure Shell (SSH) Transport Layer Encryption Modes
RFC 4345   Improved Arcfour Modes for the Secure Shell (SSH)
           Transport Layer Protocol
RFC 4419   Diffie-Hellman Group Exchange for the Secure Shell (SSH)
           Transport Layer Protocol
RFC 4432   RSA Key Exchange for the Secure Shell (SSH) Transport
           Layer Protocol
RFC 4462   Generic Security Service Application Program Interface
           (GSS-API) Authentication and Key Exchange for the Secure
           Shell (SSH) Protocol
RFC 4716   The Secure Shell (SSH) Public Key File Format
RFC 5656   Elliptic Curve Algorithm Integration in the Secure Shell
           Transport Layer
                                                                      6 / 62
認証方式
► 公開鍵認証
► パスワード認証
► ホストベース認証
► などなど
% ssh –v hoge
    :
debug1: Authentications that can continue: publickey,password
debug1:
debug1: Next authentication method: publickey
debug1:
    :

                                        他にもたくさん!
                                                          7 / 62
関連ファイル(クライアント)
► 設定ファイル
  ~/.ssh/config
  /etc/ssh/ssh_config
► ホスト公開鍵の保存ファイル
  ~/.ssh/known_hosts
  /etc/ssh/ssh_known_hosts
► ログイン後に実行するファイル
  ~/.ssh/rc
  /etc/ssh/sshrc
                             他にもたくさん!
                                   8 / 62
関連ファイル(サーバ)
► 設定ファイル
  /etc/ssh/sshd_config
► ログインユーザの公開鍵
  ~/.ssh/authorized_keys
► お知らせ
  /etc/motd
► メンテナンス用
  /etc/nologin (root以外のログインを拒否)
                           他にもたくさん!
                                  9 / 62
鍵の特徴
► 秘密鍵と公開鍵は1対1のペアからなる
► 秘密鍵からは公開鍵が生成できる
► 公開鍵から秘密鍵は生成(予測)できない
► 秘密鍵で暗号化したものは公開鍵でのみ復号
  できる
► 公開鍵で暗号化したものは秘密鍵でのみ復号
  できる
► フォーマットが3つある(RFC4716/PKCS8/PEM)

                              10 / 62
公開鍵で制限出来ること
► 実行するコマンドを強制(実行が終わったら即
  ログアウト)
► 各種オプションの強制上書き
  ssh-keygen –Oで指定できるのでマニュアル参照
  sshdのマニュアルの”AUTHORIZED_KEYS ファイ
  ルの形式”を参照




                                11 / 62
ssh



      12 / 62
ポートフォワーディングの種類
► ローカル
► リモート
► ダイナミック




                   13 / 62
ローカルポートフォワード
► クライアントからサーバに対してのトンネル
  -L [bind_address:]port:host:hostport


 別のホスト    作業端末                 サーバ       別のホスト

                         ssh    sshd      port
  アプリ       port

                                 port
                   アプリ




                                                 14 / 62
利用シーン
► リモートデスクトップしたい!!
    ssh –L 3389:windows:3389 ssh-gateway
    rdesktop localhost


              インター             踏み台
  作業端末                                     Windowsサーバ
               ネット          SSH-GATEWAY




                                          リモートデスクトップ
tsclient   TCP/3389   ssh        sshd
                                            (TCP/3389)
                                                    15 / 62
リモートポートフォワード
► サーバからクライアントに対してのトンネル
  -R [bind_address:]port:host:hostport


別のホスト      クライアント        サーバ             別のホスト

                   ssh    sshd   port
   port
                                           アプリ
            port          アプリ




                                                 16 / 62
利用シーン
► 無理やりログを転送したい!
  ssh –g –R 1512:syslog-server:512 ssh-gateway


                           踏み台        サーバ
                        SSH-GATEWAY
  サーバ        作業端末                     syslogd

                          TCP/1512
  syslogd      ssh
                                      サーバ

                           sshd       syslogd



                                                17 / 62
ゲートウェイポート
► フォワーディングの機能を使ってオープンした
  ポートに対しては「別のホスト」から接続できな
  い(デフォルトの動作)
► -g を付けると0.0.0.0でバインドして接続可能に
  なる
  リモートポートフォワードはサーバで許可する必要
  あり
   ►GatewayPorts=yes/clientspecified



                                       18 / 62
ダイナミックフォワード
► サーバをsocksのプロキシにする
  -D [bind_address:]port

別のホスト     クライアント              サーバ     別のホスト

                     Client    sshd    httpd
 ブラウザ       port

                                      別のホスト
                   ブラウザ                httpd



               ブラウザが指定したホスト

                                               19 / 62
エスケープキャラクタ
► エンター直後の「~」

   ~.   切断
  ~^Z   バックグランドにする
  ~&    バックグランドにする
        (通信がなくなるとログアウト)
   ~#   ポートフォワードの情報を表示
   ~~   ~
   ~C   コマンドラインを開く
   ~?   ヘルプ
                          20 / 62
~C
► ログインしたままポートフォワードの追加ができ
 る
     ローカル/リモート/ダイナミック
     ゲートウェイポートは指定できない(設定値に従う)
► リモートポートフォワードをキャンセルできる
     OpenSSH-6.0ですべてキャンセル可能になった
► クライアントでコマンドが実行できる
► 「help」って打ったらヘルプが出る

                                  21 / 62
TCP over TCP
► 遅い回線で使うと死ぬ
  TCPは再接続を行う
  タイムアウトが発生すると残念な結果に!




                        22 / 62
NetCatと絡める
► 標準入力を加工せずにそのままネットワークに
  流すプログラム
► telnetと違うの?
   サーバにもなれます
   右から左に受け流せます
► GNUとBSDでオプションが違うのでハマル




                          23 / 62
多段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
netcat mode
► OpenSSH-5.4で実装(-Wオプション)
   CentOS6は5.3ベース
   -W <転送先ホスト>:<転送先ポート> 経由ホスト
 ssh –oProxyCommand=‘ssh –W %h:%p <ssh-gateway>’ <target-
   host>


   踏み台がnetcat modeをサポートしてる必要なし
   踏み台にログインできる必要なし(認証のみ必要)



                                                        25 / 62
超多段
                        ユーザ名: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
どうする?がんばる?
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
~/.ssh/config
Host HOST-A                  Host HOST-C
  User login-a                 User login-c
  Port 12345                   IdentityFile KeyC
  IdentityFile KeyA            ProxyCommand ssh –
                               W %h:%p HOST-B
Host 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
内容

「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
一撃!!
                         ユーザ名: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
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
~/.ssh/configの活用
► 長くなりがちのコマンドラインを簡潔に
► 多段をすっきりかける
► デフォルトのオプションを好みに設定
► ssh/scpで利用




                          32 / 62
ssh-agent
► 秘密鍵を一時的に覚えさせることができる
► 複数の鍵の登録が可能
► パスフレーズはagentに登録するときだけ尋ねられる
► 接続時に適切な鍵を自動的に選択
► エージェントを使わせたいプロセスをエージェント配下
 に置く形で起動
  %   ssh-agent bash
  %   ssh-add .ssh/id_rsa

注意:引数なしでssh-agentを立ち上げるとバックグラウンドで実行されるだけ
 で何も起こらない(プロセスはkillしないと残り続ける)


                                     33 / 62
エージェント転送(鍵の転送)
► 秘密鍵は接続元の端末にないとダメ
► ssn-agentに鍵を登録した状態で-Aを指定して
 ログインし、ログイン先の/tmpから秘密鍵を読
 めるようにする
  UNIX domain socketsを利用(ファイルサイズゼロ)
► このファイルが読み込めると悪用できる




                                 34 / 62
X転送
► リモートのGUIアプリケーションをクライアントで
 表示
  クライアントがUnix/Linuxなら-X(-Y)を付けて実行
  Windowsの場合はXmingを併用
► ログイン後にリモートでアプリを起動させるだけ




                                35 / 62
簡易VPN
► -wでtun/tapをsshでトンネルできる
  OpenSSH-4.3で実装
  クライアントのrootユーザがサーバに対してrootと
  してログインできることが条件
  サーバ側で設定(許可)が必要
   ►PermitTunnel=yes/point-to-point/ethernet




                                               36 / 62
利用シーン
► インターネットに繋がってない環境のホストを
 アップデートする
              # 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
scp



      38 / 62
-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
sshd



       40 / 62
chroot
► OpenSSH-4.8で正式サポート
► 認証完了後に指定ディレクトリにchroot(8)する
► サブシステムにinternal-sftpが追加
  chroot後の環境に簡単にsftpを提供




                            41 / 62
sftponly
► シェルログインさせたくないなー
► sshd_configにこんな感じのものを追加してあ
 げる

      Match group sftponly
          ChrootDirectory /home/%u
          X11Forwarding no
          AllowTcpForwarding no
                           internal-
          ForceCommand internal-sftp

                                       42 / 62
ちょっとした疑問集



            43 / 62
sshの接続が遅い
► 認証が始まるまでが遅い→名前解決できてま
すか?
  /etc/hostsをちゃんと設定する
  UseDNSをnoにしてみる
► ログインが遅い→認証メソッドの見直しを
  GSSAPIAuthenticationを無効にしてみる
  クライアント側で認証メソッドの順番、選択が出来る
  ►-oPreferredAuthentications=publickey,password
  ►-oGSSAPIAuthentication=no


                                                   44 / 62
うまく繋がらない
► 保存してるホストの公開鍵が一致しない
       意図的に再生成した(再インストール)/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 is
XX: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
sshはちゃんと繋がるのに
        scpだけが失敗する
► シェルの初期化ファイル(.profile,   .*rcとか)が
 何か出力してると失敗する
  scpはファイルの受け渡しに標準入出力を利用して
  いる
► 接続先にもscpが必要(PATH通ってますか?)
► どーしても何か設定したい人
  scpのセッションはTERMがdumbなのでなんとかし
  て

                                 46 / 62
X転送がうまくいかない
► ただしく環境変数DISPLAYがセットされてます
  か?
► xorg-x11-xauthがインストールされてますか?




                            47 / 62
sshdを再起動したら
       セッション切れますか?
► 切れません

                    最初に起動するデーモン(再起動対象)
                   ※落ちても通信中のセッションは切れない
 pstree(抜粋)
 pstree(抜粋)
  ├─sshd,682
  ├─sshd,682
                          セッション管理用(落ちると切れる)
       └─sshd,2728
  │ └─sshd,2728
  │      └─sshd,2869
         └─sshd,2869
  │          └─zsh,2870
             └─zsh,2870

            通信してるプロセス(特権分離によりユーザ権限で実行)


                                         48 / 62
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
接続元別に認証方式を変えたい
► ローカルから繋いだときはパスワード認証で、
インターネット経由のときは公開鍵認証にした
い
  Macthディレクティブで接続条件に応じて設定を上
  書きできる(OpenSSH-4.4で実装)
  ►Macthが使えない環境(CentOS5とか)はポートを変えて
   sshdを2つあげる
  PasswordAuthentication no
          :
  Match 192.168.1.*
       PasswordAuthentication yes
                                    50 / 62
セキュリティの話



           51 / 62
sshにまつわる脆弱性
► どんなにがんばっても65536種類の鍵しか生成
 されない!!
  Debian3.2~3.9までに適応されていたOpenSSLの
  パッチのバグ(2008.05)
  英数字(大小)3文字のパスワードのパターンより少
  ない
► 65536種類(×暗号化の種類・強度)の鍵はブ
 ラックリストとして登録
  基本的に接続拒否

                               52 / 62
sshにまつわる攻撃
► MITM攻撃
  鍵のフィンガープリント見てますか?
  あなたがログインしようとしているホストは本物です
  か?

     Client       第三者            Server

              ドメインの詐称やarp poisoningなどによるなりすまし


► パスワード認証に対しての総当り攻撃


                                            53 / 62
SSH_AUTH_SOCKの横取り
► 「ssh
    –Aは危ないから気を付けな」って先輩に
  習いましたよね?
► 信用できないホストを踏み台にてエージェント
  転送してたらどうなるか




                        54 / 62
known_hostsのハッシュ化
► 接続済みサーバの公開鍵を保存するファイル
    ホスト名、IPアドレスが書いてある
    このホストから次に接続したホストの一覧
► ssh-keygen –H –f ~/.ssh/known_hosts
   OpenSSH-4.0で実装
   HashKnownHosts=yesでハッシュ化してから追加
                      ハッシュ化してから追加
   ホストを探すときは「-F ホスト名[:ポート]」
   ホストを すときは「 ホスト名
   削除するときは「-R ホスト名[:ポート] 」
   削除するときは
       するときは「 ホスト名


                                        55 / 62
まとめ



      56 / 62
バージョンに注意
► よく新しい機能(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
自前でコンパイルするなら
► コンパイルオプションに注意
   ○○をサポートする/しないが大量に選べる
 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
運用方法の再考
► sshが保護してくれるのは通信経路だけ!
  アカウント/パスワード/鍵の運用方法を間違うとす
  べてが台無しに
► FWの意味がなくなる!
  TCP/22(ssh)以外拒否してるから安心なの?
  ネットワークの利用規約はよく読んで
► 踏み台を運用している人は設定の見直しを!
  その設定は本当に必要ですか?
  デフォルト値は把握しておくべき

                              59 / 62
ユーザの声




        60 / 62
参考資料
► man  ssh
► man ssh_config
► man ssh-keygen
► http://www.openssh.org/




                            61 / 62
exit

       62 / 62

More Related Content

SSH力をつけよう