Debian 12 bookworm のインストール後に行う初期設定
この記事はインフラ初心者が纏めているため、あまり信用しないでください。この記事を参考にセットアップしたことによって被った損害・損失に対し、いかなる場合でも一切の責任を負いませんのでご了承ください。あくまでも自己責任でお願いします🙇♂️
最終的に目指す構成は以下の通り。
- 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 5月 3 13:40 04D8-6FDC -> ../../sda1
lrwxrwxrwx 1 root root 10 5月 3 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 1月 1 1970 .
drwxr-xr-x 4 root root 0 5月 3 13:59 ..
drwxrwxrwx 1 root root 32768 5月 3 13:24 'System Volume Information'
-rwxrwxrwx 1 root root 0 5月 3 13:25 test2.txt
/misc/usbdisk2:
合計 64
drwxrwxrwx 1 root root 32768 1月 1 1970 .
drwxr-xr-x 4 root root 0 5月 3 13:59 ..
drwxrwxrwx 1 root root 32768 5月 3 13:24 'System Volume Information'
-rwxrwxrwx 1 root root 0 5月 3 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