🖥️

Debian 12 bookworm のインストール後に行う初期設定

2024/05/07に公開

Debian 公式サイトのスクリーンショット

この記事はインフラ初心者が纏めているため、あまり信用しないでください。この記事を参考にセットアップしたことによって被った損害・損失に対し、いかなる場合でも一切の責任を負いませんのでご了承ください。あくまでも自己責任でお願いします🙇‍♂️

最終的に目指す構成は以下の通り。

  • OS: Debian 12 bookworm - 本記事
  • web サーバー + PHP: FrankenPHP (Caddy + PHP8.3)
  • データベース: MariaDB

前置き

別の PC から SSH アクセスするために、一旦 Debian をインストールした PC でログインし ip -4 addr で IP アドレスを確認する。

確認した IP アドレスに SSH でアクセスする。

$ ssh usename@192.168.10.20

途中までは root で作業するので root になる。
既に root でログインしている場合は不要。

$ su -

コンソールと GRUB の画面解像度設定

出力される画面解像度を設定する。

# nano /etc/default/grub

- GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+ GRUB_CMDLINE_LINUX_DEFAULT=""
- GRUB_CMDLINE_LINUX=""
+ GRUB_CMDLINE_LINUX="video=1920x1080"
+ GRUB_GFXMODE=1920x1080
+ GRUB_GFXPAYLOAD_LINUX=keep

変更内容を反映させる。

# update-grub
# reboot now

OS を最新の状態にする

# apt update -y \
&& apt upgrade -y \
&& apt full-upgrade -y \
&& apt autoremove -y \
&& apt autoclean -y \
&& reboot now

vim コマンドの設定

Debian 12 の初期状態では vim はインストールされていないのでインストールする。

# apt remove -y nano && apt install -y vim

vim の設定ファイルを作成する。

# vi /etc/vim/vimrc.local

以下の内容を記述する。

syntax on
highlight Comment ctermfg=LightCyan
set mouse=a
set nocompatible
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,sjis,euc-jp
set fileformats=unix,dos,mac
set history=50
set ambiwidth=double
set tabstop=4
set shiftwidth=4
set expandtab
set smartindent
set ignorecase
set smartcase
set hlsearch
set incsearch
set number
set list
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%
set showmatch
set autoindent
set nowrap

行番号を一時的に非表示にする

vim でファイルを開いている状態で

:set nonu

一時的にタブキーでタブ文字を挿入できるようにする

vim でファイルを開いている状態で

:set noexpandtab

リモート接続時にクリップボードにコピーする

シフトを押しながらマウスで D & D して、Ctrl + C キーでコピーできる。このとき、行番号や改行記号を表示させている場合はそれも含めてコピーされてしまうので、一時的に行番号を非表示にするなどの作業が必要。

※リモートからのペーストは普段通りで大丈夫。

su コマンドを制限する

# vi /etc/pam.d/su

# auth       required   pam_wheel.so
+ auth       required   pam_wheel.so group=adm

sudo コマンドのインストールと設定

sudo コマンドをインストールして、ユーザー名 debian を sudo グループに所属させる。
※ ユーザー名 debian は例

# apt install -y sudo && usermod -aG sudo debian && visudo

シャットダウン系コマンドはパスワードなしで実行できるように、設定を書き換える。

# Cmnd alias specification
+ Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown, /usr/sbin/reboot, /usr/bin/systemctl

# Allow members of group sudo to execute any command
%sudo    ALL=(ALL:ALL) ALL
+ %sudo ALL=NOPASSWD: SHUTDOWN

OS のメイン言語を変更

SSH でリモートアクセスしたときに表示されるメッセージなどを日本語表記に対応するために必要なファイルをインストールする。

# apt -y install locales locales-all && localectl list-locales | grep -i ja
ja_JP.UTF-8

インストールが終了したら OS の言語設定を日本語にする。

# localectl set-locale LANG=ja_JP.UTF-8

続けてコンソールで使用する言語を設定する。バーチャルコンソールでログインしている場合は en を使用するようにする。

# vi /etc/bash.bashrc

if [ "$TERM" = linux ]; then
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
else
    export LANG=ja_JP.UTF-8
    export LC_ALL=ja_JP.UTF-8
fi

一旦再起動

# reboot now

ネットワークの設定

個人的な好き嫌いだけれど、ifupdown より dhcpcd の設定ファイルの方が好みなので dhcpcd にする。

