LoginSignup
0
1

More than 1 year has passed since last update.

自宅サーバー構築譚:公開鍵の送付専用ユーザーを作成

Last updated at Posted at 2023-02-25

能書き

自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールその2の続きです。

前回はオレオレ認証局を構築しまして、公開鍵(及び秘密鍵)を作成できる環境を作りました。

ここで問題になるのが公開鍵の送付です。

セキュリティを鑑みると、最終的には ssh を公開鍵認証するようにしたいのです。しかしその為には、クライアントマシンで作成した公開鍵をサーバーマシンに送付しなければなりません。

USBメモリで物理的に運搬、でも良いのですが一手間掛かります。折角なので電子的に送付できるようにしてスマートな操作を実現したい。

そこで、公開鍵送付専用のユーザーを作成する事にしました。

調べた結果、sftp なら OpenSSH だけあれば構築できるようです。余計なモジュールのインストールは不要。chroot 設定も可能。操作体系は ftp 準拠なので、変なコマンドを実行されてしまう事もありません。

と言う訳で。その為の設定を実施します。

参考文献

サーバー設定

root になる

以下の作業の殆どで root 権限が必要になります。
一々sudoしてもいいのですが。

サーバー
sudo -i

スナップショット

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

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

ユーザー追加

ユーザー名は publickey とします。異論もおありと思いますが、共通鍵の運搬専用という事で今回はこれにします。

  • ユーザー名は publickey
  • ホームディレクトリ無し
  • ログイン禁止

上記を踏まえて、下記のコマンドを実行します。ユーザー作成とパスワード設定になります。

サーバー
useradd -s /usr/sbin/nologin -M publickey
passwd publickey

追加したユーザーの sftp 設定

publickey は共通鍵の送付専用です。その送付対象となる共通鍵ファイルは/srv/publickeyディレクトリに置く事とします。異論もおありでしょうけども、私はこう決めました!
と言う訳で皆様それぞれの思想に従って細かい点は調整をお願いします。

下記のコマンドを実行します。

サーバー
mkdir /srv/publickey
chgrp publickey /srv/publickey
cat >/etc/ssh/sshd_config.d/publickey.conf <<___
Match User publickey
  X11Forwarding no
  AllowTcpForwarding no
  PermitTTY no
  PasswordAuthentication yes
  ForceCommand internal-sftp
  ChrootDirectory /srv/publickey
___

ssh 設定ファイルを作成したらsshdを再起動します。

サーバー
systemctl restart sshd

確認

準備

確認用のファイルとディレクトリを準備します。
どうも接続先ディレクトリは root がオーナーで、root 以外の書き込みが禁止されていないと、接続に失敗するようです。従って書き込み確認用にサブディレクトリを用意しておきます。

サーバー
cd /srv/publickey
echo hello,world >hello.txt
mkdir publickey
chgrp publickey publickey/
chmod g+w publickey/

こういう場合は権限に注意して確認します。

サーバー
# ls -l
total 2
-rw-r--r-- 1 root root      12 Feb 25 17:48 hello.txt
drwxrwxr-x 2 root publickey  3 Feb 25 18:03 publickey

接続と転送

別マシンからサーバーへ publickey ユーザーで ssh 接続します。私は Win10 マシンで実行しました。
下記のように、これは失敗します。

クライアント
>ssh publickey@secondary.home
publickey@secondary.home's password:
PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to secondary.home closed.

実は scp も失敗します。解説記事は見つからなかったのですが、どうも ssh 接続できないと scp も出来ないようです。

クライアント
>scp publickey@secondary.home:/hello.txt .
publickey@secondary.home's password:
protocol error: mtime.sec not present

sftp は成功します。

クライアント
>sftp publickey@secondary.home
publickey@secondary.home's password:
Connected to secondary.home.
sftp> pwd
Remote working directory: /
sftp> ls -l
-rw-r--r--    1 root     root           12 Feb 25 08:48 hello.txt
drwxrwxr-x    2 root     1001            2 Feb 25 09:03 publickey
sftp> get hello.txt
Fetching /hello.txt to hello.txt
/hello.txt                                                                            100%   12     0.8KB/s   00:00
sftp> cd publickey
sftp> put hello.txt
Uploading hello.txt to /publickey/hello.txt
hello.txt                                                                             100%   12     0.0KB/s   00:00
sftp> ls -l
-rw-rw-r--    1 1001     1001           12 Feb 25 09:04 hello.txt
sftp> pwd
Remote working directory: /publickey
sftp> exit

仕舞い

動作確認できたら/etcを Subversion 登録しましょう。

サーバー
svn st /etc | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -t svn add
svn ci /etc -m"set publickey user"

これで、サーバーマシンとクライアントマシンの間で公開鍵を送付する手段を確保できました。やったね:thumbsup_tone1:

0
1
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
0
1