らくがきちょう

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

自分用・検証用 CentOS8 作成手順メモ(2020/01/31 版)

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

CentOS 8.1911 がリリースされた為、改めて「検証用 Linux の作り方」メモをアップデートしておきます。 以下を前提にしています。

  • vSphere 上に作成する仮想マシンである
  • ベースは CentOS8 64bit とする
  • CentOS8 は最小構成でインストールする
  • 作成した仮想マシンはテンプレート化する

尚、「完全に初期状態からインストールする」よりも、ある程度の設定は Kickstart 化してインストールするのも楽かも知れません。

目次

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

別のホストへ SSH 接続する際、警告が表示されないように設定しておきます。 また「Unable to negotiate with 192.168.1.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1」等のエラーを回避する為に、必要な鍵交換アルゴリズムを追加しておきます。

cat << EOF > /etc/ssh/ssh_config.d/99_lab.conf
KexAlgorithms +diffie-hellman-group1-sha1
Ciphers aes128-cbc
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
EOF

SSH 公開鍵をコピーする

ログイン処理をセキュア、且つ簡略化する為に公開鍵をコピーしておきます。 RSA 形式よりは ED25519 形式が推奨です (速くて強固である為)。

cat << 'EOS' >> ~/.ssh/authorized_keys
(公開鍵)
EOS
chmod 600 ~/.ssh/authorized_keys

/root に存在する不要ファイルを削除する

インストール直後は /root 配下に *.cfg が存在します。 不要であれば削除しておきます (Kickstart 用の設定ファイルとして参考にしたい場合はコピーするなり、退避しておきます)。

rm /root/anaconda-ks.cfg
rm /root/ks-post-anaconda.log
rm /root/original-ks.cfg

NTP サーバを指定する

NTP サーバを指定しておきます。 /etc/chrony.conf に時刻同期したいサーバを指定します。 検証環境に併せたサーバを指定すれば良いと思いますが、特に指定が無く、インターネットにアクセス可能な場合は Google Time Server 等で良いと思います (設定変更を反映したい場合は chronyd を再起動しておきます)。

server 216.239.35.12 iburst
server 216.239.35.8 iburst
server 216.239.35.4 iburst
server 216.239.35.0 iburst

NTP サーバとの同期状態は chronyc sources で確認します。

# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* time4.google.com              1   8   377   216   +795us[ +368us] +/-   18ms
^+ time3.google.com              1   8   377    26  +8126us[+8126us] +/-   25ms
^+ time2.google.com              1   8   377    89  +3367us[+3367us] +/-   24ms
^+ time1.google.com              1   8   377   410  +2815us[+2366us] +/-   21ms

firewalld を停止する

firewalld は停止しておきます。

systemctl stop firewalld
systemctl disable firewalld

SELinux を停止する

SELinux は停止しておきます。

sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux

プロンプトの色を変更する

一般ユーザのプロンプトは緑色に、root ユーザのプロンプトは赤色に変更します。

echo "export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '" >> /etc/profile.d/prompt.sh
echo "export PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\\$ '" >> /root/.bashrc

対話的な alias を無効化する

検証環境ではコマンドを実行する度に対話的な確認は不必要なので、alias を無効化しておきます。

sed -i -e "s/alias rm='rm -i'/#alias rm='rm -i'/g" /root/.bashrc
sed -i -e "s/alias cp='cp -i'/#alias cp='cp -i'/g" /root/.bashrc
sed -i -e "s/alias mv='mv -i'/#alias mv='mv -i'/g" /root/.bashrc

GRUBタイムアウト時間を短くする

デフォルトでは GRUBタイムアウト時間が 5 秒になっています。 検証環境の仮想マシンは少しでも早く起動して欲しいので、タイムアウト時間を 1 秒に縮めます。

sed -i -e "s/^GRUB_TIMEOUT=5/GRUB_TIMEOUT=1/g" /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

基本的なパッケージを追加する

普段、よく使うであろうパッケージを追加しておきます。

dnf -y install \
    bash-completion \
    bind-utils \
    git \
    lsof \
    tcpdump \
    tree \
    unzip \
    vim-enhanced \
    wget \
    yum-utils \
    zip

vi → vim の alias を追加する

root ユーザでも vi とタイプしたら vim が起動するようにエイリアスを設定しておきます。

echo "alias vi='vim'" >> /root/.bashrc

.vimrc も好みで設定しておきます。

cat << EOF > /root/.vimrc
set paste
EOF

EPEL からパッケージを追加する

必要であれば、EPEL からパッケージを追加しておきます。 以下は fping や nmap を追加する例です。

dnf -y install epel-release
dnf -y install \
    fping \
    nmap

パッケージを最新にする

インストールされているパッケージを最新にします。 カーネルがアップデートされている場合を想定し、併せて再起動しておきます。