dhcpcd のインストール

$ sudo apt remove -y ifupdown && sudo apt install -y dhcpcd

現在の IP アドレスを確認

IPv4 のアドレスを確認。
以下の出力結果の場合「192.168.10.20/24」が現在 PC に割り当てられている IP アドレス。

$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.10.20/24 brd 192.168.10.255 scope global noprefixroute enp1s0
       valid_lft forever preferred_lft forever

IPv6 のアドレスを確認。
以下の出力結果の場合「2400:4052:3741:2200:c13f:d945:4056:a04f/64」が現在 PC に割り当てられている IP アドレス。

$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever pref erred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2400:4052:3741:2200:c13f:d945:4056:a04f/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591893sec preferred_lft 604693sec
    inet6 fe80::516b:3c47:a3b6:e7fa/64 scope link
       valid_lft forever preferred_lft forever

デフォルトゲートウェイ(ルーター)の IPv4 アドレスを確認。
以下の出力結果の場合「192.168.10.1」がデフォルトゲートウェイ(ルーター)の IP アドレス。

$ ip -4 route
default via 192.168.10.1 dev enp1s0 src 192.168.10.20 metric 1002
192.168.10.0/24 dev enp1s0 proto dhcp scope link src 192.168.10.20 metric 1002

デフォルトゲートウェイ(ルーター)の IPv6 アドレスを確認。
以下の出力結果の場合「fe80::2a0:deff:fec8:a7d0」がデフォルトゲートウェイ(ルーター)の IP アドレス。

$ ip -6 route
2400:4052:3741:2200::/64 dev enp1s0 proto ra metric 1002 mtu 1500 pref medium
fe80::/64 dev enp1s0 proto kernel metric 256 pref medium
default via fe80::2a0:deff:fec8:a7d0 dev enp1s0 proto ra metric 1002 mtu 1500 pref medium

dhcpcd の設定

$ sudo vi /etc/dhcpcd.conf

以下の内容を末尾に追記する。

interface enp1s0
static ip_address=192.168.10.20/24
static routers=192.168.10.1
static ip6_address=2400:4052:3741:2200:c13f:d945:4056:a04f/64
static ip6_routers=fe80::2a0:deff:fec8:a7d0
static domain_name_servers=192.168.10.1 fe80::2a0:deff:fec8:a7d0

記述内容を保存したら、ネットワークアダプタを再起動させる。
OS の再起動はのちほど行う。

$ sudo systemctl restart dhcpcd

外部への通信テスト

IPv4 での接続テスト。

$ ping -c 4 -4 google.com
PING  (142.250.207.110) 56(84) bytes of data.
64 bytes from kix06s11-in-f14.1e100.net (142.250.207.110): icmp_seq=1 ttl=56 time=10.3 ms
64 bytes from kix06s11-in-f14.1e100.net (142.250.207.110): icmp_seq=2 ttl=56 time=10.5 ms
64 bytes from kix06s11-in-f14.1e100.net (142.250.207.110): icmp_seq=3 ttl=56 time=10.5 ms
64 bytes from kix06s11-in-f14.1e100.net (142.250.207.110): icmp_seq=4 ttl=56 time=10.6 ms

---  ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 10.306/10.479/10.581/0.103 ms

IPv6 での接続テスト。

$ ping -c 4 -6 google.com
PING google.com(kix06s10-in-x0e.1e100.net (2404:6800:400a:804::200e)) 56 data bytes
64 bytes from kix06s10-in-x0e.1e100.net (2404:6800:400a:804::200e): icmp_seq=1 ttl=111 time=16.2 ms
64 bytes from kix06s10-in-x0e.1e100.net (2404:6800:400a:804::200e): icmp_seq=2 ttl=111 time=13.6 ms
64 bytes from kix06s10-in-x0e.1e100.net (2404:6800:400a:804::200e): icmp_seq=3 ttl=111 time=13.5 ms
64 bytes from kix06s10-in-x0e.1e100.net (2404:6800:400a:804::200e): icmp_seq=4 ttl=111 time=13.6 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 13.549/14.219/16.166/1.123 ms

ファイアウォールの設定

コマンドを実行して ufw をインストールする。

$ sudo apt install -y ufw && sudo ufw status
Status: inactive

ステータスが表示されれば、正常にインストールされている。確認ができたら ufw を有効化する。

$ sudo ufw enable

一旦すべての通信を拒否する。必要になったときに必要な通信を個別に許可するのが安全。

