元ネタ Setting up my server: re-installing on an encripted LVM
OVHのVPSはカスタムISOをアップロードできないので、Debianを暗号化パーティションへインストールすることが出来ません。
そこで、リカバリモードからディスクを暗号化して、そこにdebootstrapを使って手動でDebianをインストールしていきます。
起動後のディスク暗号化解除はDropbearを使いSSH経由で行うので、記号を含んだランダムなパスワードを設定出来ます。
Rescue mode
事前にRescue modeを起動しておきます。(OSはDebian)
コントロールパネルの「Reboot in rescue mode」から起動できます。
起動までに3分位かかるようです。
起動が完了したら、SSHのパスワードが書かれたメールが届きます。
インストール後のポイント
インストール完了後、起動してもsshdやfirewallの設定は出来ていません。
そのためコントロールパネルのVNCからそれらの設定をする必要があります。
なので、管理者ユーザーのパスワードは簡単なものにしておいたほうが良いです。
ここからは実際に作業を行っていきます。
パーティションの操作などは後戻りが出来ない場合があるため、自己責任でお願いします。
1.apt
# apt update
# apt install cryptsetup lvm2 debian-archive-keyring debootstrap
2.パーティショニング
# fdisk /dev/sda
>o MBRテーブル作成
>n パーティションを新規作成
sda1,2ともにプライマリ(基本パーティション)で作成しました。
パーティションタイプは両方83(Linux)
sda1(/boot)には必ず起動フラグを付けましょう。
3.フォーマット
sda1(/boot)をext4でフォーマット(-Lはラベル)
# mkfs.ext4 -L boot /dev/sda1
4.LVMのセットアップ
4-1.sda2を暗号化
# cryptsetup -s 512 -c aes-xts-plain64 luksFormat /dev/sda2
Are you sure? (Type uppercase yes): YES ##実行するか?と聞かれるので大文字でYESと入力
Enter LUKS passphrase: パスワードを入力
Verify passphrase: パスワードの確認
4-2.UUIDを控えておく(のちのち必要)
# cryptsetup luksDump /dev/sda2 | grep UUID:
4-3.LVMボリュームグループを作成
# cryptsetup luksOpen /dev/sda2 VG_01
# pvcreate /dev/mapper/VG_01
# vgcreate vg0 /dev/mapper/VG_01
4-4.LVM論理ボリュームを作成
# lvcreate -n swap -l 1G vg0
# lvcreate -n root -l 100%FREE vg0
- nはラベル
- lは容量(K,M,G単位で指定できる。100%FREEで空いている全領域)
4-5.論理ボリュームをフォーマット
# mkfs.ext4 -L root /dev/mapper/vg0-root
# mkswap -L swap /dev/mapper/vg0-swap
5.マウント
作業ディレクトリ「/target」下にマウント
# mkdir /target
# mount /dev/mapper/vg0-root /target
# mkdir /target/boot
# mount /dev/sda1 /target/boot
# swapon /dev/mapper/vg0-swap
6.debootstrap
# debootstrap --arch amd64 stretch /target http://debian.mirrors.ovh.net/debian
--archは環境に合わせて指定
OVHを使っていない場合はミラーを"http://httpredir.debian.org/debian"などに設定する。
chrootで作業していく
# mount -o bind /dev /target/dev
# mount -t proc proc /target/proc
# mount -t sysfs sys /target/sys
# XTERM=xterm-color LANG=C.UTF-8 chroot /target /bin/bash
8.各種設定
8-1.crypttab
# nano /etc/crypttab
VG_01 UUID=XXXX-XXXX-XXXX-XXXX none luks
UUIDは「4-2.UUIDを控えておく」で控えておいたもの
8-3.mtab
/etc/mtabに依存しているツールのためにシンボリックリンクを作成
# ln -sf /proc/mounts /etc/mtab
9.ネットワーク周り
9-1.interfaces
9-1-1.DHCPの場合
# nano /etc/network/interfaces (以下を追記)
(ens3の設定が存在する場合はコメントアウトする。)
auto ens3
iface ens3 inet dhcp
iface ens3 inet6 auto
dhcp 1
iface ens3 inet6 dhcp
9-1-2.手動(static)で設定する場合
# nano /etc/network/interfaces (以下を追記)
(ens3の設定が存在する場合はコメントアウトする。)
auto ens3
iface ens3 inet static
address xxx.xxx.xxx.xxx/32
gateway xxx.xxx.xxx.aaa
pre-up /sbin/ip addr flush dev ens3 || true
iface ens3 inet6 static
address xxxx:xxxx:xxxx:xxxx::1/128
gateway aaaa:aaaa:aaaa:aaaa::1
post-up /sbin/ip -6 route add aaaa:aaaa:aaaa:aaaa::1 dev ens3
post-up /sbin/ip -6 route add default via aaaa:aaaa:aaaa:aaaa::1
pre-down /sbin/ip -6 route del aaaa:aaaa:aaaa:aaaa::1 dev ens3
pre-down /sbin/ip -6 route del default via aaaa:aaaa:aaaa:aaaa::1
IPv4Address=xxx.xxx.xxx.xxx
IPv4Gateway=xxx.xxx.xxx.aaa
IPv6Address=xxxx:xxxx:xxxx:xxxx::1
IPv6Gateway=aaaa:aaaa:aaaa:aaaa::1
IPv6使わないならinet6を追加しない
IPアドレス/ゲートウェイの確認方法
IPアドレスとサブネットを表示
# ip a
デフォルトゲートウェイを表示
>||
# ip route list #IPv4
# ip -6 route list #IPv6
参考 Configuring IPv6 on dedicated servers | OVH Guides
9-2.sysctl.conf
IPv6を手動で設定した場合に必要(DHCPの場合はスキップ)
# nano /etc/sysctl.conf (以下を追記)
# Disable IPv6 autoconf
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.ens3.autoconf = 0
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.ens3.accept_ra = 0
9-3.resolv.conf
# nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
9-4.hostname
# nano /etc/hostname
# hostname [ホストネーム]
# nano /etc/hosts
127.0.1.1 ホストネーム
# echo -e '0.0 0 0.0\n0\nUTC' > /etc/adjtime
# dpkg-reconfigure tzdata #タイムゾーンの設定
11.APTミラー
# nano /etc/apt/sources.list (以下を上書き)
deb http://debian.mirrors.ovh.net/debian stretch main contrib non-free
deb http://debian.mirrors.ovh.net/debian stretch-updates main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
# nano /etc/apt/apt.conf.d/02recommends
推奨パッケージを無効化
APT::Install-Recommends "False";
# apt update
12.Dropbear
SSHキーペアを作成しておく
12-1.公開鍵の設定
# mkdir -p /etc/dropbear-initramfs
# nano /etc/dropbear-initramfs/authorized_keys
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/cryptroot-unlock" ssh-rsa xxxxxxxxxxxx...
公開鍵の前のオプションは「cryptroot-unlock」コマンドのみ実行可能にするもの。
今後authorized_keys,/etc/crypttabなどを変更することがあれば、その都度必ず「update-initramfs -u」コマンドを実行すること。
12-2.apt
# apt install makedev cryptsetup lvm2 ssh dropbear busybox ssh initramfs-tools locales linux-image-amd64 grub-pc kbd console-setup
インストールの途中でGrubのインストール先を聞かれるので(sda1,2ではなく)sdaを選択する
12-3.initrdの中身を確認
# zcat /boot/initrd.img-* | cpio -t conf/conf.d/cryptroot \
etc/lvm/lvm.conf etc/dropbear/\* root\*/.ssh/authorized_keys \
sbin/dropbear | sort
実行すると以下のように出力されるはず
conf/conf.d/cryptroot
etc/dropbear/config
etc/dropbear/dropbear_dss_host_key
etc/dropbear/dropbear_ecdsa_host_key
etc/dropbear/dropbear_rsa_host_key
etc/lvm/lvm.conf
root-l2oUNW/.ssh/authorized_keys
sbin/dropbear
12-4.cryptrootの中身を確認
# zcat /boot/initrd.img-* | cpio -i --to-stdout conf/conf.d/cryptroot
これらの設定が正確ならGrubの設定に移る
# nano /etc/default/grub
GRUB_CMDLINE_LINUX="ip=:::::ens3:dhcp"
13-2.手動(static)の場合
# nano /etc/default/grub
GRUB_CMDLINE_LINUX="ip=xxx.xxx.xxx.xxx::xxx.xxx.xxx.aaa:255.255.255.255"
サブネットマスクは/32みたいに省略しないこと
xxx.xxx.xxx.xxxはIPアドレス
xxx.xxx.xxx.aaaはゲートウェイ
13-3.Grubをアップデート
# update-grub2
14.その他の設定
14-1.fsckを自動実行 お好みで(ファイルシステムのチェック/修復)
有効にしてもいいけど起動に時間がかかる
# nano /etc/default/rcS (以下を追記)
FSCKFIX=yes
14-2.各種ツールのインストール
# apt install less ntpdate sudo
14-3.管理者ユーザを設定
# adduser ユーザ名
# adduser ユーザ名 sudo #(sudoグループに追加)
# adduser ユーザ名 adm #(admグループに追加(/var/logなどが閲覧できる?)
# passwd ユーザ名 #(簡単なものを設定しておく)
# passwd root
# exit #(chrootから抜ける)
# umount /target/{dev,proc,sys,boot}
# umount /target
# swapoff -a
# lvchange -an /dev/mapper/vg0-*
# cryptsetup luksClose VG_01
umount出来ない場合
lsofで"/target"を使用中のプロセスを表示させる。
# lsof | grep '/target/'
/target/bin/bashが使用中なのでキルする。
# kill -9 bashのpid
アンマウント
# umount /target
後はコントロールパネルから再起動する。
起動後SSHでLuksを解除した後、コントロールパネルのVNCからログインして、SSHとかfirewallを設定する。
起動時にSSHでLuksの解除が出来ない場合
リカバリモードでもう一度設定し直してください。
手順
# apt update
# apt install lvm2 cryptsetup
# cryptsetup luksOpen /dev/sda2 VG_01
# vgchange -aay (LVMボリュームを自動検出)
# mkdir /target
# mount /dev/mapper/vg0-root /target
# mount -o bind /dev /target/dev
# mount -t proc proc /target/proc
# mount -t sysfs sys /target/sys
# chroot /target mount -a (fstabを自動で読み込んでマウント(上手くいかないなら手動で)
# XTERM=xterm-color LANG=C.UTF-8 chroot /target /bin/bash
これで作業環境は整ったので、initrdの生成、Grubの編集などをやり直してください。