Ubuntu Server 使うときの自分なり定番設定を書いてみる

# 概要

自宅でUbuntu Server立てる時に共通で実施する設定です。
自分でも忘れることあるので、備忘録としても使おうと目論んでます。

## AppArmor 無効化

Ubuntu 標準のセキュリティ機能を無効化。

:::note info
ChatGPT の回答 - AppArmor について概要を３行で教えて

AppArmor は、Linux でアプリケーションの動作を制限するセキュリティ機構です。プロファイルを用いてファイルやリソースへのアクセスを制御し、システムを保護します。設定が簡単で軽量なため、Ubuntu などで標準的に利用されています。

:::

### 確認操作

```bash
aa-status
systemctl status apparmor
```

### 変更操作

```bash
aa-teardown
systemctl disable apparmor
```

## パッケージの更新(Linux カーネル含む)

apt によるパッケージの更新。

:::note info
ChatGPT の回答 - apt について概要を３行で教えて

apt は、Debian 系 Linux で使われるパッケージ管理ツールです。ソフトウェアのインストール、更新、削除、依存関係の管理を簡単に行えます。Ubuntu などで広く利用され、システムの効率的な管理をサポートします。

:::

### 確認操作

なし(変更操作時に確認画面が出る)

### 変更操作

```bash
apt update
apt dist-upgrade
```

## QEMU エージェントインストール

proxmox で立てることが多いのでインストール

:::note info
ChatGPT の回答 - QEMU エージェントについて概要を３行で教えて

QEMU エージェントは、仮想マシンとホスト間の通信を支援するために使用されるツールです。ゲスト OS 内で動作し、ホスト側からのコマンド実行や情報取得（例: シャットダウン、IP アドレスの取得）を可能にします。主に KVM/QEMU 環境で使われ、仮想化管理を効率化します。

:::

### 確認操作

```bash
dpkg -l qemu-guest-agent |cat
systemctl status qemu-guest-agent
```

### 変更操作

```bash
apt install qemu-guest-agent
systemctl enable --now qemu-guest-agent
```

## ロケール設定

日本で使う場合の設定

:::note info
ChatGPT の回答 - ロケール設定について概要を３行で教えて

ロケール設定は、システムやアプリケーションで使用する言語や地域に依存する設定（例: 日付形式、文字コード）を管理する仕組みです。Linux では locale コマンドや設定ファイル（例: /etc/default/locale）を通じてロケールを確認・変更できます。正しいロケール設定は、国際化対応やエラーメッセージの言語統一に役立ちます。

:::

### 確認操作

```bash
dpkg -l language-pack-ja |cat
localectl
timedatectl
```

### 変更操作

```bash
apt install language-pack-ja
localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
timedatectl set-timezone Asia/Tokyo
```

## パッケージインストール　-基本編-

素の OS を使いやすくするためのパッケージ

:::note info
ChatGPT の回答 - 以下のコマンドをステップバイステップで解説して

- vim
  - 高機能テキストエディタ。ターミナルでファイル編集に使われます。
- less
  - ファイルやコマンド出力をスクロールして閲覧するためのツール。
- sudo
  - 一般ユーザーが管理者権限でコマンドを実行するためのツール。
- htop
  - インタラクティブなプロセス管理ツール。プロセスの状態や CPU/メモリを視覚的に確認できる。
- expect
  - スクリプトで対話型アプリケーションを自動操作するためのツール。
- tree
  - ディレクトリ構造をツリー形式で表示するコマンド。
- acl
  - ファイルシステムのアクセス制御リスト（ACL）を管理するツール。
- bash-completion
  - Bash シェルのコマンド補完機能を拡張するパッケージ。
- zip
  - ファイルを ZIP 形式で圧縮するためのツール。
- unzip
  - ZIP 形式のファイルを解凍するツール。
- dos2unix
  - DOS 形式（Windows）の改行コードを Unix 形式に変換するツール。
