SSH接続

VPSをリモートで操作するためにSSHクライアントを使います。VPSにFreeBSDをインストールするでSSH設定をしたので、接続環境を整えましょう。

SSHログインユーザーを作る

FreeBSDハンドブックのセキュリティの項目によると、SSH接続できるユーザーを限定して(ましてやrootでログインしない)不正アクセスを防止するのが良いようです。

本当はSuper Userへの昇格権限もないほうがいいんでしょうが、いろいろ設定ファイルをいじるうえで必要なのでwheelグループに所属させます。

# adduser
Username: ssh
Full name: remote
Uid (Leave empty for default):
Login group [ssh]: wheel
Login group is wheel. Invite ssh into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash rbash git-shell nologin) [sh]: bash
Home directory [/home/ssh]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : ssh
Password   : *****
Full Name  : remote
Uid        : 1002
Class      :
Groups     : wheel
Home       : /home/ssh
Home Mode  :
Shell      : /usr/local/bin/bash
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (ssh) to the user database.
Add another user? (yes/no): no
Goodbye!

そしてこのユーザーのパスワードを潰してパスワードログインができないようにします。

FreeBSDのユーザー管理は/etc/master.passwdで管理されていて、ここにユーザー名やパスワードなどが書き込まれていますが、パスワードはハッシュ化された不可逆なテキストで書き込まれています。

OSはログイン処理の度にユーザーが入力したパスワードをハッシュ化して、その結果を/etc/master.passwdに書き込まれている内容と照合します。平文のパスワードを照合してもハッシュ化されたパスワードを照合しても、一致しているかいないかは判断できるのでこういう仕様のほうが安全というわけです。

なのでパスワードを忘れてしまうとシステム管理者でも正しいパスワードを知ることができません。

パスワード照合がそういう振る舞いなので、/etc/master.passwdに書き込まれているハッシュ化されたパスワードをNPなどに書き換えるとパスワードログインが不可能となります。(削除はダメ。パスワード無しになっちゃう)これはハッシュ化後のテキストが三文字未満になるような平文が存在しないためだそうです。

変更前:

# $FreeBSD: releng/10.3/etc/master.passwd 256366 2013-10-12 06:08:18Z rpaulo $
#
~中略~
ssh:$6$Ql6GYmcUNLr6hTWp$FfXuQlj9RVIboN/fOlv2kYUaBOtfYpjnNOc30O4mQqNH0nD35tW8KZVLK3nvWobubjWONQIsYGBnbcukOxppz/:1002:0::0:0:remote:/home/ssh:/usr/local/bin/bash

変更後:

# $FreeBSD: releng/10.3/etc/master.passwd 256366 2013-10-12 06:08:18Z rpaulo $
#
~中略~
ssh:NP:1002:0::0:0:remote:/home/ssh:/usr/local/bin/bash

パスワードを潰してしまったので、FreeBSDインストール当初のSSHの設定項目にあったパスワード認証の許可を取り消しておきましょう。

Port 20022                  # 接続ポートを標準外にすることで攻撃されにくくします
Protocol 2                  # SSH2接続のみ許可します
PermitRootLogin no          # rootでのログインを拒否します
PasswordAuthentication no   # パスワード認証を拒否します
PermitEmptyPasswords no     # パスワードなしの接続を拒否します
AllowUsers general_user     # ログインユーザーを限定します

公開鍵認証でSSH接続

FreeBSDをインストールした際に/etc/ssh/sshd_configで設定してあるので、パスワードログインができなくなったユーザーでも公開鍵認証を使えばログインできます。

下準備として公開鍵認証用の鍵ペアを作ります。

クライアント側の~/.ssh/に出来上がった公開鍵(id_ecdsa.pub)をサーバー側の~/.ssh/authorized_keysとして設置します。(既に存在する場合には最後の行に追記)

ターミナルでcat id_ecdsa.pub | pbcopyとかしておいて、ssh接続後にauthorized_keysをエディタで開いてcommand+vとかで貼り付ければいいんじゃないかな。

これでMacのターミナルからssh接続ができるようになります。

configファイルを使う

さて、SSH接続する際にはコマンドラインから色々入力する必要があります。

$ ssh -p 20022 -i ~/.ssh/id_ecdsa ssh@example.com

