SSH接続

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

SSHログインユーザーを作る(FreeBSD編)

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

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

# adduser
Username: ssh
Full name: Remote User
Uid (Leave empty for default): 
Login group [ssh]: 
Login group is takeru. Invite takeru into other groups? []: wheel
Login class [default]: 
Shell (sh csh tcsh bash rbash 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 User
Uid        : 1001
Class      : 
Groups     : ssh wheel
Home       : /home/ssh
Home Mode  : 
Shell      : /usr/local/bin/bash
Locked     : no
OK? (yes/no) [yes]: yes
adduser: INFO: Successfully added (takeru) to the user database.
Add another user? (yes/no) [no]: no
Goodbye!
Code language: Shell Session (shell)

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

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
Code language: Bash (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
Code language: Bash (bash)

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

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

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
Code language: Bash (bash)

-Dオプションでデフォルト値を見るとシェルはbashになってる!Linuxはだいたいbashが標準みたいだから、これは大歓迎。

-Gオプションで追加グループ指定に続けてユーザーを指定すると、デフォルト設定に従ってユーザーを作成してくれます。/homeディレクトリの下にユーザーのホームディレクトリができました。

# useradd -G wheel ssh
# ll /home
total 4
drwx—— 2 ssh ssh 4096 Nov 24 04:20 ssh
Code language: Bash (bash)

FreeBSDの/etc/master.passwdに相当する/etc/shadowファイルの該当部位を編集してしまいます。

変更前:

~前略~
ssh:!!:1002:0:99999:7:::
Code language: Bash (bash)

変更後:

~前略~
ssh:NP:1002:0:99999:7:::
Code language: Bash (bash)

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.
Code language: Shell Session (shell)

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

configファイルを使う

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

$ ssh -p 20022 -i ~/.ssh/id_ed25519 ssh@example.comCode language: Shell Session (shell)

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

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

ということで~/.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
Code language: Bash (bash)

こうしておくと、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)
Code language: Shell Session (shell)

こんな感じで登録する。ただし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
Code language: Shell Session (shell)

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)
Code language: Shell Session (shell)

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接続ができるようになります。

SSH接続完了

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

iPad miniとMicrosoft Universal Moblie Keyboard

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments