元ネタ 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のパスワードが書かれたメールが届きます。
partition構成
sdaがVPSのメインディスクです。
(実際にはレスキューモードのDebianがsda、VPSのディスクがsdbになっているので注意。)
sda ├sda1 /boot └sda2 LVM physical volume └VG_01 LVM volume group ├vg0 swap └vg1 / (debian root)
参考(LVMについて)
3. LVM(Logical Volume Manager)(第2章ディスク管理〜上級:基本管理コースII)
インストール後のポイント
インストール完了後、起動しても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)には必ず起動フラグを付けましょう。
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"などに設定する。
7.chroot
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-2.fstab
# nano /etc/fstab
# file system mount point type option dump pass LABEL=root / ext4 errors=remount-ro 0 1 LABEL=boot /boot ext4 rw,nosuid,nodev 0 2 LABEL=swap none swap sw 0 0
参考 https://www.debian.org/releases/stable/mips/apds03.html.ja#idm3749
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 a デフォルトゲートウェイを表示 >|| # ip route list #IPv4 # ip -6 route list #IPv6
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 ホストネーム
10.タイムゾーン
# 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の設定に移る
13.Grub
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
15.chrootを終了
# 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の編集などをやり直してください。