dnf -y update
dnf clean all
sync
sync
sync
reboot

古い世代のカーネル等、不要になったパッケージは削除します。

dnf -y remove $(dnf repoquery --installonly --latest-limit=-1 -q)

pyenv をインストールする

CentOS8 の最小インストールでは Python がインストールされていません。 pyenv をインストールし、任意の Python バージョンを利用できるようにします。 まず、必要なパッケージをインストールし、続いて pyenv をインストールします。

dnf -y install \
  bzip2-devel \
  gcc \
  gcc-c++ \
  git \
  libffi-devel \
  make \
  openssl-devel \
  readline-devel \
  sqlite-devel \
  zlib-devel

pyenv を clone します。

git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv

全ユーザから参照されるように必要な環境変数を設定します。

cat << EOF > /etc/profile.d/pyenv.sh
export PYENV_ROOT="/usr/local/pyenv"
export PATH="\${PYENV_ROOT}/bin:\${PATH}"
eval "\$(pyenv init -)"
EOF

ログアウト・ログインし直すか、または下記を実行して環境変数を反映します。

exec $SHELL -l

pyenv install --list でインストール可能な Python バージョンを確認します。 現時点では 3.8.1 が最新でした。

pyenv install --list

今回は 3.8.1 をインストールします。

pyenv install 3.8.1

インストールした Python バージョンが利用されるように設定しておきます。

pyenv global 3.8.1
pyenv rehash

pip をインストールする

pyenv をインストール後、必要であれば pip をアップデートしておきます。

pip install --upgrade pip setuptools

現時点では pip 20.0.2 がインストールされました。

キャッシュ / コマンド実行履歴を削除しておく

テンプレート化する際には不要なので dnf のキャッシュとシェルのコマンド実行履歴を削除しておきます。 ここまで完了したら仮想マシンの電源をオフにします。

dnf clean all
history -c
poweroff

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

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

テンプレート化する

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

補足

以下は補足です。

sshd は設定変更しない

DNS が利用できない環境でテストする場合は ssnd を UseDNS = no にしておく方がタイムアウトを待たずに済み、効率が良いかも知れません。 しかし、CentOS8 の初期状態では UseDNS = no になっていました。

# sshd -T -f /dev/null | sort
addressfamily any
allowagentforwarding yes
allowstreamlocalforwarding yes
allowtcpforwarding yes
authenticationmethods any
authorizedkeyscommand none
authorizedkeyscommanduser none
authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2
authorizedprincipalscommand none
authorizedprincipalscommanduser none
authorizedprincipalsfile none
banner none
challengeresponseauthentication yes
chrootdirectory none
ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
clientalivecountmax 3
clientaliveinterval 0
compression yes
disableforwarding no
exposeauthinfo no
fingerprinthash SHA256
forcecommand none
gatewayports no
gssapiauthentication no
gssapicleanupcredentials yes
gssapienablek5users no
gssapikexalgorithms gss-gex-sha1-,gss-group14-sha1-
gssapikeyexchange no
gssapistorecredentialsonrekey no
gssapistrictacceptorcheck yes
hostbasedacceptedkeytypes ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
hostbasedauthentication no
hostbasedusesnamefrompacketonly no
hostkey /etc/ssh/ssh_host_ecdsa_key
hostkey /etc/ssh/ssh_host_ed25519_key
hostkey /etc/ssh/ssh_host_rsa_key
hostkeyagent none
hostkeyalgorithms ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
ignorerhosts yes
ignoreuserknownhosts no
ipqos af21 cs1
kbdinteractiveauthentication yes
kerberosauthentication no
kerberosorlocalpasswd yes
kerberosticketcleanup yes
kerberosuniqueccache no
kerberosusekuserok yes
kexalgorithms curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
listenaddress 0.0.0.0:22
listenaddress [::]:22
logingracetime 120
loglevel INFO
macs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
maxauthtries 6
maxsessions 10
maxstartups 10:30:100
passwordauthentication yes
permitemptypasswords no
permitlisten any
permitopen any
permitrootlogin without-password
permittty yes
permittunnel no
permituserenvironment no
permituserrc yes
pidfile /var/run/sshd.pid
port 22
printlastlog yes
printmotd yes
pubkeyacceptedkeytypes ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
pubkeyauthentication yes
rdomain none
rekeylimit 0 0
revokedkeys none
showpatchlevel no
streamlocalbindmask 0177
streamlocalbindunlink no
strictmodes yes
syslogfacility AUTH
tcpkeepalive yes
trustedusercakeys none
usedns no
usepam no
versionaddendum none
x11displayoffset 10
x11forwarding no
x11maxdisplays 1000
x11uselocalhost yes
xauthlocation /usr/bin/xauth