ポート番号を指定して認証鍵ファイルを指定して接続先アドレスを指定して…。

やってらんねー。(ノ ゚Д゚)ノ ==== ┻━━┻

ということで~/.ssh/configに登録してしまいましょう。

# Sakura Internet VPS
Host vps
  HostName  example.vs.sakura.ne.jp
  User      ssh
  Port      20022
  IdentityFile  /Users/user/.ssh/id_ecdsa

# Vultr VPS
Host vultr
  HostName  example.com
  User      ssh
  Port      20022
  IdentityFile  /Users/user/.ssh/id_ecdsa

# Common settings
Host  *
ServerAliveInterval 60
VisualHostKey yes
Compression yes
Ciphers arcfour256,arcfour128,arcfour,blowfish-cbc,cast128-cbc,aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,3des-cbc

こうしておくと、Hostに続けて登録した名前をsshに渡してやるだけで、必要なパラメータが全て指定できてしまうので便利です。

最後の*は全てのHostに共通の内容を書いてあります。

パスフレーズを自動入力する

さて、認証鍵ペアを作った際にパスフレーズの入力をしたと思いますが(したよね!?)、ssh接続時に毎回パスフレーズを入力するのは面倒です。

そんな時に使うのがssh-agentとssh-add。ssh-agentは公開鍵認証で使われる認証鍵を保持するプログラムで、このプログラムの子プロセスにシェルを起動することでそのシェル内で認証鍵のパスフレーズを自動入力できるようになります。

そしてssh-addが自動入力させる認証鍵とパスフレーズを登録するプログラム。

$ ssh-agent bash
$ ssh-add ~/.ssh/id_ecdsa
Enter passphrase for .ssh/id_ecdsa: 
Identity added: ~/.ssh/id_ecdsa (~/.ssh/id_ecdsa)

こんな感じで登録する。ただしmacOSの場合はssh-agentは起動しなくても大丈夫。ターミナルを起動した時に自動起動してるっぽい。

$ ps aux | grep -e "ssh"
user           1576   0.0  0.0  2454036   3628   ??  S    19Nov17   0:00.04 /usr/bin/ssh-agent -l
user          18902   0.0  0.0  2432804    780 s000  S+    9:10PM   0:00.00 grep --color -e ssh

ssh-addで鍵ファイルを指定するとパスフレーズを聞いてくるので、ここで入力しておくとssh-agentを終了させるまではずっと覚えてくれている。どの鍵ファイルを登録したかはssh-add -lで確認することができる。

$ ssh-add -l
256 SHA256:f*****************************************k ~/.ssh/id_ecdsa (ECDSA)
4096 SHA256:9*****************************************k ~/.ssh/id_rsa (RSA)

Macでは何も考えずにターミナルを立ち上げたらssh-addで認証鍵を登録しておけば手間なくSSH接続ができるので、これは是非使いましょう。

iPadでもSSH接続

iOS用にはTermiusというSSHターミナルアプリがあります。Macでも動くけど標準のターミナルで十分。

Macで鍵ペアを作ったら、公開鍵(id_ecdsa.pub)はサーバー側に設置し、秘密鍵(id_ecdsa)を何らかの方法でiPadにコピペします。たとえばメモアプリを使ったiCloud経由とか。

TermiusのメニューからKeychainを選んで+ボタンでNew Keyを選びます。Pasteタブを選んで適当な識別名をKey Nameに、Privateに秘密鍵の内容を貼り付けて保存します。

秘密鍵登録

続いてメニューからHostsを選んで+ボタンでNew Hostを選びます。最低限HostnameとPortとUsernameを入力し、Use SSHをオンにしたらKeyの項目で先ほど作成したKeychain内のKeyを選択して保存します。

ホスト名設定

HOSTSリストから今作成したHostをタップするとssh接続ができるようになります。

SSH接続完了

ソフトウェアキーボードでも操作できますが、Microsoft Universal Mobile KeyboardのUSモデルをBluetooth接続して使うのがおすすめ。チルダ/バッククォートキーの位置がおかしいのを我慢すれば結構いいです。個人的にはエスケープキーがチルダ/バッククォートキーになれば完璧なんですが。

iPad miniとMicrosoft Universal Moblie Keyboard