www.shoeisha.co.jp
OpenSSH
SSH: Secure Shell
- バージョン1系と2系がある
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
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
- Systemd
systemctl start sshd.service
- SSHを使ってリモートホストにログイン
ssh [[ログインユーザー名@]ホスト]
ssh sv1.lpic.jp
ssh student@sv1.lpic.jp
-p ポート
-l ユーザ名
-i 秘密鍵ファイル
- identity file
- 秘密鍵ファイルを指定する
ホスト認証
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
- 偽ホストに接続してしまうのを防ぐ
- サーバの正当性確認
- サーバの公開鍵をクライアントに送る
- クライアント側で保存されているサーバの公開鍵と一致確認
- 初回はクライアント側にサーバの公開鍵がないため、その旨のメッセージが表示される
- ホスト認証鍵が
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)?
- サーバの公開鍵だけ奪取してもなりすますことはできない
公開鍵認証
- ユーザ認証の方法のひとつ
- パスワード認証に代わるやつ
- ながれ
- クライアント側で鍵ペア作る
- クライアントの公開鍵をホストに渡しておく
- クライアントの鍵が使用できるか確認する
- クライアントの秘密鍵で署名つくる
- サーバに送る
- サーバ側の、クライアント公開鍵で署名を検証する
- 鍵ペアつくる:
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 ビット長
- 対話的に生成
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]-----+
- パスフレーズ
- 秘密鍵を利用する際の認証用文字列
- 長いほどセキュリティ強度が高まる
- 鍵ファイル名
鍵のタイプ |
秘密鍵ファイル名 |
v1 |
identity |
v2 DSA |
id_dsa |
v2 RSA |
id_rsa |
v2 ECDSA |
id_ecdsa |
v2 ED25519 |
id_ed25519 |
- サーバの
~/.ssh/authorized_keys
に保存する
- クライアント側: scp等でサーバーに公開鍵を送る
- まだ鍵を登録していないのでパスワード認証
scp ~/.ssh/id_ed25519.pub server:/tmp/publickey
- サーバ側: catのリダイレクト等で
~/.ssh/authorized_keys
等に追記
- クライアント側: ログアウト後、再度SSH接続する
- ユーザのパスワードではなく、秘密鍵のパスフレーズを尋ねられる。入力してログイン
- めんどくさい ->
ssh-copy-id
コマンドで一撃で鍵輸送できる
ssh-copy-id -i <公開鍵ファイルパス> <輸送先ホスト>
scp
コマンドによるリモートファイルコピー
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
- 主要なオプション
-p
-r
cp
の-r
, --recursive
に同じ
- ディレクトリ内を再帰的にコピー
-P ポート番号
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
ssh-agent
の子プロセスとしてシェルを起動
ssh-add
で秘密鍵を登録
- このシェルとその子プロセスではパスフレーズ入力不要になる
- 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.
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