能書き
私の自宅環境で、サーバもクライアントも、マシンが一通り揃ってきました。俺様サーバー構築記 - 基本方針でやりたい事として挙げた事を手掛ける段階に、いよいよなってきました。
そして早速、最初の「FreeNASとはiSCSIではなくてNFSでストレージを共有」でつまづきました…
NFSの最新プロトコル NFSv4 を使うには Kerberos を立てなければならないとの事。 Kerberos サーバ自体は FreeNAS が持っているようなので、これを利用すれば良いのかも知れませんが。その前に Kerberos 認証とは何か?という所から勉強しなければなりません。
NFSv3 でも良いんですが、そうするとユーザIDがマシン間で一致していないとまずそうです。
色々面倒臭え… Kerberos はひとまず諦めました。
その代わり、やりたい事の一つ「データの自動バックアップシステムの確立」を前倒して手掛けます。サーバマシンのデータを FreeNAS にバックアップします。と言っても rsync では面白くありません。折角 ZFS にしているので、ここは ZFS データ送受信を試みます。
そして ZFS データの通信路には ssh を使う訳ですが、ssh については dropbear というコマンドを以前使ってみたので、これを採用します。折角なのでノートパソコンにも dropbear を入れて、サーバに dropbear でログインできるようにします。
参考文献: Dropbear + 公開鍵認証
今回は dropbear の設定まで。ZFS データ転送は次回にします。
dropbear・デスクトップパソコン(サーバ側)
インストールと起動
例によってスナップショットを撮っておいて、それからインストールします。
# zfs snapshot tank/main@$(date +%Y%m%d_%H%M%S)_before_dropbear
# pacman -S dropbear
相変わらず、デフォルトの設定ファイル /etc/dropbear
は無いようです。
# ls -a /etc/dropbear
. ..
そしてデフォルト設定ではセキュリティがガタガタなのも相変わらずのようです。
# cat /usr/lib/systemd/system/dropbear.service
[Unit]
Description=Dropbear SSH Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/dropbear -F -P /run/dropbear.pid -R
[Install]
WantedBy=multi-user.target
systemd ドロップインファイルを利用して設定を変更します。一般的なsshdの防犯設定の常識に従って、以下の条件を追加しておきます。
- rootの直接ログイン禁止(rootユーザに絞り込んだ攻撃への対策)
- パスワードログイン禁止(ブルートフォースアタック対策)
- ポート番号の変更(攻撃の前提となるポートを絞らせない) →今回はポート番号60022にしておきます。
ポート番号に関しては色々意見があるようですし、技術面に限ってみても付けていいポート番号の範囲があるようですので、調べて調整しましょう。
参考文献: 2.3.2 ドロップインファイル - 2.3 ユニットファイルの編集 - 2 ユニットファイル - systemd - ArchWiki
# export SYSTEMD_EDITOR=vi
# systemctl edit dropbear
〈vi が起動するので、下記の通りに編集〉
# cat /etc/systemd/system/dropbear.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dropbear -RFgswp 60022
そして起動。このまま起動しっぱなしにするよう設定します。
# systemctl enable dropbear
Created symlink /etc/systemd/system/multi-user.target.wants/dropbear.service -> /usr/lib/systemd/system/dropbear.service.
# systemctl start dropbear
# systemctl status dropbear
* dropbear.service - Dropbear SSH Server
Loaded: loaded (/usr/lib/systemd/system/dropbear.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/dropbear.service.d
`-override.conf
Active: active (running) since Mon 2019-05-06 11:29:34 JST; 10s ago
Main PID: 1288 (dropbear)
Tasks: 1 (limit: 4915)
Memory: 400.0K
CGroup: /system.slice/dropbear.service
`-1288 /usr/bin/dropbear -RFgswp 60022
May 06 11:29:34 〈マシン名〉 systemd[1]: Started Dropbear SSH Server.
May 06 11:29:34 〈マシン名〉 dropbear[1288]: Not backgrounding
一般ユーザ作成
ログインする為の一般ユーザを作成します。
# useradd -m taro
# passwd taro
New password: 〈taro のパスワード〉
Retype new password: 〈確認の為 taro のパスワードをもう一度〉
passwd: password updated successfully
なお、鍵はクライアント側で作成してからコピーします。詳細は後程。
dropbear・ノートパソコン(クライアント側)
インストール
こちらもスナップショットを撮ってからインストールします。
$ su
パスワード:
# zfs snapshot tank/main@$(date +%Y%m%d_%H%M%S)_before_dropbear
# pacman -S dropbear
〈省略〉
# exit
exit
秘密鍵と公開鍵を生成
(2019/05/12 修正ここから)
dropbearkey
コマンドを使用して秘密鍵と公開鍵を作成します。暗号強度の観点から、楕円曲線暗号 ecdsa を使用します。2007年における推奨(予想)では、2019年は 224 ビットの鍵長で十分と考えられていたようです。しかし dropbearkey
コマンドでは 224 ビットを指定できません。今回は 256 ビットにしました。
参考文献: 図2 暗号の安全性指標 - 暗号の安全性評価 - NICT NEWS
(2019/07/17 修正ここから)
また、dropbearkey
コマンドは標準出力に公開鍵を出力しますが、余計な行もくっつけてくれます。 authorized_keys
ファイルには公開鍵の行だけを書き込むようにします。
$ mkdir ~/.ssh
$ cd ~/.ssh
$ dropbearkey -t ecdsa -s 256 -f id_dropbear | tail -n+2 | head -n1 >authorized_keys
Generating 256 bit ecdsa key, this may take a while...
(2019/07/17 修正ここまで)
(2019/05/12 修正ここまで)
公開鍵をサーバにコピー
公開鍵 authorized_keys
をサーバにコピーする方法ですが。サーバもクライアントも手元にあるのでUSBメモリでも使ってパパッと持ち運べば十分なのですが、今回は一捻りしてみます。
クライアント側にインストールした dropbear にはサーバも含まれているので、これをパスワードOKのオプションで起動し、サーバ側からパスワード認証で接続します。コピーが完了したら dropbear を終了させます。
$ su
パスワード:
# systemctl start dropbear
IPアドレスは hostname -i
で取得できるようです。これは便利!っていうか、 hostname
なんて基本中の基本のコマンドなんだから知っとけよって話ですね… スミマセン。
# hostname -i
10.0.0.246
ここからはデスクトップパソコン(サーバ側)の操作です。
(2019/05/06 修正ここから)
dbclient
の標準出力をリダイレクトして .ssh/authorized_keys
に追記しようとすると、なぜか上書きになってしまいます。原因不明。仕方が無いので一捻りしています。
# su - taro
$ mkdir .ssh
$ dbclient 10.0.0.246 "cat .ssh/authorized_keys" | cat >>.ssh/authorized_keys
Host '10.0.0.246' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:67)
Do you want to continue connecting? (y/n)
taro@10.0.0.246's password: 〈taro のパスワード〉
$ ls -l .ssh
total 3
-rw-r--r-- 1 taro taro 840 May 6 14:46 authorized_keys
-rw-r--r-- 1 taro taro 840 May 6 14:46 known_hosts
$ rm .ssh/known_hosts
$ exit
exit
# hostname -i
10.0.0.251
(2019/05/06 修正ここまで)
.ssh/known_hosts
は削除しておきます。一応。
これで公開鍵をサーバへコピーできたので、クライアントから接続して動作確認。
# exit
exit
$ dbclient -p 60022 10.0.0.251 "hostname"
Host '10.0.0.251' is not in the trusted hosts file.
(ecdsa-sha2-nistp256 fingerprint sha1!! 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:01:23:45:78)
Do you want to continue connecting? (y/n) y
〈サーバのマシン名〉
dropbear サーバを止める
$ su
パスワード:
# systemctl stop dropbear
そしてうっかり起動しないようにしておきましょう。
# export SYSTEMD_EDITOR=vi
# systemctl edit dropbear
〈vi が起動するので、下記の通りに編集〉
# cat /etc/systemd/system/dropbear.service.d/override.conf
[Service]
ExecStart=
# systemctl start dropbear
Failed to start dropbear.service: Unit dropbear.service has a bad unit file setting.
See system logs and 'systemctl status dropbear.service' for details.
# exit
exit
これでOKでしょう!やったね!