484 lines
13 KiB
Plaintext
484 lines
13 KiB
Plaintext
.docname {System Configuration}
|
|
.include {docs}
|
|
|
|
Configure the system for initial boot.
|
|
|
|
## File System Table
|
|
|
|
Generate the file system table.
|
|
|
|
```sh
|
|
genfstab -U /mnt >> /mnt/efc/fstab
|
|
```
|
|
|
|
Check the table that was generated in `/mnt/etc/fstab`.
|
|
|
|
## Change Root
|
|
|
|
Change root into the new system
|
|
|
|
```sh
|
|
arch-chroot /mnt
|
|
```
|
|
|
|
> Tip: From this point onwards you will only be able to access programs that we previously installed using the
|
|
> `pacstrap` command. So for editing text files, you will need to use `neovim` with the `nvim` command instead of `vim`.
|
|
> You can install additional programs with `pacman -S <package name>` at any time if you need more tools.
|
|
|
|
## Time Zone
|
|
|
|
Configure the correct time zone.
|
|
|
|
```sh
|
|
ln -sf /usr/sahre/zoneinfo/<Region>/<City> /etc/localtime
|
|
```
|
|
|
|
.example {Europe/Berlin}
|
|
```sh
|
|
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
|
|
```
|
|
|
|
Then update the system clock with `hwclock --systohc`.
|
|
|
|
## Localization
|
|
|
|
Edit the file `/etc/locale.gen` and uncomment all needed locales. Generate the locales afterwards by running
|
|
`locale-gen`.
|
|
|
|
.example {Installed Localizations}
|
|
I usually enable the following locales onmy systems:
|
|
- `de_DE.UTF-8 UTF-8`
|
|
- `de_DE ISO-8859-1`
|
|
- `de_DE@euro ISO-8859-15`
|
|
- `en_GB.UTF-8 UTF-8`
|
|
- `en_GB ISO-8859-1`
|
|
- `en_US.UTF-8 UTF-8`
|
|
- `en_US ISO-8859-1`
|
|
|
|
Create the file `/etc/locale.conf` and set the `LANG` variable as well as other environment variables accordingly. The
|
|
settings depend on you rlocation and your personal preference
|
|
|
|
.example {Localization}
|
|
```ini
|
|
LANG=en_GB.UTF-8
|
|
LANGUAGE=en_GB.UTF-8
|
|
LC_CTYPE=en_GB.UTF-8
|
|
LC_NUMERIC=en_GB.UTF-8
|
|
LC_TIME=en_GB.UTF-8
|
|
LC_COLLATE=en_GB.UTF-8
|
|
LC_MONETARY=de_DE.UTF-8
|
|
LC_MESSAGES=en_GB.UTF-8
|
|
LC_PAPER=de_DE.UTF-8
|
|
LC_NAME=de_DE.UTF-8
|
|
LC_ADDRESS=de_DE.UTF-8
|
|
LC_TELEPHONE=de_DE.UTF-8
|
|
LC_MEASUREMENT=de_DE.UTF-8
|
|
LC_IDENTIFICATION=de_DE.UTF-8
|
|
```
|
|
|
|
Persist the settings of console keyboard layout and font. Create the file `/etc/vconsole.conf`:
|
|
|
|
```sh
|
|
FONT=eurlatgr
|
|
KEYMAP=de-latin1-nodeadkeys
|
|
```
|
|
|
|
## Network Configuration
|
|
|
|
### Hostname
|
|
|
|
Set a hostname in `/etc/hostname`
|
|
|
|
> Tip: For advice on choosing a hostname, see [RFC 1178][rfc-1178]. As explained in [hostname(7)][hostname-7], it must
|
|
> contain from 1 to 63 characters, using only lowercase `a` to `z`, `0` to `9`, and `-`, and must not start with `-`.
|
|
|
|
Install Network Manager to the network interfaces of the system
|
|
|
|
```sh
|
|
pacman -S networkmanager nm-connection-editor network-manager-applet
|
|
```
|
|
|
|
Then enable the systemd services for Network Manager
|
|
|
|
```sh
|
|
systemctl enable NetworkManager
|
|
systemctl enable systemd-resolved
|
|
systemctl enable systemd-timesyncd
|
|
```
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/20-connectivity.conf` with the following content
|
|
|
|
```ini
|
|
[connectivity]
|
|
uri=https://zechert.net/connectivity_check.txt
|
|
```
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/10-dns.conf` with the following content
|
|
|
|
```ini
|
|
[main]
|
|
dns=systemd-resolved
|
|
```
|
|
|
|
### Use Advertised NTP Servers
|
|
|
|
To use the NTP Servers advertised by the DHCP Server, create a new network manager dispatcher script in
|
|
`/etc/NetworkManager/dispatcher.d/10-update-timesyncd` with the following content
|
|
|
|
```sh
|
|
#!/bin/sh
|
|
|
|
[ -z "$CONNECTION_UUID" ] && exit 0
|
|
INTERFACE="$1"
|
|
ACTION="$2"
|
|
|
|
case $ACTION in
|
|
up | dhcp4-change | dhcp6-change)
|
|
[ -n "$DHCP4_NTP_SERVERS" ] || exit 0
|
|
mkdir -p /etc/systemd/timesyncd.conf.d
|
|
cat <<-THE_END >"/etc/systemd/timesyncd.conf.d/ntp-${CONNECTION_UUID}.conf"
|
|
[Time]
|
|
NTP=$DHCP4_NTP_SERVERS
|
|
THE_END
|
|
systemctl restart systemd-timesyncd.service
|
|
;;
|
|
down)
|
|
rm -f "/etc/systemd/timesyncd.conf.d/ntp-${CONNECTION_UUID}.conf"
|
|
systemctl restart systemd-timesyncd.service
|
|
;;
|
|
esac
|
|
```
|
|
|
|
Make the script executable with `chmod +x /etc/NetworkManager/dispatcher.d/10-update-timesyncd`.
|
|
|
|
Create the following file `/etc/systemd/system/networkdown.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Wants=network-online.target
|
|
After=network.target network-online.target
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
ExecStart=/bin/true
|
|
ExecStop=/bin/sh -c 'rm -f /etc/systemd/timesyncd.conf.d/ntp-*.conf'
|
|
RemainAfterExit=yes
|
|
|
|
[Install]
|
|
WantedBy=suspend.target
|
|
```
|
|
|
|
Enable the service with `systemctl enable networkdown`.
|
|
|
|
### Configure MAC Address Randomization
|
|
|
|
MAC randomization can be used for increased privacy by not disclosing the real MAC address to the network.
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/10-random-mac.conf` with the following content:
|
|
|
|
```ini
|
|
[device]
|
|
wifi.scan-rand-mac-address=yes
|
|
|
|
[device-mac-randomization]
|
|
wifi.scan-rand-mac-address=yes
|
|
|
|
[connection-mac-randomization]
|
|
ethernet.cloned-mac-address=stable
|
|
wifi.cloned-mac-address=stable
|
|
```
|
|
|
|
### Enable IPv6 Privacy Extensions
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/10-ipv6-privacy.conf` with the following content:
|
|
|
|
```ini
|
|
[connection]
|
|
ipv6.ip6-privacy=2
|
|
```
|
|
|
|
Create the file `/etc/sysctl.d/40-ipv6.conf` with the following content:
|
|
|
|
```ini
|
|
net.ipv6.conf.all.use_tempaddr=2
|
|
net.ipv6.conf.default.use_tempaddr=2
|
|
```
|
|
|
|
### Configure a unique DUID per connection
|
|
|
|
NetworkManager uses DUID-UUID from `/etc/machin-id` for all DHCPv6 connections. This might be a security breach.
|
|
Instead, configure NetworkManager to create unique DUIDs for each connection.
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/02-duid.conf` with the following content
|
|
|
|
```ini
|
|
[connection]
|
|
ipv6.dhcp-duid=stable-uuid
|
|
```
|
|
|
|
### Enable DNSSEC
|
|
|
|
Create the file `/etc/systemd/resolved.conf.d/30-dnssec.conf` with the following content
|
|
|
|
```ini
|
|
[Resolve]
|
|
DNSSEC=true
|
|
```
|
|
|
|
> Warning: This will break name resolution for all hostnames that do not offer DNSSEC or that are resolved by
|
|
> nameservers that do not support DNSSEC. This can break resolution to internal hostnames (e.g. Company Intranet) as
|
|
> well es some public sites.
|
|
|
|
### Disable mDNS
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/30-mdns.conf` with the following content
|
|
|
|
```ini
|
|
[connection]
|
|
connection.mdns=0
|
|
```
|
|
|
|
Create the file `/etc/systemd/resolved.conf.d/30-mdns.conf` with the following content
|
|
|
|
```ini
|
|
[Resolve]
|
|
MulticastDNS=no
|
|
```
|
|
|
|
> Warning: Disabling mDNS will break nameserver-less resolution of local hostnames from the same network (DNS via
|
|
> multicast DNS Queries). This can break auto-discovery and access to other local machines like local printers, sambda
|
|
> network drives, other devices, etc.
|
|
>
|
|
> Change this to `connection.mdns=1` to fully enable mDNS, `connection.mdns=2` to enable resolution but not announcement
|
|
> of your own machine to the network. For both of these oiptions, set `MulticastDNS=yes` to enable the functionality in
|
|
> systemd-resolved (or delete the file).
|
|
|
|
### Disabled LLMNR
|
|
|
|
Create the file `/etc/NetworkManager/conf.d/30-llmnr.conf` with the following content
|
|
|
|
```ini
|
|
[connection]
|
|
connection.llmnr=0
|
|
```
|
|
|
|
Create the file `/etc/systemd/resolved.conf.d/30-llmnr.conf` with the following content
|
|
|
|
```ini
|
|
[Resolve]
|
|
LLMNR=no
|
|
```
|
|
|
|
## Mkinitcpio Configuration
|
|
|
|
Edit the file `/etc/mkinitcpio.conf` and add the necessary hooks for the system.
|
|
|
|
Add the hooks `systemd`, `keyboard`, `sd-vconsole`, `sd-encrypt` to the list of hooks as follows:
|
|
|
|
```ini
|
|
HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck resume)
|
|
```
|
|
|
|
## Set Kernel Command Line
|
|
|
|
Create the file `/etc/cmdline.d/01-cryptlvm.conf` with the following content
|
|
|
|
```ini
|
|
rd.luks.name=<UUID of encrypted partition>=cryptlvm
|
|
```
|
|
|
|
The UUID can be found with the command `ls -all /dev/disk/by-uuid`.
|
|
It can be conveniently copied into the `01-cryptlvm.conf` file with the command
|
|
|
|
```sh
|
|
ls -all /dev/disk/by-uuid | grep "<encrypted partition>" | awk '{print $9}' >> /etc/cmdline.d/01-cryptlvm.conf
|
|
```
|
|
|
|
Create the file `/etc/cmdline.d/02-root.conf` with the following content
|
|
|
|
```ini
|
|
root=/dev/vgsys/lvroot
|
|
```
|
|
|
|
Create the file `/etc/cmdline.d/03-resume.conf` with the following content
|
|
|
|
```ini
|
|
resume=/dev/vgsys/lvswap
|
|
```
|
|
|
|
## Enable Unified Kernel Image Booting
|
|
|
|
UKI creates a single executable that can be directly booted from the UEFI firmware without any bootloader.
|
|
|
|
Modify the file `/etc/mkinitcpio.d/linux.preset`.
|
|
|
|
- Un-comment (i.e. remove `#`) the `PRESET_uki=` parameter for each item in `PRESETS=`
|
|
- Comment out (i.e. add `#`) `PRESET_image=` to avoid storing a redundant `initramfs-*.img` file
|
|
|
|
Create the directory `/efi/EFI/Linux`, then create the initcpio `mkinitcpio -P`.
|
|
|
|
Make sure that the generation succeeded and two files have been created (`ls /efi/EFI/Linux`), called
|
|
`arch-linux-fallback.efi` and `arch-linux.efi` (the fallback image might be missing if it is not enabled in the PRESETS).
|
|
|
|
## Create Boot Menu Entries
|
|
|
|
With `efibootmgr` check for existing EFI Boot Menu Entries, remove them if required, and create new entries for
|
|
Arch Linux.
|
|
|
|
- List all entries `efibootmgr`
|
|
- Automatically remove duplicate entries `efibootmgr -D`
|
|
- Remove a specific boot entry `efibootmgr -b XXXX -B`
|
|
- Change the order of boot entries with `efibootmgr -o XXXX,YYYY,ZZZZ`
|
|
|
|
Create the following two new entries
|
|
|
|
```sh
|
|
efibootmgr --create \
|
|
--disk <efi partition> \
|
|
--loader=/EFI/Linux/arch-linux.efi \
|
|
--label "Arch Linux" \
|
|
--verbose
|
|
|
|
efibootmgr --create \
|
|
--disk <efi partition> \
|
|
--loader=/EFI/Linux/arch-linux-fallback.efi \
|
|
--label "Arch Linux Fallback" \
|
|
--verbose
|
|
```
|
|
|
|
## Enable Secureboot
|
|
|
|
Unfortunately the UEFI kernel image is not stored on an encrypted disk, and cannot be. Since the EFI firmware needs to
|
|
be able to access the image to boot the system. Therefore, the system is at risk by an attacker that can manipulate the
|
|
kernel image and boot partition. As a remedy to this problem, we will enable secure boot. The boot loader file will be
|
|
cryptographically signed by a secret key that is stored on our encrypted partition.
|
|
|
|
We will use the tool `sbctl` for a user friendly way to configure secure boot.
|
|
|
|
First, check the current status with `sbctl status`. You should see that sbctl is not installed, and that secure boot
|
|
setup mode is enabled.
|
|
|
|
Creeate new keys: `sbctl create-keys`. Then enroll the new keys with `sbctl enroll-keys -m`.
|
|
|
|
> Warning: The parameter `-m` in the command `sbctl enroll-keys -m` will enroll your own keys alongside with the default
|
|
> microsoft keys. The microsoft keys might be required by any option roms or some firmware in the system. You can omit
|
|
> the option `-m` to only enroll your own keys without Microsoft's. But you might create a system that can no longer
|
|
> boot! Only do this if you know the risk and know what you are doing. If you want to do this, replace `-m` by
|
|
> `--yes-this-might-brick-my-machine`.
|
|
|
|
## Signing EFI Images
|
|
|
|
`sbctl` comes with the necessary hooks pre-installed to automatically sign images when needed. Since we have created new
|
|
and fresh keys, we need to trigger this now manually once. Run `mkinitcpio -P` to recreate images and trigger `sbctl`
|
|
into signing the new images.
|
|
|
|
## Create a User Account
|
|
|
|
Set the password for the user `root`, then create a normal user account.
|
|
Modify the sudoers file, so that the group sudo has access to the `sudo` command.
|
|
|
|
```sh
|
|
passwd root
|
|
groupadd -r sudo
|
|
EDITOR=nvim visudo
|
|
useradd -c "<full user name"> -m -s /bin/bash <username>
|
|
usermod -aG adm,log,rfkill,sys,wheel,sudo,video,input <username>
|
|
chfn <username>
|
|
passwd <username>
|
|
```
|
|
|
|
Confirm the new user can successfully use `sudo` to elevate permission.
|
|
|
|
1. Switch to the created user account `su - <username>`. (.keybinding {ctrl+d} can be used to exit the user account and
|
|
go back to root)
|
|
2. Enter `sudo whoami`, check if sudo works. The output should be `root`
|
|
3. Exit the user account with .keybinding {ctrl+d} or `exit`.
|
|
|
|
For increased security, disable login as root with `passwd --lock root`.
|
|
|
|
## Configure Pacman and Yay
|
|
|
|
Switch to the user account you just created with `su - <username>`.
|
|
Run the following commands to install `yay`, a AUR package helper.
|
|
|
|
```sh
|
|
cd ~
|
|
sudo pacman -S git base-devel go
|
|
git clone https://aur.archlinux.org/yay.git
|
|
cd yay
|
|
makepkg -si
|
|
yay -S yay
|
|
cd ~
|
|
rm -rf yay
|
|
exit
|
|
```
|
|
|
|
Change the configuration of pacman in `/etc/pacman.conf`. Enable the options you want to set, e.g. `Color`,
|
|
`VerbosePkgList`, `ParallelDownloads`.
|
|
|
|
Then install the package `pacman -S pacman-contrib` and enable the service `systemctl enable paccache.timer`.
|
|
|
|
## Enable TRIM
|
|
|
|
For SSDs only, enable periodic trim.
|
|
|
|
```sh
|
|
systemctl enable fstrim.timer
|
|
```
|
|
|
|
> Warning: Enabling TRIM can leak some information about the encrypted system, e.g. presence of encrypted file systems,
|
|
> or even file system types. If this is a concern to you, or you want to achieve plausable deniability, do not enable
|
|
> TRIM on your system.
|
|
|
|
## Recurring Automatic Mirror Selection
|
|
|
|
Install reflector with `pacman -S reflector`
|
|
|
|
Edit the options in `/etc/xdg/reflector/reflector.conf`. Then enable the timer service `systemctl enable reflector`.
|
|
|
|
## Reboot the System
|
|
|
|
Reboot the system into the installed Arch Linux.
|
|
|
|
```sh
|
|
# exit chroot environment with
|
|
exit
|
|
|
|
# unmount all partitions
|
|
umount -R /mnt
|
|
|
|
# reboot
|
|
reboot
|
|
```
|
|
|
|
Remove your installation media.
|
|
|
|
|
|
## Activate systemd-resolved Stub Resolver
|
|
|
|
After the system rebooted, make sure to set the following symlink!
|
|
|
|
```sh
|
|
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
|
|
```
|
|
|
|
## Connect to the network
|
|
|
|
Use `nmtui` to connect to a wireless network, if required.
|
|
|
|
## Create a New Keypair
|
|
|
|
Create a new ssh keyapair. Alternatively copy an existing one.
|
|
|
|
```sh
|
|
ssh-keygen -t ed25519 -C "$(whoami)@$(uname -n)-$(date -I)"
|
|
```
|
|
|
|
## Update the System#
|
|
|
|
Run a full system upgrade with `pacman -Syu`.
|
|
|
|
[rfc-1178]: https://tools.ietf.org/html/rfc1178
|
|
[hostname-7]: https://man.archlinux.org/man/hostname.7
|
|
|