Ubuntu Server 18.04 LTS (Bionic Beaver)のインストールと初期設定・環境構築について。

目的と内容
最小インストールを用いてクリーンインストールする
kvm仮想マシンを各種サーバとして構成する
構成
ロケール
ja_JPではなくen_USに設定する
ハードウェア
256MBのメモリと2GBのストレージ(virtio)3台が接続されている仮想マシン

インストール先となる仮想マシンの作成

仮想マシンマネージャー(virt-manager)で仮想マシンを作成する。 作成後、すぐにはインストールを開始せずシャットダウンし、先にデバイスの追加・削除など、仮想マシンの設定を行う。 またここで、[VNCサーバー]の[キーマップ]をjaに変更しておく。

インストール手順

以下はubuntu-18.04-server-amd64.isoを使用した場合の手順。

ブート画面

[F2] Language
[English]を選択
[F3] Keymap
[Japanese]を選択
[F4] Modes
[Install a minimal virtual machine]を選択

[Install Ubuntu Server]を選択してインストールを開始。

Select a language

Language
[English - English]を選択

Select your location

Country, territory or area
[other] → [Asia] → [Japan]の順に選択

Configure locales

Country to base default locale settings on
[United States - en_US.UTF-8]を選択

Loading additional components

(インストールが終わるまで待つ)

Configure the network

以下はDHCPを無効にして静的IPアドレスを用いる場合。

"Network autoconfigurtion failed"
<Continue>
Network configuration method
[Configure network manually]を選択、以降ダイアログに従って必要事項を入力
Hostname
ホスト名を入力して<Continue> (server1.example.comの場合、server1)
Domain name
ドメイン名を入力して<Continue> (server1.example.comの場合、example.com)

Set up users and passwords

Full name for the new user
ユーザーのフルネームを入力して<Continue>
Username for your accout
アカウント名として使用されるユーザー名を入力して<Continue>
Choose a password for the new user
パスワードを入力して<Continue>
Re-enter password to verify
確認のためもう一度パスワードを入力して<Continue>

Configure the clock

Is this time zone correct?
適切なタイムゾーンが選択されていることを確認して<Yes>を選択

Partition disks

Partitioning method
[Manual]を選択して以下のように設定
設定が完了したら[Finish partitioning and write changes to disk]を選択
パーティション設定
# Type Size Use as Mount point Mount options
Virtual disk1 (vda) 2GB
#1 Primary 512M ext4 /boot defaults
#5 Logical (max) ext4 /usr defaults
Virtual disk2 (vdb) 2GB
#1 Primary (max) ext4 / defaults
#5 Logical 512M swap -
Virtual disk3 (vdc) 2GB
#1 Primary (max) ext4 /srv defaults
# Type Size Use as Mount point Mount options
Write the changes to disks?
パーティションの変更内容を確認して<Yes>を選択

Installing the system

(インストールが終わるまで待つ)

Configure the package manager

HTTP proxy information
空欄のまま、もしくは必要に応じて適切なURLを入力

Configuring tasksel

How do you want to manage upgrades on this system?
[No automatic updates]を選択

Software selection

Choose software to install
サーバの構成に従って適当なものを選択
[Mail server]の設定例
Postfix Configuration
以下はサテライトシステムの場合
General type of mail configuration
[Satellite system]を選択
System mail name
適当な名前を入力
SMTP relay host
メール配送に用いるSMTPサーバのホスト名を入力

Install the GRUB boot loader on a hard disk

Install the GRUB boot loader to the master boot record?
<Yes>を選択
Device for boot loader installatation
ブートローダをインストールするデバイスを選択

Finish the installation

Installation complete
インストールメディアを取りはずして<Continue>を選択

再起動する。

インストール後の設定

シリアルコンソールの有効化/コンソール解像度の設定/ブラックアウトの抑止

virsh consoleでシリアルコンソールに接続できるようにするための設定。 同時にGRUBの設定を変更する。

gettyサービスを有効化・起動する。

gettyサービスを起動する
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service
sudo systemctl status serial-getty@ttyS0.service

この時点でvirsh consoleでシリアルコンソールに接続できるようになる。 ただしsystemdが起動するまでgettyサービスも起動しないため、GRUBメニューやブートシーケンスは表示されない。 GRUBの起動時にシリアルコンソールを有効にする場合は以降の手順を行う。