$ sudo ufw default deny && sudo ufw reload
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

SSH の通信を許可する

$ sudo vi /etc/ufw/applications.d/ufw-loginserver

[SSH]
title=SSH server
description=SSH server
- ports=22/tcp
+ ports=12200/tcp


ポート番号は一例なので、ポート番号割り当てのルールの範囲ないで分かりやすいもので問題ない。編集が終わったら SSH の通信を許可する。

$ sudo ufw limit SSH && sudo ufw reload && sudo ufw status
Rule added
Rule added (v6)
Status: active

To                         Action      From
--                         ------      ----
SSH                        LIMIT       Anywhere
SSH (v6)                   LIMIT       Anywhere (v6)

ステータスが active となり、SSH がリストにあれば完了。

一度追加したルールを削除する

追加した削除したルールを削除する場合は、以下のコマンドを実行する。

$ sudo ufw delete limit SSH && sudo ufw reload

個別に削除する場合は

$ ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] SSH                        LIMIT IN    Anywhere
[ 2] SSH (v6)                   LIMIT IN    Anywhere (v6)

上記で表示された番号を指定する。

$ ufw delete 2 && sudo ufw reload

SSH の設定を変更する

/etc/ssh/sshd_config を環境に応じて各々設定する。

$ sudo vi /etc/ssh/sshd_config.d/custom.conf

Port 12200                              # SSH のポート番号を任意に変更(ufw で指定したポート番号)
Protocol 2                              # SSH のプロトコルを SSH2 のみにする
SyslogFacility AUTHPRIV                 # /var/log/secure に sshd のログを出力
LogLevel VERBOSE                        # ログの出力レベル
PermitRootLogin no                      # root でのログインを拒否
MaxAuthTries 2                          # 認証の試行回数を制限
PubkeyAuthentication yes                # 公開鍵での認証を許可
AuthorizedKeysFile .ssh/authorized_keys # 公開鍵の設置場所をユーザディレクトリ配下の .ssh/authorized_keys に変更
IgnoreUserKnownHosts yes                # /etc/ssh_known_hosts または ~/.ssh/known_hosts を無視
PasswordAuthentication no               # パスワード認証の可否
PermitEmptyPasswords no                 # パスワードが設定されていないアカウントの可否
ChallengeResponseAuthentication no      # チャレンジ/レスポンス認証を無効化
LogLevel VERBOSE                        # 出力するログのレベルを指定
AllowTcpForwarding no                   # SSHポートフォワードの禁止
AllowStreamLocalForwarding no           # SSHポートフォワードの禁止
GatewayPorts no                         # SSHポートフォワードの禁止
PermitTunnel no                         # SSHポートフォワードの禁止

$ sudo vi /etc/ssh/sshd_config

# PAM 認証を無効化
- UsePAM yes
+ UsePAM no

変更を反映させるために sshd を再起動する。

$ sudo systemctl restart sshd

SSH キーを設置

予め、別のマシンで公開鍵と秘密鍵を生成しておき、生成した公開鍵をセットする。

$ mkdir -p ~/.ssh && chmod 700 ~/.ssh && vi ~/.ssh/authorized_keys
$ chmod 400 ~/.ssh/authorized_keys

一旦再起動 その2

再起動させる前に、別のターミナルで ssh ログインができるか確認。ログインが上手くいかない場合は、再起動させずに設定を見直す。

$ sudo reboot now

curl や Git など必要最低限なパッケージをまとめてインストール

$ sudo apt install -y curl git build-essential mlocate ca-certificates gnupg lsb-release

Homebrew をインストール

Homebrew のインストールコマンドは公式サイトのトップページに記載がある。インストールに管理者権限は不要(管理者だとインストールできない)。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrew のパスを通す。