- apt-utils
  - パッケージ管理の補助ツール。詳細なインストール情報を提供します。
- software-properties-common
  - 追加リポジトリの管理に必要。
- apt-transport-https
  - HTTPS を使ったパッケージリポジトリとの通信を可能にするパッケージ。
- jq
  - JSON 形式データを扱うための軽量コマンドラインツール。

:::

### 確認操作

```bash
dpkg -l \
    vim \
    less \
    sudo \
    htop \
    expect \
    tree \
    acl \
    bash-completion \
    zip \
    unzip \
    dos2unix \
    apt-utils \
    software-properties-common \
    apt-transport-https \
    jq \
    |cat
```

### 変更操作

```bash
apt install \
    vim \
    less \
    sudo \
    htop \
    expect \
    tree \
    acl \
    bash-completion \
    zip \
    unzip \
    dos2unix \
    apt-utils \
    software-properties-common \
    apt-transport-https \
    jq
```

## パッケージインストール　-ネットワーク編-

ネットワーク関連のツールをいれるパッケージ

:::note info
ChatGPT の回答 - 以下のコマンドをステップバイステップで解説して

- iputils-tracepath
  - ネットワーク経路を調査するツール。tracepath コマンドを提供し、MTU（最大転送単位）の問題を検出可能。
- iputils-ping
  - ping コマンドを提供し、指定ホストへのネットワーク接続を確認。接続の可否や応答時間を測定。
- ca-certificates
  - 信頼された証明書を管理するパッケージ。HTTPS 通信や TLS/SSL 証明書の検証に必要。
- bind9-utils
  - BIND DNS サーバー関連のツールを提供。dig や host コマンドで DNS クエリを実行可能。
- net-tools
  - 旧来のネットワーク管理ツールを提供。ifconfig や netstat コマンドが含まれる。
- traceroute
  - ネットワーク経路を調査するツール。パケットが目的地に到達するまでのルートを表示。
- nmap
  - ネットワークスキャナー。ポートスキャンやサービス検出、セキュリティ診断に使用。
- netcat-openbsd
  - 軽量なネットワーク接続ツール。通信テストやポートスキャンに使用可能。
- dnsutils
  - DNS 関連ツールを提供。nslookup コマンドで DNS 情報を照会可能。
- curl
  - HTTP リクエストをコマンドラインで実行できるツール。ファイルのダウンロードや API 通信に利用。
- git
  - 分散型バージョン管理システム。ソースコードの管理や共有に必須。
- wget
  - HTTP や FTP でのファイルダウンロードを行うツール。スクリプトでの利用にも便利。
- telnet
  - テキストベースのネットワークプロトコルを利用するツール。接続テストやポート確認に使用。
- nfs-common
  - NFS（Network File System）を利用するクライアントツール。ネットワーク越しのファイル共有に必要。
- smbclient
  - SMB/CIFS プロトコルを使用するクライアントツール。Windows 共有フォルダへアクセス可能。
- cifs-utils
  - CIFS プロトコルを利用するためのツール。ファイル共有のマウントや管理に使用。
- openssh-client
  - SSH クライアントツール。リモートサーバーへの接続を可能にします。
- openssh-server
  - SSH サーバーツール。サーバーとしてリモートアクセスを許可します。
- lynx
  - テキストベースのウェブブラウザ。低リソース環境やサーバーでウェブページの閲覧が可能。

:::

### 確認操作

```bash
dpkg -l \
    iputils-tracepath \
    iputils-ping \
    ca-certificates \
    bind9-utils \
    net-tools \
    traceroute \
    nmap \
    netcat-openbsd \
    dnsutils \
    curl \
    git \
    wget \
    telnet \
    nfs-common \
    smbclient \
    cifs-utils \
    openssh-client \
    openssh-server \
    lynx \
    |cat
```

### 変更操作