/etc/default/grubを編集してGRUBの設定を変更する。

/etc/default/grub
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 consoleblank=0"
GRUB_SERIAL_COMMAND="serial --speed=115200n8 --unit=0 --word=8 --parity=no --stop=1"

  :
  :

GRUB_GFXMODE=1024x768x16
GRUB_GFXPAYLOAD_LINUX=keep

変更箇所と変更内容は次のとおり。

GRUB_TIMEOUT3に変更
GRUB起動メニューでのタイムアウト時間を3秒にする
GRUB_CMDLINE_LINUX"console=tty0 console=ttyS0,115200n8 consoleblank=0"に変更
console=tty0 console=ttyS0,115200n8
/dev/ttyS0を使用できるようにする
consoleblank=0
コンソールのブラックアウトを行わないようにする
(1以上を指定すればその秒数でブラックアウトするようになる)
GRUB_SERIAL_COMMAND="serial --speed=115200n8 --unit=0 --word=8 --parity=no --stop=1"を追記
シリアルコンソールの設定
GRUB_GFXMODE=1024x768x16を追記(またはコメントアウトされているものを変更)
フレームバッファの解像度を1024x768x16に設定
GRUB_GFXPAYLOAD_LINUX=keepを追記

編集が終わったら、update-grub2で設定を反映させるたのち、再起動する。

$ sudo update-grub2 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-20-generic
Found initrd image: /boot/initrd.img-4.15.0-20-generic
done

$ sudo reboot

仮想マシンの設定にデバイスの種類がptyのシリアルデバイスが存在していることを確認し、virsh console 仮想マシン名で接続する。

$ virsh console server1
ドメイン server1 に接続しました
エスケープ文字は ^] です

Ubuntu 18.04 LTS server1 ttyS0

server1 login:

シリアルデバイスが複数存在し、デバイス名(alias)が割り当てられている場合は次のようにデバイス名を指定して接続することもできる。

virsh console 仮想マシン名 --devname デバイス名

ターミナル・シェル・エディタ周りの設定

~/.vimrc

以下の内容で作成。

~/.vimrc
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,utf-16,japan

set backspace=indent,eol,start

set tabstop=2
set shiftwidth=2
set expandtab

highlight tabs ctermbg=green guibg=green

set list
set number
set showmatch
set ruler
set smartindent

~/.bash_aliases, ~/.bashrc

~/.bash_aliasesを作成して以下のエイリアスを書き込む。

~/.bash_aliases
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

~/.bashrcを編集して、force_color_promptyesにする。 また、このあと作成する~/.bash_promptを読み込むように設定する。

~/.bashrc
# コメントアウトされているので解除する
force_color_prompt=yes

  :
  :

# .bash_promptがある場合はそれを読み込んでプロンプトの内容を設定させる
if [ -f ~/.bash_prompt ]; then
    color_prompt=yes # プロンプトの色付けを強制的に有効にする場合は、ここでyesを設定する
    . ~/.bash_prompt
fi

# 下記コマンドの前あたりに上記を記述する
unset color_prompt force_color_prompt

  :
  :

プロンプトの内容を設定するファイル~/.bash_promptを作成する。 ファイルの内容についてはUbuntu 22.04のインストール §.Bashの設定(.bashrc, .bash_*)に掲載。

IPv6を無効化する

無効化するために以下の内容を追記。

/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

sysctl -pで変更を反映させる。 また、無効になったかを確認。

$ cat /proc/net/if_inet6 
00000000000000000000000000000001 01 80 10 80       lo
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 02 40 20 80  enp0s10

$ sudo sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

$ cat /proc/net/if_inet6 

sysctl -pを実行すると変更した内容が表示され、またcat /proc/net/if_inet6で何も表示されなければ無効になっている。

スワップ頻度を変更する

スワップ頻度をデフォルトの60から10に下げるために、以下の内容を追記。

/etc/sysctl.conf
vm.swappiness = 10

sysctl -pで変更を反映させる。 また、正しく変更されたかを確認。

$ cat /proc/sys/vm/swappiness 
60

$ sudo sysctl -p
vm.swappiness = 10

