LoginSignup
1
0

私的サーバー構築日誌:SSH公開鍵認証・公開鍵を集中管理

Posted at

能書き

私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。

以前も同じネタを記事にしましたが、今回はちょっと詳細を変えています。

目標

sshを、パスワードではなく公開鍵方式で接続するようにします。

その公開鍵は$HOME/.sshに保管するのではなく、一ファイルに格納して集中管理する方式を試みます。

参考文献

サーバーの準備

スナップショット

スナップショットだいじ。超だいじ。

サーバー
sudo zfs snapshot tank/root/ubuntu@$(date +%Y%m%d_%H%M%S)_before_ssh_authkey

SSH サーバー設定

公開鍵の置き場所を決めます。公開される鍵ですし、どこでも良いんですが。今回は/opt/ssh/publickeys.listとしました。

サーバー
sudo mkdir /opt/ssh
サーバー
sudo touch /opt/ssh/publickeys.list

publickeys.listの中身はタブ区切りのテキストファイルとします。下記2つの項目をタブ文字で区切って1行とします。

  1. ユーザー名
  2. 公開鍵

sshd が公開鍵を取得する為のシェルスクリプトを作成します。これは自作しました。

サーバー
sudo mkdir /opt/ssh/bin
サーバー
cat <<"___" | sudo tee /opt/ssh/bin/ssh_authorized_key.sh >/dev/null
#!/bin/bash
look -t $'\t' $1$'\t' /opt/ssh/publickeys.list | cut -f2
___
サーバー
sudo chmod +x /opt/ssh/bin/ssh_authorized_key.sh

そして Linux の伝統に則り/usr/local/binにシンボリックリンクを張ります。

サーバー
sudo ln -s /opt/ssh/bin/ssh_authorized_key.sh /usr/local/bin/ssh_authorized_key.sh

このシェルスクリプト実行専用のユーザーアカウントが必要との事。

サーバー
sudo useradd -s /usr/sbin/nologin -M sshauthkey

設定ファイルを調整して、作成したシェルスクリプトを呼び出すようにします。
同時にパスワード認証を禁止しときます。

サーバー
cat <<___ | sudo tee /etc/ssh/sshd_config.d/ssh_authorized_key.conf >/dev/null
AuthorizedKeysCommand /usr/local/bin/ssh_authorized_key.sh
AuthorizedKeysCommandUser sshauthkey
AuthorizedKeysFile none
PasswordAuthentication no
___

sshdを再起動します。

サーバー
sudo systemctl restart sshd

SSH接続用の鍵

ここからは、クライアントマシンとサーバーマシンの操作が少し入り組んできます。

ユーザーの選定

当然ながら、接続するユーザーはログイン可能でなければなりません。

ここまで手順通りに操作しているなら、adminユーザーが使える対象になります。

秘密鍵と公開鍵を生成

SSH接続の為の鍵を生成します。暗号の種類は、昨今の情勢を鑑みて楕円曲線暗号Ed25519にします。

なおssh-keygenコマンドはWindowsも持っています。このコマンドはWindowsでも、コマンドプロンプトでそのまま実行できます。良い時代になりましたな。

クライアント
ssh-keygen -t ed25519 -P ""

鍵ペアは$HOME/.sshディレクトリに作成されて、それに関して問合せがありますので、何も入力せずにEnterキーを押しましょう。

クライアント
>ssh-keygen -t ed25519 -P ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\admin/.ssh/id_ed25519):
Your identification has been saved in C:\Users\admin/.ssh/id_ed25519.
Your public key has been saved in C:\Users\admin/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:RoiCRkTvjynwV3bHno8QenQxoteawl3zjUDcbrV6vk4 admin@client
The key's randomart image is:
+--[ED25519 256]--+
|o+               |
|...  . . . .     |
|..... . o = . .  |
|. ..   o = + . . |
|.  .  + S O o .  |
|..  ++ B O * +   |
| ..o..+ * o + E  |
|  ..   o . o +   |
|          . ..+. |
+----[SHA256]-----+

公開鍵をサーバーへ送付

前回確立した手順でもって、公開鍵をサーバーへ送付します。サーバー名をprimary.home、ユーザー名をadminとした場合、下記のように操作します。

Windowsはsftpコマンドも持っています。ただ、cdコマンドのオプションが異なりますので、そこは適宜修正して下さい。

クライアント(Linux)
cd ~/.ssh
クライアント(Windows10)
cd %USERPROFILE%\.ssh
クライアント
sftp transporter@primary.home
クライアント sftp
cd publickey
mkdir admin
cd admin
put id_ed25519.pub
exit

サーバーで公開鍵一覧表に追加

送付された公開鍵をサーバー側で受け取ります。具体的には、公開鍵一覧表に追加してから並べ替えます。

サーバー
KEYOWNER=admin
サーバー
cat <(echo -n $KEYOWNER$'\t') /srv/transport/publickey/$KEYOWNER/id_ed25519.pub | sudo tee -a /opt/ssh/publickeys.list >/dev/null
サーバー
sudo sort -u /opt/ssh/publickeys.list -o /tmp/publickeys.list
サーバー
sudo mv /tmp/publickeys.list /opt/ssh/publickeys.list

処理が済んだ印として、サーバー側の責任で公開鍵を削除しておきましょう。

サーバー
sudo rm /srv/transport/publickey/$KEYOWNER/id_ed25519.pub
サーバー
sudo rmdir /srv/transport/publickey/$KEYOWNER

動作確認

動作を確認します。ssh 接続時にパスワード入力要求が無ければ成功です。

クライアント
ssh admin@primary.home

仕舞い

上手くいったら/etcを Subversion コミットしておきます。
まずは今回の差分を確認。

サーバー
sudo svn st /etc

今回はユーザー追加などもあったので、下記のようになりました。

サーバー
$ sudo svn st /etc
M       /etc/group
M       /etc/gshadow
M       /etc/passwd
M       /etc/shadow
?       /etc/ssh/sshd_config.d/ssh_authorized_key.conf
M       /etc/subgid
M       /etc/subuid
M       /etc/zfs/zpool.cache

問題無いようなのでコミットします。

サーバー
sudo svn st /etc | grep "^?" | cut -b9- | xargs -I{} sudo find {} -type f -or -type d -or -type l | xargs -t sudo svn add
サーバー
sudo svn ci /etc -m"ssh: public key authentication, prohibit password"

これで、パスワード認証ではなくて公開鍵認証方式で ssh 接続できるようになりました。その鍵は一箇所で集中管理します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0