リモートログイン——OpenSSH


目次

  1. インストール
  2. SSHサーバ
    1. サーバ側でSSHデーモンを実行する
    2. クライアント側から接続テストをする
    3. クライアント側で公開鍵と秘密鍵を作る
    4. クライアント側の公開鍵をサーバ側にコピーする
    5. サーバ側のホームディレクトリに認証用のファイルを作る
    6. サーバ側でパスワード認証を禁止する
  3. どうしてもパスワード認証を禁止できない場合
  4. その他SSHログインの認証として使えるもの
  5. 参考文献

インストール

NetBSD 8.0ではベースシステム(base.tgz)に含まれている。

$ /usr/bin/ssh -V
OpenSSH_7.6 NetBSD_Secure_Shell-20171007, OpenSSL 1.0.2k  26 Jan 2017

pkgsrc(7)ではsecurity/opensshパッケージで提供されている。インストールするにはpkgsrc(7)のsecurity/opensshディレクトリでmake(1)を実行する。

# cd /usr/pkgsrc/security/openssh
# make install clean clean-depends

pkgsrc(7)からインストールした場合、RCスクリプトは/usr/pkg/share/examples/rc.d/sshdを使う。これを/etc/rc.dディレクトリにコピーする。

# cp /usr/pkg/share/examples/rc.d/sshd /etc/sshd

SSHサーバ

SSHサーバとはSSHプロトコルで外部からのログインを受け付けるサーバを意味する。SSHデーモンはクライアントからの接続を受け付ける。外部からログインさせたくなければSSHデーモンは動かさない。

デスクトップ用途のマシンではリモートログインする機会が少ないだろう。しかしデスクトップ環境でもSSHデーモンを動かしておくことで、たとえばX Window Systemに異常が起こったときに他の端末からSSHログインをして救出作業できる場合がある。あるいは会社でデスクトップPCとノートPCを一台ずつ貸与されそれらが同一ネットワークに接続しているとして、自席のデスクトップPCでSSHデーモンを動かしノートPCからログインすることで自席でなくともデスクトップPCをCUI上またはX11転送を使って操作できる。会議室にいるとき、自宅から会社へVPN接続をするときなどに有効な手だ。

外部からのログインを受け付けるということは、自分以外の悪意ある第三者がログインを試みるケースも考慮しなければならない。パスワード認証では総当たり攻撃で突破される可能性が高いため、ここでは公開鍵を使った認証の設定方法について述べる。

サーバ側でSSHデーモンを実行する

はじめにSSHサーバ側でSSHデーモンを実行する。

server# service sshd onestart

OS起動時にSSHデーモンを自動で実行するよう設定するにはsshd=YESをrc.conf(5)に書き込む。

server# echo "sshd=YES" >> /etc/rc.conf

SSHデーモンが動いているか確認するにはservice(8)のstatusもしくはonestatusアクションを使う。たとえば正常に動作していれば以下のような出力が得られるだろう。

server# service sshd onestatus
 is running as pid 12864. 

クライアント側から接続テストをする

クライアントがサーバへSSHログインできるかを確認する。サーバ側のユーザが"uki"だとすると、クライアント側からログインするにはssh(1)を実行する。"xxx.xxx.xxx.xxx"はサーバのIPアドレスに適宜置き換えてほしい。

client$ ssh uki@xxx.xxx.xxx.xxx

これを実行すると、ukiのパスワードを聞かれ、入力したものが正しければログインできる。接続を切るにはexitを実行する。

server$ exit

クライアント側で公開鍵と秘密鍵を作る

SSHサーバへ接続する側にて公開鍵と秘密鍵をssh-keygen(1)で作る。鍵のタイプにはrsaやdsa・ecdsa・ed25519があり、SSHデーモンのバージョンによってはサポートされていないものもある。古いバージョンのSSHデーモンを使っている場合は注意が必要。

ここでは4096 bitのRSA鍵か、ed25519鍵の2通りを紹介する。ssh-keygen(1)でこれらを作るには

client$ ssh-keygen -t ed25519 -o -a 100

または

client$ ssh-keygen -t rsa -b 4096 -o -a 100

のどちらかを実行する。前者ではed25519鍵が、後者では4096 bit長のRSA鍵が作られる。これらを実行したときウィザード形式で鍵の生成が始まる。Enter file in which to save the keyでは鍵をどこに作るか、Enter passphraseでは鍵のパスフレーズを、Enter same passphrase againでは直前に入力したものと同じパスフレーズを入力する。パスフレーズの入力のさい、入力した文字は画面にエコーされないので注意すること。

クライアント側の公開鍵をサーバ側にコピーする

ファイル名が.pubで終わるものが公開鍵。これをサーバ側になんらかの方法でコピーする。たとえばscp(1)を使う。CentOSのようなGNU/Linuxではssh-copy-id(1)という公開鍵コピー用のユーティリティが用意されているが、NetBSD 8.0およびpkgsrc(7)では提供されていないので手動でおこなわなければならない。

client$ scp ~/.ssh/id_ed25519.pub uki@xxx.xxx.xxx.xxx:~/

サーバ側のホームディレクトリに認証用のファイルを作る

サーバ側で、SSHでログインされるユーザのホームディレクトリに.sshディレクトリを作る。次にそのディレクトリ内にauthorized_keysというファイルを作る。このファイルに公開鍵の中身を追記していく。

.sshディレクトリのパーミッションは700にする。authorized_keysのパーミッションは600にする。

server$ mkdir ~/.ssh
server$ chmod 700 ~/.ssh
server$ cat id_ed25519 >> ~/.ssh/authorized_keys
server$ chmod 600 ~/.ssh/authorized_keys

クライアント側から再度ssh(1)でログインし、公開鍵認証でログインできるか(パスワードは聞かれないか?パスフレーズの入力を求められるか?)を確認する。

server$ exit
client$ ssh uki@xxx.xxx.xxx.xxx

サーバ側でパスワード認証を禁止する

SSHデーモンの設定ファイル/etc/ssh/sshd_config(pkgsrc(7)からインストールした場合は/usr/pkg/etc/ssh/sshd_config)を編集し、以下の項目を確認する。

PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication yes

設定後SSHデーモンをservice(8)のrestartかonerestartアクションで再起動する。

server# service sshd onerestart

どうしてもパスワード認証を禁止できない場合

レンタルサーバのような/etcの下のファイルに書き込む権限がないサービスを使うとき、公開鍵認証でログインできてもパスワード認証までは禁止できないこともある。どうしようもないので、そのサービスで利用できる最大の長さまでパスワードを長くするしかない。パスワードマネージャは調べればいろいろなものが見つかる。僕はBashとGnuPGで実装されたパスワードマネージャpwd.shを使っている。最近同じ作者によるParseに乗り換えた。

その他SSHログインの認証として使えるもの

GnuPGKerberosがある。

参考文献

Ken'ichi Fukamachi, パッケージ: openssh (Secure SHell)
本ページのオリジナル。デーモンの死活確認にservice(8)を使ったり、ed25519鍵の記述などを追加した。オリジナルのようにサーバ構築のいち手順として書いていないので記述が省略されている箇所もある。
stribika, Secure Secure Shell, 2015
鍵交換の説明からどのアルゴリズムをSSHデーモンに使わせるか、どの鍵を使うか、Torとどう連携させるかなどについて書かれている。本ページの鍵生成のコマンドはこのページから引用した。OpenSSH 6.7でのみテストされており、2015年のブログ記事なのでやや古めに感じるかもしれないが、一読の価値は十分にあると思う。