$ cat /proc/sys/vm/swappiness 
10

sysctl -pを実行すると変更した内容が表示される。 また、現在の設定値はcat /proc/sys/vm/swappinessで確認できる。

/etc/aliases

root宛のメール送信先を変更する。 /etc/aliasesを作成して以下の内容を記入。

/etc/aliases
root: root@example.com

変更を反映する。

sudo newaliases

/etc/hosts

必要に応じてホストを追記。

グループ・ユーザー

必要に応じて追加。

groupadd -g 999 xxxxxx
adduser --uid 999 --gid 999 --disabled-login --disabled-password --no-create-home xxxxxx

パッケージのインストールと設定

パッケージを最新の状態に更新

sudo apt update
sudo apt dist-upgrade

NFS

sudo apt install nfs-common

マウントポイントを作成。

sudo mkdir -p /srv/nfs

/etc/fstabを編集後、マウントする。

sudo vi /etc/fstab
sudo mount -a

マウントされたかどうか確認する。

cat /etc/mtab
ls -l /srv/nfs

chrony (NTPサーバー)

sudo apt install chrony

適当なNTPサーバーを設定し、再起動。

sudo vi /etc/chrony/chrony.conf
sudo service chrony restart

nginx

インストール
sudo apt install nginx

Ubuntu 18.04でインストールされるnginx(nginx/1.14.0)では、Apacheのような動的モジュール(Dynamic Modules)機能をサポートしている。

Ubuntu 16.04等からそのまま設定ファイルを引き継ぐ場合は、下記のように/etc/nginx/modules-enabled/配下にあるモジュールの設定ファイルを読み込むよう設定を追記し、使用するモジュールを有効にするよう修正する必要がある。

/etc/nginx/nginx.conf
include /etc/nginx/modules-enabled/*.conf;

TLS関連の設定(抜粋、Let's Encrypt SSL/TLS証明書を使用)

/etc/postfix/main.cf
server {
  listen 443 ssl http2;

  ssl_protocols TLSv1.2;
  add_header Strict-Transport-Security max-age=15768000;

  ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
}

その他要件に合わせて設定、詳細については省略。

Postfix+Dovecot(IMAP)+Sieve

Postfixのインストールと設定

インストール
sudo apt install postfix

Postfix ConfigurationでInternet Siteを選択、以降ダイアログにしたがって必要項目を入力していく。


smtpd_bannerから$mail_nameを削除する。

/etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP

メールボックスをMaildir形式にする。

/etc/postfix/main.cf
home_mailbox = Maildir/

メール送出時に、内部ネットワークアドレス(以下の例では127.0.0.1および192.168.0.0/24)を含むReceivedヘッダを取り除く。

/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks
/etc/postfix/header_checks
/^Received:.*\[192\.168\..+\].*/ IGNORE
/^Received:.*\[127\.0\.0\.1\].*/ IGNORE

TLS関連の設定(抜粋、Let's Encrypt SSL/TLS証明書を使用)

/etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.net/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/mail.example.net/privkey.pem
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# 以下smtp_*も同様に設定

その他要件に合わせて設定、詳細については省略。

Dovecot(dovecot-imapd)のインストールと設定

インストール
sudo apt install apt install dovecot-imapd

メールボックスをMaildir形式にする。

/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

平文での認証を無効にする。 また許可する認証メカニズムを限定する。

/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = cram-md5

IMAPSを有効にする。

/etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imaps {
    ssl = yes
  }
}

TLS関連の設定(抜粋、Let's Encrypt SSL/TLS証明書を使用)

/etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/letsencrypt/live/mail.example.net/fullchain.pem
ssl_key =  </etc/letsencrypt/live/mail.example.net/privkey.pem
ssl_protocols = !SSLv3 !TLSv1 !TLSv1.1

その他要件に合わせて設定、詳細については省略。

Dovecot Sieve(dovecot-sieve)のインストールと設定

dovecot-sieveを使ってサーバーサイドでの振り分け・破棄等のフィルタリングを行う。 またdovecot-managesievedを使ってフィルタリングスクリプトを管理する。

インストール
sudo apt-get install dovecot-imapd dovecot-managesieved dovecot-sieve

sieveプラグインを有効にする。 dovecot-ldaを設定する。

/etc/dovecot/conf.d/15-lda.conf
lda_mailbox_autocreate = yes    # 振り分け先のメールボックスが存在しない場合に自動的に作成する
lda_mailbox_autosubscribe = yes # 同様にメールボックスを自動的に購読(SUBSCRIBE)する

protocol lda {
  mail_plugins = $mail_plugins sieve
}

dovecot-managesievedを設定する。

/etc/dovecot/conf.d/20-managesieve.conf
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }

  service_count = 1
  :
  :
}

