らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

自分用・検証用 Ubuntu21 作成手順メモ(2021/09/20 版)

以前に下記のメモを書きました。

今回は Ubuntu 21.x 系を検証に構築する手順をメモしておきます。 検証環境用の VM を作成する手順ですので、意図的にセキュリティレベルを下げています。

SSH 接続時の警告時を表示しない

別のホストへ SSH 接続する際、警告が表示されないように設定しておきます。

cat << EOF > /etc/ssh/ssh_config.d/99_lab.conf
UserKnownHostsFile=/dev/null
EOF

root へユーザの鍵&パスワード設定

Ubuntuインストーラでは「root のパスワードは指定不可」「必ず標準ユーザを作成しなければいけない」ようです (たぶん)。 まず、root ユーザのパスワードを設定しておきます。

# passwd
New password:
Retype new password:
passwd: password updated successfully

root ユーザ用の公開鍵も登録しておきます。

vi ~/.ssh//authorized_keys

システムのアップデート

システムをアップデートしておきます。

apt -y update
apt -y upgrade
reboot

標準ユーザの削除

(パッケージのアップデートに伴い、再起動を実施したら) 直接、root ユーザとして SSH ログインし、インストーラで作成した標準ユーザは削除します。

userdel -r user

コンソールの有効化

IP 到達性が無い部分に仮想マシンを作成する場合、直接コンソールアクセス出来ると便利ですので、コンソール接続を有効化しておきます。 コンソール接続を有効化するには GRUB2 の設定ファイル (/etc/default/grub) を修正します。

変更前

GRUB2 の設定ファイルは初期状態で下記のようになっていました (※ コメントは省略しています)。

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

変更後

cat << EOF > /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"
GRUB_SERIAL_COMMAND="serial --speed=115200"
GRUB_TERMINAL="console serial"
EOF

次に securetty の定義を追加します。

cp /usr/share/doc/util-linux/examples/securetty /etc/securetty
echo "ttyS0" >> /etc/securetty

最後に GRUB をアップデートします。

update-grub

パッケージの追加インストール

apt -y install \
    fping \
    nmap \
    tree \
    tshark \
    unzip

コメント除外ツールのインストール

curl -L \
    https://github.com/sig9org/uncmnt/releases/download/v0.0.1/uncmnt_v0.0.1_linux_amd64 \
    -o /usr/local/bin/uncmnt
chmod 755 /usr/local/bin/uncmnt

キャッシュ / コマンド実行履歴を削除する

apt のキャッシュとコマンド実行履歴を削除しておきます。 ここまで完了したら仮想マシンを電源オフします。

apt clean
history -c
poweroff

アドレス変更スクリプト

cat << EOF > /usr/local/bin/chaddr
#!/usr/bin/env python3
import argparse
import subprocess
import textwrap

parser = argparse.ArgumentParser()
parser.add_argument('-a', '--address', required=True)
parser.add_argument('-g', '--gateway', required=True)
args = parser.parse_args()

hostname = args.address.replace('.', '-')
subprocess.call('hostnamectl set-hostname ' + hostname, shell=True)

netplan = textwrap.dedent('''
network:
  ethernets:
    ens160:
      dhcp4: false
      dhcp6: false
      addresses: [{arg1}/24]
      gateway4: {arg2}
      nameservers:
        addresses: [1.1.1.1, 1.0.0.1]
  version: 2
''').format(arg1=args.address, arg2=args.gateway).strip()

with open('/etc/netplan/99_config.yaml', 'w') as f:
    f.write(netplan)

hosts = textwrap.dedent('''
127.0.0.1 localhost {arg1}
127.0.1.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet {arg1}
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
''').format(arg1=hostname).strip()

with open('/etc/hosts', 'w') as f:
    f.write(hosts)
EOF
chmod 755 /usr/local/bin/chaddr

VM から DVD メディアを取り出しておく

テンプレート化する前に仮想マシン光学ドライブからインストールに利用した DVD メディアを取り出しておきます。

テンプレート化する

ここまで用意が出来たら仮想マシンをテンプレート化します。 以降、検証用の仮想マシンを作成したい場合はこのテンプレートから複製します。