VPSをリモートで操作するためにSSHクライアントを使います。VPSにFreeBSDをインストールするでSSH設定をしたので、接続環境を整えましょう。
SSHログインユーザーを作る(FreeBSD編)
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ログインユーザーを作る(CentOS編)
CentOSでSSH接続ユーザーを作る場合、adduserコマンドも使えますが、useraddコマンドというのがあるらしい。ややこしいね。
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
-Dオプションでデフォルト値を見るとシェルはbashになってる!Linuxはだいたいbashが標準みたいだから、これは大歓迎。
-Gオプションで追加グループ指定に続けてユーザーを指定すると、デフォルト設定に従ってユーザーを作成してくれます。/homeディレクトリの下にユーザーのホームディレクトリができました。
# useradd -G wheel ssh
# ll /home
total 4
drwx—— 2 ssh ssh 4096 Nov 24 04:20 ssh
FreeBSDの/etc/master.passwdに相当する/etc/shadowファイルの該当部位を編集してしまいます。
変更前:
~前略~
ssh:!!:1002:0:99999:7:::
変更後:
~前略~
ssh:NP:1002:0:99999:7:::
adduserコマンドと違ってパスワードを指定していなかったので、ハッシュ値の代わりに!!という文字列が入っています。ここをNPなどに書き換えます。ちなみに!!が指定されているユーザーはアカウントロックされている状態だそうです。
公開鍵認証でSSH接続
FreeBSDをインストールした際に/etc/ssh/sshd_configで設定してあるので、パスワードログインができなくなったユーザーでも公開鍵認証を使えばログインできます。
クライアント側で公開鍵認証用の鍵ペアを作ったら、公開鍵(~/.ssh/id_ed25519.pub)をサーバー側の~/.ssh/authorized_keysに追記します。
ssh-copy-idコマンドを使うと便利。-iオプションに続けて公開鍵ファイルを指定し、’ssh接続ユーザー’@’サーバーアドレス’を指定します。
ただしパスワードを聞いてくるので、一時的にssh接続ユーザーのパスワードを設定しておく必要があります。
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub ssh@xxx.xxx.xxx.xxx
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/ssh/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
Host key fingerprint is SHA256:*******************************************
+—[ECDSA 256]—+
| +.o.o |
〜中略〜
| .o*o.oo |
+—-[SHA256]—–+
ssh@xxx.xxx.xxx.xxx's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ssh@xxx.xxx.xxx.xxx'"
and check to make sure that only the key(s) you wanted were added.
これでMacのターミナルからssh接続ができるようになりました。
configファイルを使う
さて、SSH接続する際にはコマンドラインから色々入力する必要があります。
$ ssh -p 20022 -i ~/.ssh/id_ed25519 ssh@example.com
ポート番号を指定して認証鍵ファイルを指定して接続先アドレスを指定して…。
やってらんねー。(ノ ゚Д゚)ノ ==== ┻━━┻
ということで~/.ssh/configに登録してしまいましょう。
# Vultr VPS
Host vultr
HostName example.com
User ssh
Port 20022
IdentityFile /Users/user/.ssh/id_ed25519
# Time4VPS
Host time4vps
HostName example.jp
User ssh
Port 20022
IdentityFile /Users/user/.ssh/id_ed25519
# Common settings
Host *
ServerAliveInterval 60
VisualHostKey yes
Compression yes
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
こうしておくと、Hostに続けて登録した名前をsshに渡してやるだけで、必要なパラメータが全て指定できてしまうので便利です。
最後の*は全てのHostに共通の内容を書いてあります。
パスフレーズを自動入力する
さて、認証鍵ペアを作った際にパスフレーズの入力をしたと思いますが(したよね!?)、ssh接続時に毎回パスフレーズを入力するのは面倒です。
そんな時に使うのがssh-agentとssh-add。ssh-agentは公開鍵認証で使われる認証鍵を保持するプログラムで、このプログラムの子プロセスにシェルを起動することでそのシェル内で認証鍵のパスフレーズを自動入力できるようになります。
そしてssh-addが自動入力させる認証鍵とパスフレーズを登録するプログラム。
$ ssh-agent bash
$ ssh-add ~/.ssh/id_ed25519
Enter passphrase for .ssh/id_ed25519:
Identity added: ~/.ssh/id_ed25519 (~/.ssh/id_ed25519)
こんな感じで登録する。ただし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
2048 SHA256:******************************************* .ssh/id_rsa (RSA)
256 SHA256:******************************************* .ssh/id_ecdsa (ECDSA)
256 SHA256:******************************************* ssh@MacBook-Air.local (ED25519)
Macでは何も考えずにターミナルを立ち上げたらssh-addで認証鍵を登録しておけば手間なくSSH接続ができるので、これは是非使いましょう。
iPadでもSSH接続
iOS用にはTermiusというSSHターミナルアプリがあります。Macでも動くけど標準のターミナルで十分。
Macで鍵ペアを作ったら、公開鍵(id_ecdsa.pub)はサーバー側に設置し、秘密鍵(id_ed25519)を何らかの方法でiPadにコピペします。たとえばメモアプリを使ったiCloud経由とか。
TermiusのメニューからKeychainを選んで+ボタンでNew Keyを選びます。Pasteタブを選んで適当な識別名をKey Nameに、Privateに秘密鍵の内容を貼り付けて保存します。

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

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

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