```bash
apt install \
    iputils-tracepath \
    iputils-ping \
    ca-certificates \
    bind9-utils \
    net-tools \
    traceroute \
    nmap \
    netcat-openbsd \
    dnsutils \
    curl \
    git \
    wget \
    telnet \
    nfs-common \
    smbclient \
    cifs-utils \
    openssh-client \
    openssh-server \
    lynx
```

## パッケージインストール　-ドメイン参加編-

ドメイン参加のツールをいれるパッケージ

:::note info
ChatGPT の回答 - 以下のコマンドをステップバイステップで解説して

- realmd
  - Active Directory や他の認証ドメインに参加するためのツール。ドメイン参加の設定を簡単に行える。
- sssd
  - System Security Services Daemon（SSSD）で、認証情報をキャッシュし、AD や LDAP と連携。ユーザー認証や ID 情報の管理に使用。
- sssd-tools
  - SSSD を管理するための補助ツール。追加のコマンドライン機能を提供。
- libnss-sss
  - NSS（Name Service Switch）モジュール。SSSD を通じてユーザーやグループ情報を提供。
- libpam-sss
  - PAM（Pluggable Authentication Module）モジュール。SSSD を使用して認証を行う。
- adcli
  - Active Directory にシステムを簡単に参加させるための CLI ツール。ドメイン参加プロセスの自動化を支援。
- samba-common-bin
  - Samba 関連のコマンドラインツール。net コマンドを使ってドメインや共有設定を管理可能。
- oddjob
  - サービスやタスクを管理するデーモン。ユーザー認証や自動プロビジョニングに使用。
- oddjob-mkhomedir
  - 新規ドメインユーザーのホームディレクトリを自動で作成するツール。
- packagekit
  - システムパッケージの管理を行うフレームワーク。GUI ツールでのソフトウェアインストールや更新を支援。
- krb5-user
  - Kerberos 5 認証用のユーザーランドツール。Active Directory とのシングルサインオン（SSO）に必要。

:::

### 確認操作

```bash
dpkg -l \
    realmd \
    sssd \
    sssd-tools \
    libnss-sss \
    libpam-sss \
    adcli \
    samba-common-bin \
    oddjob \
    oddjob-mkhomedir \
    packagekit \
    krb5-user \
    |cat
```

### 変更操作

```bash
apt install \
    realmd \
    sssd \
    sssd-tools \
    libnss-sss \
    libpam-sss \
    adcli \
    samba-common-bin \
    oddjob \
    oddjob-mkhomedir \
    packagekit \
    krb5-user
```

## ドメイン参加

Ubuntu を ActiveDirectory に参加させる為の設定。
ドメイン名は個人情報チックなので【ドメイン名】としました。

:::note info
ChatGPT の回答 - 以下のコマンドをステップバイステップで解説して

- UID/GID の最大値変更
  目的: Linux のユーザー ID（UID）とグループ ID（GID）の最大値を 2147483600 に設定。
  理由: Active Directory の UID/GID 範囲が大きいため、Linux 側で許容する範囲を拡張。
- NTP サーバー設定
  目的: NTP（ネットワーク時刻同期）の設定に、AD ドメインの NTP サーバーを指定。
  理由: Active Directory のドメイン参加には正確な時刻同期が必要。
- sudo の無パスワード設定
  目的: AD グループ（domain admins と domain sudoers）に無パスワードで sudo 実行権限を付与。
  理由: 管理者作業を簡略化。
- ホスト名設定
  目的: ホスト名をドメイン名付きの FQDN（Fully Qualified Domain Name）に変更。
  理由: AD ドメインで一意のホスト名を使用する必要があるため。
- DNS 解決設定
  目的: ドメイン名を DNS 解決の対象として追加。
  理由: AD ドメイン参加時の名前解決を正確に行うため。
- ホストファイルの更新
  目的: /etc/hosts でループバックアドレスにホスト名を登録し、127.0.1.1 のエントリを削除。
  理由: ホスト名解決がドメイン内で正しく機能するようにするため。
