kazeno memo

メモとか

OVHのVPSへDebianを手動インストール(debootstrap & LUKS)

元ネタ 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)

インストール後のポイント

インストール完了後、起動してもsshdfirewallの設定は出来ていません。
そのためコントロールパネルの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"などに設定する。

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

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 ホストネーム

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-1.DHCPの場合

# 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

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の編集などをやり直してください。