service managesieve {
  process_limit = 10
}

ローカル配送にdovecot-ldaを使用するようPostfix側の設定を変更する。

/etc/postfix/main.cf
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"
/etc/postfix/main.cf
virtual_transport = dovecot
virtual_mailbox_domains = mail.example.net
dovecot_destination_recipient_limit = 1
/etc/postfix/master.cf
# dovecot-ldaの設定を追記する
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -a ${original_recipient} -d ${user}@${nexthop}

フィルタリングスクリプトの編集はThunderbird Sieve Extensionなどを使って行う。

AWStats

sudo apt install awstats

/etc/awstats/awstats.confを編集する。 LogFile/dev/nullにし、それ以外の項目は共通の設定ファイルとなるように構成する。

/etc/awstats/awstats.conf
LogFile="/dev/null"
LogFormat=1
SiteDomain="example.com"
DirData="/var/lib/awstats"
DefaultFile="index.html"
  :
  :

次に、ドメイン別・サーバー別などに設定ファイルを作成し、各設定ファイルからは共通の設定を含むawstats.confを読み込むようにする。  各設定ファイル名はawstats.*.confとする必要がある。

/etc/default/awstats.www.example.com.conf
Include "/etc/awstats/awstats.conf"
LogFile="/var/log/nginx/www.example.com-access.log"
SiteDomain="www.example.com"
  :
  :
/etc/default/awstats.mail.example.net.conf
Include "/etc/awstats/awstats.conf"
LogFile="/var/log/postfix/mail.example.net-access.log"
LogFormat="....."
SiteDomain="mail.example.net"
  :
  :

/etc/awstats以下の設定ファイルを編集後、ログが読み込まれデータが正しく収集されるかテストする。

sudo -u www-data /usr/share/doc/awstats/examples/awstats_updateall.pl now -awstatsprog=/usr/lib/cgi-bin/awstats.pl -confdir="/etc/awstats/"
ls /var/lib/awstats

必要に応じてcron(/etc/cron.d/awstats)の設定およびHTTPサーバの設定を更新したのち、http://サーバ名/awstats/awstats.pl?config=設定ファイル名を開いて収集されたデータが表示されるか確かめる。

Munin (munin-node)

sudo apt install munin-node

/etc/munin/pluginsから必要なプラグインだけを残す。 あるいは必要なプラグインを追加する。

# 不要なプラグインを削除する
sudo unlink xxx

# 必要なプラグインを追加する
sudo ln -s /usr/share/munin/plugins/xxx

データを収集するマシンのみからのアクセスを許可するように変更する。

/etc/munin/munin-node.conf
allow ^192\.168\.0\.10$

munin-nodeを再起動。

sudo service munin-node restart

データを収集するマシンからtelnetで接続できるか試す。

$ telnet server1 4949
Trying 192.168.0.20...
Connected to server1.
Escape character is '^]'.
# munin node at server1.example.com
nodes
server1.example.com
.
quit
Connection closed by foreign host.

データを収集するマシンの/etc/munin/munin.confを編集して監視対象に追加する。

/etc/munin/munin.conf
[server1]
    address 192.168.0.20

Logwatch

sudo apt install logwatch

テストした結果をroot宛にメールで送信する。

sudo logwatch --detail high --mailto root

その他

.NET Core

.NET Core Runtimeをインストールする。

sudo apt install curl gnupg apt-transport-https

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-bionic-prod bionic main" > /etc/apt/sources.list.d/dotnetdev.list'

sudo apt update

# 2018-05-03時点、NO_PUBKEYエラーが出る場合
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys EB3E94ADBE1229CF
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893

sudo apt update
sudo apt install dotnet-runtime-2.0.7