/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

Rockstor をインストール時に暗号化してリモートから鍵入力できるようにする話

NASLinuxディストリビューションのRockstorを使ってお家のNASを作り直したので、そのときにやったことを備忘録として書き残しておきます。

再構築の目的

私は以前からRockstorを入れたNASサーバーを運用していたのですが、以下の点が気になっていたのでOSごとインストールし直しを行いました。

  • UEFIでなくBIOSブートでインストールされている
  • Data diskが暗号化されていない
  • data diskの鍵を入れるOS diskも暗号化されていない
  • RAIDを組むためにData diskを2枚指したのにRAIDを組めていない

再構築の主目的は以下の2点になります。

  • RockstorのOSの入っているdisk(以降OS disk)含めて暗号化する
  • Dataを入れるdisk(以降data disk)をRAID1にする

なお、RockstorをUEFIブートするようインストールする件に関しては、途中で発生した問題をすべて解決できなかったので諦めました。詳細は最後におまけで記します。

暗号化の話

インストール

最近のインストーラーはとても親切なので、指示に従っているだけでDisk暗号化をしつつOSのインストールができました。 わからないことがあっても、RockstorはRHELディストリビューションをベースとしているので、FedoraCentOSのドキュメントを参考にすれば良いでしょう。

ディスク暗号化のリモート解除

さて、ここが私がこの備忘録を書いたきっかけになります。

インストール後、実際に起動してみて困ったのが起動時のディスク暗号化解除方法です。 Rockstorでディスク暗号化を行いつつインストールを行うと、起動時にディスク暗号化を解除するためのパスコード入力を求められます。 しかし、うちのサーバーマシンは基本的にディスプレイとキーボードを外して運用していることに加え、頻繁に電源をON//OFFするので、毎回起動時にパスワード入力を求められると不便です。

これを解決するために、はUSBメモリに鍵を入れ、起動時に自動で復号する方法やSSH経由でリモートから鍵入力をする方法がありますが、今回は後者を試してみました。この方法を使うメリットとしては、復号鍵が対象から分離されることと、USBメモリなど追加で必要なものがないので気軽に試せる点があるでしょう。

基本的な作業手順は以下のサイトのStep6以降を進めるだけです。

https://www.vultr.com/docs/install-and-setup-centos-7-to-remotely-unlock-lvm-on-luks-disk-encryption-using-ssh#Step_6__Install_Dracut_Crypt_SSH

こちらも参考になります。

https://github.com/dracut-crypt-ssh/dracut-crypt-ssh

Rockstorのマシンにrootでログインした後、dracut-crypt-sshパッケージを入れます。

sudo yum install wget -y
sudo wget -O /etc/yum.repos.d/rbu-dracut-crypt-ssh-epel-7.repo https://copr.fedorainfracloud.org/coprs/rbu/dracut-crypt-ssh/repo/epel-7/rbu-dracut-crypt-ssh-epel-7.repo
sudo yum install dracut-crypt-ssh -y

次に/etc/default/grubを開いてgrubのエントリを修正し、起動時にIPアドレスを得るように設定します。

アドレス取得をDHCPで行う場合は、GRUB_CMDLINE_LINUX="crashkernel=autord.luks.uuid= の間に rd.neednet=1 ip=dhcp を入れれば設定完了です。

static IPを割り当てたい方は以下を参照してください。

https://wiki.archlinux.jp/index.php/Dm-crypt/%E7%89%B9%E8%A8%98%E4%BA%8B%E9%A0%85#root_.E3.81.AA.E3.81.A9.E3.81.AE.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AE.E3.83.AA.E3.83.A2.E3.83.BC.E3.83.88.E8.A7.A3.E9.99.A4

設定後のGRUB_CMDLINE_LINUXの行はこんな感じになります。

GRUB_CMDLINE_LINUX="crashkernel=auto rd.neednet=1 ip=dchp rd.luks.uuid=luks-xxxx rhgb quiet"

設定が完了したら以下のコマンドでgrubのconfigを生成します。

sudo grub2-mkconfig -o /etc/grub2.cfg

次にinitramfs内に入れるSSHの設定を記入していきます。

/etc/dracut.conf.d/crypt-ssh.conf を開いて以下を追記します。

dropbear_acl="/etc/dropbear/keys/authorized_keys"
dropbear_ecdsa_key="/etc/dropbear/keys/ssh_ecdsa_key"
dropbear_rsa_key="/etc/dropbear/keys/ssh_rsa_key"

ファイルを保存したら、ここで設定した場所に新しいSSH鍵を生成します。 この鍵は起動時にディスク復号パスワードを受け取るためのSSH通信に利用されます。

sudo mkdir -p /etc/dropbear/keys/; sudo chmod /etc/dropbear/keys/
sudo ssh-keygen -t ecdsa -f /etc/dropbear/keys/ssh_ecdsa_key
sudo ssh-keygen -t rsa -f /etc/dropbear/keys/ssh_rsa_key
sudo chmod 400 /etc/dropbear/keys/*_key; sudo chmod 444 /etc/dropbear/keys/*.pub

次に /etc/dropbear/keys/authorized_keys を開き、ディスク復号鍵を送るための、接続元マシンの公開鍵を記述します。ここで記述する鍵はrsaの公開鍵である必要があります。dropbearを使う場合はed25519鍵でアクセスできないようです。ここ、ドハマりポイントでした。

最後にdracutコマンドでinitramfsを生成して再起動すれば設定完了です。

sudo dracut -f && sudo reboot

再起動後、サーバーにユーザーroot、ポート222で接続し、console_authコマンド実行後にディスク復号のパスワードを入れればOSが立ち上がります。

なお、このアンロックの手順も自動化できるようなのですが、とりあえず今日はここまでで。詳しい話は以下を参照。

https://github.com/dracut-crypt-ssh/dracut-crypt-ssh#34-unlocking-using-the-unlock-command

data disk暗号化

data diskの暗号化は公式のドキュメントがあるのでこちらを参照して作成してください。

http://rockstor.com/docs/luks/luks.html

RAIDを組む場合は先にディスク暗号化を済ませてからpool割当のところで設定すれば作れます。詳しくは以下参照です。

http://rockstor.com/docs/pools-btrfs.html#redundancy-profiles

おまけ: RockstorがUEFIブートでインストールできない話

結論から話せば、少なくとも2019年2月ごろのRockstorはUEFIブートからインストールができませんでした。以下理由を記しますが、メモをとっていなかったため誤りが含まれるかもしれません。

まず、インストーラーのISOをそのままUSBメモリに書き込むとUEFIブートしません。

これはfatでフォーマットしたUSBメモリにISOの中身を書き込むと回避できますが、今度は立ち上がったKernelがrootfsをマウントできず失敗します。

これはどうやらrootfsのラベル指定がUSBメモリのラベルを指していないことが原因のようで、grub.cfgを書き換えてUSBメモリのラベルで参照できるようにすると解決します。

この修正でインストーラーが立ち上がるところまで進みますが、インストール途中にエラーが起きて先に進めない問題が発生したため、解決を諦めました。

おしまい

おしまい。