勉強日記

チラ裏

LPIC あずき本v5.0 ch12 セキュリティ 12.3-12.4

www.shoeisha.co.jp


OpenSSH

  • SSH: Secure Shell
    • 高いセキュリティでリモートホスト間通信
    • できること
      • ファイル転送
      • リモート操作
    • セキュリティ
      • 認証機能
      • 暗号化
    • cf. telnet
      • 通信内容は平文
      • 盗聴されると認証情報漏れる
  • バージョン1系と2系がある
    • 互換はない
v1 v2
公開鍵暗号方式 RSA1 DSA,RSA
  • OpenSSH
    • OpenBSDグループによるSSHの実装
    • Linuxで一般的に利用される
    • SSH v1系、v2系両対応

SSHのインストールの設定

  • パッケージ
client server
Ubuntu, Debian openssh-client openssh-server
Ret Hat系 openssh, openssh-client openssh-server
  • 手元のUbuntuでは、openssh-clientはプリインストールされていた
sudo apt install -y openssh-server
  • インストールするとホストの公開鍵と秘密鍵が作成される
ls -l /etc/ssh
-rw-r--r--   1 root           root     553122 2017-09-01  2017 moduli
-rw-r--r--   1 root           root       1580 2019-01-31 22:58 ssh_config
-rw-------   1 root           root        227 2019-04-16 18:27 ssh_host_ecdsa_key
-rw-r--r--   1 root           root        186 2019-04-16 18:27 ssh_host_ecdsa_key.pub
-rw-------   1 root           root        419 2019-04-16 18:27 ssh_host_ed25519_key
-rw-r--r--   1 root           root        106 2019-04-16 18:27 ssh_host_ed25519_key.pub
-rw-------   1 root           root       1679 2019-04-16 18:27 ssh_host_rsa_key
-rw-r--r--   1 root           root        406 2019-04-16 18:27 ssh_host_rsa_key.pub
-rw-r--r--   1 root           root        338 2019-04-16 18:27 ssh_import_id
-rw-r--r--   1 root           root       3264 2019-03-04 21:17 sshd_config
ファイル名 説明
ssh_host_key v1
ssh_host_dsa_key v2, DSA用
ssh_host_rsa_key v2, RSA
ssh_host_ecdsa_key v2, ECDSA用
ssh_host_ed25519_key v2, ED25519用
  • *.pubは公開鍵
  • 25519は2^255 - 19の意(素数)
  • sshdデーモン
  • /etc/sshd_config
#    $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp    /usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#   X11Forwarding no
#   AllowTcpForwarding no
#   PermitTTY no
#   ForceCommand cvs server
  • 主要な設定項目・設定例
    • Port 22
      • SSHで使うポート番号(デフォルト22)
    • Protocol 2
      • SSHのバージョン(1|2)
      • 2使え(セキュリティ上)
    • HostKey /etc/ssh/ssh_host_rsa_key
    • HostKey /etc/ssh/ssh_host_ecdsa_key
    • HostKey /etc/ssh/ssh_host_ed25519_key
    • PermitRootLogin prohibit-password
      • rootでもログインを許可するかどうか
      • 許可しないほうがよい(教科書的にはno推奨)
    • RSAAuthentication yes
      • SSHバージョン1での公開鍵認証を使用するかどうか
    • PubkeyAuthentication yes
      • SSHバージョン2での公開鍵認証を使用するかどうか
    • AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
      • 公開鍵が格納されるファイル名
    • PermitEmptyPasswords no
      • 空のパスワードを許可するかどうか
    • PasswordAuthentication yes
      • パスワード認証を許可するかどうか
    • 11Forwarding yes
  • SSHサーバ起動
    • SysVinit
      • Red Hat
        • /etc/init.d/sshd start
      • Debian
        • /etc/init.d/ssh start
    • Systemd
      • systemctl start sshd.service
  • SSHを使ってリモートホストにログイン
ssh [[ログインユーザー名@]ホスト]
ssh sv1.lpic.jp
ssh student@sv1.lpic.jp
  • -p ポート
    • ポート番号を指定する
  • -l ユーザ名
    • login user
    • 接続するユーザを指定する
  • -i 秘密鍵ファイル
    • identity file
    • 秘密鍵ファイルを指定する

ホスト認証

  • 試す用のDockerコンテナ環境

docker-compose.yml

version: "3"
services:
  client:
    build:
      context: .
      dockerfile: ./ssh/Dockerfile
    tty: true
  server:
    build:
      context: .
      dockerfile: ./ssh/Dockerfile
    privileged: true
    tty: true
    entrypoint: "/sbin/init"
    command: "systemctl start sshd.service"
    expose:
      - 22
FROM centos:centos7


RUN yum -y update && yum clean all
RUN yum install -y which
RUN yum install -y wget
RUN yum install -y tar
RUN yum install -y vim
RUN yum install -y git
RUN yum -y install openssh-server openssh-clients

RUN mkdir  ~/.ssh && \
    touch  ~/.ssh/authorized_keys && \
    chmod 600  ~/.ssh/authorized_keys


CMD /bin/bash
  • 偽ホストに接続してしまうのを防ぐ
  • サーバの正当性確認
    1. サーバの公開鍵をクライアントに送る
    2. クライアント側で保存されているサーバの公開鍵と一致確認
      • ~/.ssh/known_hosts
  • 初回はクライアント側にサーバの公開鍵がないため、その旨のメッセージが表示される
  • ホスト認証鍵がknown_hostsのものと一致しない場合、警告が表示される