$ (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/debian/.bashrc && vi ~/.bashrc && brew -v

正常にパスを通すことができれば、バージョン情報が表示される。

その他

以下の内容は必要であれば、という内容。

Docker をインストール

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

USB の自動マウントに対応させる(autofs)

USB をさしたら自動でマウントさせる。

$ sudo apt install -y exfat-fuse autofs &&\
sudo ln -s /usr/sbin/mount.exfat-fuse /sbin/mount.exfat

autofs の設定ファイルを書き換る。

$ sudo vi /etc/auto.master

- #/misc   /etc/auto.misc
+ /misc   /etc/auto.misc

USB の UUID を調べる。事前に USB 端子に USB をさしておく。

$ ls -al /dev/disk/by-uuid/ | grep sd*
lrwxrwxrwx 1 root root  10  53 13:40 04D8-6FDC -> ../../sda1
lrwxrwxrwx 1 root root  10  53 13:43 10C0-AB67 -> ../../sdb1

USB の UUID を auto.misc に登録する。

$ sudo vi /etc/auto.misc

-fstype(ファイルシステムタイプ)オプションは、必要に応じて書き換える

+ usbdisk1	-fstype=exfat,umask=000	:/dev/disk/by-uuid/04D8-6FDC
+ usbdisk2	-fstype=exfat,umask=000	:/dev/disk/by-uuid/10C0-AB67

変更内容を適用させる。

$ sudo systemctl restart autofs

動作確認。

$ ls -al /misc/usbdisk1 /misc/usbdisk2
/misc/usbdisk1:
合計 64
drwxrwxrwx 1 root root 32768  11  1970  .
drwxr-xr-x 4 root root     0  53 13:59  ..
drwxrwxrwx 1 root root 32768  53 13:24 'System Volume Information'
-rwxrwxrwx 1 root root     0  53 13:25  test2.txt

/misc/usbdisk2:
合計 64
drwxrwxrwx 1 root root 32768  11  1970  .
drwxr-xr-x 4 root root     0  53 13:59  ..
drwxrwxrwx 1 root root 32768  53 13:24 'System Volume Information'
-rwxrwxrwx 1 root root     0  53 13:25  test1.txt

ディスク情報を確認

マウントされているディスク情報を確認。

$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=8015196k,nr_inodes=2003799,mode=755,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1607948k,mode=755,inode64)
/dev/mapper/wbsrvr--vg-root on / type ext4 (rw,relatime,errors=remount-ro)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k,inode64)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=11890)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
ramfs on /run/credentials/systemd-sysctl.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
ramfs on /run/credentials/systemd-sysusers.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
ramfs on /run/credentials/systemd-tmpfiles-setup-dev.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
/dev/nvme0n1p2 on /boot type ext2 (rw,relatime)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
ramfs on /run/credentials/systemd-tmpfiles-setup.service type ramfs (ro,nosuid,nodev,noexec,relatime,mode=700)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
/etc/auto.misc on /misc type autofs (rw,relatime,fd=6,pgrp=728,timeout=300,minproto=5,maxproto=5,indirect,pipe_ino=20629)

論理ボリュームのレポートを出力。

$ sudo lvs
  LV     VG        Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   wbsrvr-vg -wi-ao---- <416.36g
  swap_1 wbsrvr-vg -wi-ao----   59.60g

論理ボリュームをスキャン。

$ sudo lvscan
  ACTIVE            '/dev/wbsrvr-vg/swap_1' [59.60 GiB] inherit
  ACTIVE            '/dev/wbsrvr-vg/root' [<416.36 GiB] inherit

論理ボリュームのディスク使用量レポートを出力。

$ df -h /dev/wbsrvr-vg/root
ファイルシス                サイズ  使用  残り 使用% マウント位置
/dev/mapper/wbsrvr--vg-root   409G  2.7G  386G    1% /

バックアップファイルの作成

いざという時のために、バックアップの作成とリストアの予行練習は大切。

dd コマンドでディスク全体を外付けディスクに保存

システム全体のイメージファイルを外付けディスクに保存する。バックアップ元の最大ディスク容量分だけ消費するので注意(ex: 512GB の SSD に OS をインストールしている場合、外部ディスクも最低 512GB 必要)

$ sudo dd if=/dev/mapper/wbsrvr--vg-root of=/misc/usbdisk1/backup-202405031800.img bs=4M status=progress

dd コマンドで外付けディスク内のイメージファイルからリストア

$ sudo dd if=/misc/usbdisk1/backup-202405031800.img of=/dev/mapper/wbsrvr--vg-root bs=4M status=progress

locate コマンド(ファイル検索)

find コマンドは便利だが、よりシンプルに使用できる locate を使用。locate に検索はデータベースに依存しているため、事前にデータベースの作成が必要。データベースは通常 cron で 1 日に 1 回更新される。手動で更新させる場合は updatedb コマンドを実行する。

$ sudo updatedb 

実際のファイル検索。

$ locate ufw-loginserver
/etc/ufw/applications.d/ufw-loginserver

関連記事

Discussion