sshとsshd
目次
講義の目的
sshを理解できる
sshdを理解できる
sshとsshdの違いが説明できる
sshとsshdのコマンドを実行して何が起こるかを理解できる
known_hosts、sshd_config、authorized_keysファイル等の設定を適切にできる
1. はじめに
この講義では、sshとsshdを理解してサーバーにsshdをインストールした開発環境を構築できることを目標とする講義を行います。
sshとsshdは奥の深い分野なので、WEBエンジニアやネイティブエンジニアが最低限押させておくべき内容に絞っています。
講義の対象は、プログラミングや開発の経験がある人になります。
開発環境はdockerでcentos6.9を利用して構築します。
2. ssh
ssh
(Secure Shell)は、あるマシンから別のマシンにアクセスしてログインするためのソフトウェアです。
主な用途は、自分のマシン(以下クライアント)からWEBサーバーなどの遠隔マシン(以下ホスト)にログインするために使われます。

公開鍵暗号方式
で暗号化
して通信します。

暗号化しない通信としてtelnet、rsh、rcp、ftp等があることも知っておくと良いでしょう。
ほとんどのパソコンでssh
はインストール済みです。ターミナルやコマンドプロンプトを開いでssh
と入力するとコマンドの使い方が表示されます。
$ ssh usage: ssh [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]
もし利用しているマシンにsshがインストールされていない場合はopenssh-clientsをイントールします。
例として、centos6.9でのイントール方法を記載します。
centos6.9の場合、yumコマンドでインストールします。
$ yum install -y openssh-clients
ライブラリの接頭文字に付加されているopensshはBSDライセンスのフリーソフトです。openssh-clientsをインストールすると、ssh
コマンドが利用できるようになります。
ユーザー名を指定して、ホストにssh
でログインしてみます。
# ssh kakaroto@localhost
ログインに成功するとターミナルにユーザー名が表示されます。
[kakaroto@769961e2ed14 ~]$
3. sshd
sshd
(OpenSSH デーモン)はsshのためのデーモンプログラム(OSが稼動している間、ずっと動いているプログラム)です
sshd
はクライアントからの接続(主にssh)をlisten(待ち受け)します。つまり、sshdはsshの接続先ホストで動作している必要があります。

centos6.9の場合、yumコマンドでインストールします。
$ yum install -y openssh-server
openssh-serverをインストールすると、OpenSSHサーバーとして利用できるようになります。
4. known_hosts
known_hostsは、接続したことのある各ホストの公開鍵を保存するファイルです。クライアント側のknown_hostsに書き込まれます。 ファイルパスは ~/.ssh/known_hosts です。

実際に流れを確認してみましょう。まずは、ホストに接続する前のクライアントの ~/.ssh/ フォルダの内容です。
# ls -l ~/.ssh/ total 0 -rw------- 1 root root 0 Aug 30 23:48 authorized_keys
クライアントからホストに接続します。
$ ssh root@localhost
最初のホストへの接続の場合、サーバを信頼するかどうかの選択肢が表示されます。
The authenticity of host 'localhost (127.0.0.1)' can't be established. RSA key fingerprint is 1e:24:b8:eb:61:1b:57:c9:f1:b0:2d:57:11:f0:8e:2a. Are you sure you want to continue connecting (yes/no)?
yesと答えると、そのサーバの fingerprint が ~/.ssh/known_hosts に追加されます。
Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (RSA) to the list of known hosts..
ログイン後に ~/.ssh/known_hosts を確認します。known_hostsが作成されていることを確認します。
# ls -l ~/.ssh/ total 4 -rw------- 1 root root 0 Aug 30 23:48 authorized_keys -rw-r--r-- 1 root root 391 Aug 30 23:57 known_hosts
ファイルの中を確認します。
# cat ~/.ssh/known_hosts localhost ssh-rsa AAAAB3NzaC1yc
ホストの公開鍵が書き込まれています。
5. sshd_config
sshd_configはsshdの設定ファイルです。ファイルは /etc/ssh/sshd_config に置かれています。

sshdのデフォルトの設定だと、rootでログインが可能になっています。
$ cat /etc/ssh/sshd_config #PermitRootLogin yes
PermitRootLoginがコメントアウトしてあります。なので、rootログインを防ぐために、sshd_configファイルを書き換えてみます。
PermitRootLogin no
sshdを再起動します。
/etc/init.d/sshd restart
rootでログインを実行します。
# ssh root@localhost root@localhost's password: Permission denied, please try again.
rootのログインが弾かれたのが確認できました。
6. authorized_keys
authorized_keysファイルは、接続を許可する公開鍵を登録しておくことができます。authorized_keysファイルはホストに配置します。

クライアントからsshでsshdが動作しているホストにアクセスした場合に、authorized_keysに情報が書き込まれます。
authorized_keysに記載された公開鍵は、ホスト側の /etc/ssh/sshd_config でPubkeyAuthenticationの設定が有効になっている場合、クライアントはパスワードなしでホストにログインすることができます。
PubkeyAuthenticationの設定は /etc/ssh/sshd_config で確認できます。
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
ホストで上記の設定が有効になっていない場合は、/etc/ssh/sshd_config を変更してサーバーを再起動します。
service sshd restart
7. ssh-keygen
ssh-keygenコマンドを利用すると公開鍵と秘密鍵を作成できます。
# ssh-keygen -t rsa -b 4096 -C "test@marsa.com"
ssh-keygenコマンドを実行すると、SSH Keysの保存先やパスワードを聞かれます。保存先はデフォルト、パスワードは自分が普段利用しているパシワードの中から適当に入力するとよいでしょう。
Generating public/private rsa key pair. Enter file in which to save the key (/home/marsa/.ssh/id_rsa): Created directory '/home/marsa/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/marsa/.ssh/id_rsa. Your public key has been saved in /home/marsa/.ssh/id_rsa.pub.
ssh-keygenコマンドを実行すると、SSH Keysの保存先やパスワードを聞かれます。保存先はデフォルト、パスワードは自分が普段利用しているパシワードの中から適当に入力するとよいでしょう。
8. まとめ
この講義では、sshとsshdについて学習しました。
sshの知識はオンプレミスのLinux環境でもクラウド環境でも必須の知識になります。プログラマーもサーバー管理者も絶対に理解していないといけないいけない知識なので、サーバーや仮想環境を立てて色々な設定を試してみてください。
演習
この講義に関連する演習問題を用意しました。理解度を確認してください。
演習