The authenticity of host 'server1 (172.28.0.3)' can't be established.
ECDSA key fingerprint is SHA256:TjBBQ5EQcrsB1WdDtOw9sgPsBX3slYEW/czjziPp4Pw.
ECDSA key fingerprint is MD5:6b:40:bb:c0:80:d0:3b:60:a4:94:6a:b3:3c:59:2c:4d.
Are you sure you want to continue connecting (yes/no)? 
  • サーバの公開鍵だけ奪取してもなりすますことはできない

公開鍵認証

  • ユーザ認証の方法のひとつ
  • パスワード認証に代わるやつ
  • ながれ
    1. クライアント側で鍵ペア作る
      • ssh-keygen
    2. クライアントの公開鍵をホストに渡しておく
    3. クライアントの鍵が使用できるか確認する
    4. クライアントの秘密鍵で署名つくる
    5. サーバに送る
    6. サーバ側の、クライアント公開鍵で署名を検証する
  • 鍵ペアつくる: ssh-keygenコマンド
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -R hostname [-f known_hosts_file]
       ...
  • 主なオプション
    • -t dsa | ecdsa | ed25519 | rsa
      • 暗号化タイプを指定
    • -p
    • -f ファイル名

      -f filename
      Specifies the filename of the key file.
      - 鍵ファイル指定

    • -R ホスト名

      -R hostname
      Removes all keys belonging to hostname from a
      known_hosts file. This option is useful to delete
      hashed hosts (see the -H option above). - 指定されたホストの鍵をknown_hostsファイルから消す

    • -b ビット長
      • 鍵の長さを指定(2048など)
  • 対話的に生成
ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/wand/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/wand/.ssh/id_ed25519.
Your public key has been saved in /home/wand/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:WNLK+7RaWDKYW5bUSUede5e92PQ7U5HcSUIoRSFP2Yo wand@wand-ThinkPad-X240s
The key's randomart image is:
+--[ED25519 256]--+
|        .o=**o   |
|       + ++ooo . |
|      o = o...+ *|
|     = * E .. .B+|
|    o X S    .+.+|
|     + *     . oo|
|    . o o       o|
|       + .     + |
|      ..o       o|
+----[SHA256]-----+
  • パスフレーズ
    • 秘密鍵を利用する際の認証用文字列
    • 長いほどセキュリティ強度が高まる
  • 鍵ファイル名
    • 公開鍵は*.pub
鍵のタイプ 秘密鍵ファイル名
v1 identity
v2 DSA id_dsa
v2 RSA id_rsa
v2 ECDSA id_ecdsa
v2 ED25519 id_ed25519
  • サーバの~/.ssh/authorized_keysに保存する
    1. クライアント側: scp等でサーバーに公開鍵を送る
      • まだ鍵を登録していないのでパスワード認証
      • scp ~/.ssh/id_ed25519.pub server:/tmp/publickey
    2. サーバ側: catのリダイレクト等で~/.ssh/authorized_keys等に追記
    3. クライアント側: ログアウト後、再度SSH接続する
    4. ユーザのパスワードではなく、秘密鍵パスフレーズを尋ねられる。入力してログイン
  • めんどくさい -> ssh-copy-idコマンドで一撃で鍵輸送できる
    • ssh-copy-id -i <公開鍵ファイルパス> <輸送先ホスト>

SSHの活用

scpコマンドによるリモートファイルコピー

  • SSHの仕組みでホスト間で安全にファイルコピー
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2
  • 主要なオプション

ssh-agent

[root@a99fa2a54cb8 /]# ssh-agent bash
[root@a99fa2a54cb8 /]# ssh-add
Enter passphrase for /root/.ssh/id_ed25519: 
Identity added: /root/.ssh/id_ed25519 (root@a99fa2a54cb8)
[root@a99fa2a54cb8 /]# ssh-add -l
256 SHA256:eQawscjKTJN32xm1Cvp5lWmDrV7qhphbYWJ7FqVOI2U root@a99fa2a54cb8 (ED25519)
[root@a99fa2a54cb8 /]# 
[root@a99fa2a54cb8 /]# touch hoge
[root@a99fa2a54cb8 /]# scp hoge server:/tmp/hoge
hoge                              100%    0     0.0KB/s   00:00    
[root@a99fa2a54cb8 /]# exit
exit
  1. ssh-agentの子プロセスとしてシェルを起動
  2. ssh-add秘密鍵を登録
  3. このシェルとその子プロセスではパスフレーズ入力不要になる
  4. ssh-agentが保持している秘密鍵ssh-add -lで一覧できる

ポート転送

man ssh
     -L [bind_address:]port:host:hostport
     -L [bind_address:]port:remote_socket
     -L local_socket:host:hostport
     -L local_socket:remote_socket
             Specifies that connections to the given TCP port or
             Unix socket on the local (client) host are to be for‐
             warded to the given host and port, or Unix socket, on
             the remote side.  This works by allocating a socket
             to listen to either a TCP port on the local side,
             optionally bound to the specified bind_address, or to
             a Unix socket.  Whenever a connection is made to the
             local port or socket, the connection is forwarded
             over the secure channel, and a connection is made to
             either host port hostport, or the Unix socket
             remote_socket, from the remote machine.
  • ローカルホストの10110番ポートに接続するとリモートpop.example.net110番に接続する例
ssh -L 10110:pop.example.net:110 student@pop.example.net
  • X11ポート転送
    • ポート転送の仕組みを使って、リモートホストのXクライアントをローカルホストで動作させる
     -X      Enables X11 forwarding.  This can also be specified
             on a per-host basis in a configuration file.
  • リモートホスト = SSHサーバー = Xクライアント側でX11Forwardingの許可が必要
  • /etc/ssh/sshd_config
X11Forwarding yes
  • 接続
ssh -X remote.example.net