- PAM 設定の更新
  目的: PAM（Pluggable Authentication Module）でホームディレクトリを自動作成し、アクセス権限を制限。
  理由: 新しいドメインユーザーのログイン時に適切なホームディレクトリを提供。
- ホームディレクトリ準備
  目的: ドメインユーザー用のホームディレクトリを作成。
  理由: 各ユーザーのディレクトリを整理。
- ドメイン参加
  指定した Active Directory ドメインに参加。
  理由: Linux システムを AD の管理下に置き、ユーザー認証やポリシー適用を可能にする。

:::

### 確認操作

```bash
grep -E "^(UID_MAX|GID_MAX)" /etc/login.defs
show-timesync |grep ServerName
sudo -l | grep "NOPASSWD"
hostnamectl
cat /etc/systemd/resolved.conf.d/AD.conf
systemctl status systemd-resolved
cat /etc/hosts
pam-auth-update --list
grep "pam_mkhomedir.so" /etc/pam.d/common-session
ls -ld /home/【ドメイン名】
realm list
```

### 変更操作

```bash
sed -i "s/^UID_MAX.*$/UID_MAX 2147483600/g" /etc/login.defs
sed -i "s/^GID_MAX.*$/GID_MAX 2147483600/g" /etc/login.defs
sed -i "s/^[# ]*NTP=.*$/NTP=【ドメイン名】/g" /etc/systemd/timesyncd.conf ; systemctl restart systemd-timesyncd
cat <<"EOF" >> /etc/sudoers.d/NO-PASSWD
"%domain admins" ALL=NOPASSWD: ALL
"%domain sudoers" ALL=NOPASSWD: ALL
EOF
hostnamectl set-hostname $(hostname -s).【ドメイン名】
mkdir -p /etc/systemd/resolved.conf.d ; cat <<"EOF" >> /etc/systemd/resolved.conf.d/AD.conf
[Resolve]
Domains=【ドメイン名】
EOF
systemctl restart systemd-resolved
sed -i s/^127\.0\.0\.1.*$/"127.0.0.1 localhost localhost.localdomain $(hostname -s) $(hostname -f)"/g /etc/hosts
sed -i "/^127\.0\.1\.1.*$/d" /etc/hosts
pam-auth-update --enable mkhomedir
sed -i -re s/"pam_mkhomedir\.so"/"pam_mkhomedir\.so umask=027"/g /etc/pam.d/common-session
mkdir /home/【ドメイン名】; chmod 0755 /home/【ドメイン名】; chown root:root /home/【ドメイン名】
realm join 【ドメイン名】 -U administrator -v
```

# SSSD の調整

ドメイン参加した状態だと使いづらいため調整する

:::note info
ChatGPT の回答 - 以下のコマンドをステップバイステップで解説して

use_fully_qualified_names を False に設定して、user@domain の形式ではなく user 形式でユーザー名を利用可能にします。
デフォルトのログインシェルを/bin/bash に設定。
ホームディレクトリのパスを/home/<domain>/<username>形式に設定。
各ユーザーに専用グループを自動作成。
動的 DNS 更新を有効化。
動的 DNS の更新間隔を 12 時間に設定。
PTR レコード（逆引き DNS）の更新を有効化。
動的 DNS レコードの TTL を 1 時間に設定。

:::

### 確認操作

```bash
grep -E "use_fully_qualified_names|default_shell|override_homedir|auto_private_groups|dyndns" /etc/sssd/sssd.conf
systemctl status sssd
id username
getent passwd username
nslookup $(hostname)
```

### 変更操作

```bash
sed -i "s/^use_fully_qualified_names = True$/use_fully_qualified_names = False/g" /etc/sssd/sssd.conf
cat <<"EOF" >> /etc/sssd/sssd.conf
default_shell=/bin/bash
override_homedir=/home/%d/%u
auto_private_groups = true
dyndns_update = true
dyndns_refresh_interval = 43200
dyndns_update_ptr = true
dyndns_ttl = 3600
EOF
systemctl restart sssd
```