ホーム » 技術 » さくらのクラウドでCentOS8用のスタートアップスクリプトを整備する

さくらのクラウドでCentOS8用のスタートアップスクリプトを整備する

さくらのクラウドのCentOS8のアーカイブが正式リリースされた。

これに合わせて、以前からメンテしているセットアップ・バッチをCentOS8に合わせてアップデートしたので紹介する。コードはこちら。

また、CentOS7に関する解説は以前の記事を参照していただければ。

938

スタートアップスクリプト

さくらのクラウドのコンパネで設定するべきスタートアップスクリプトはこんな内容になる。

#!/bin/bash

# @sacloud-name "Northcave Setup"
# @sacloud-once
#
# @sacloud-require-archive distro-centos distro-ver-8.*
#
# @sacloud-desc-begin
#   Linuxサーバを自分好みに設定します。
#     スクリプトの実体は https://github.com/ken-washikita/northcave-startup にあります。
#   ※ このスクリプトは、CentOS8.Xで動作します
# @sacloud-desc-end

# load & exec
curl -L https://raw.githubusercontent.com/ken-washikita/northcave-startup/master/centos8/startup.sh | bash

# end

このスクリプトで肝心なのは、curlで読み込んでいるURLの部分だ。ここで読み込むバッチの内容がサーバ作成時に実行され、必要な設定が行われるという仕組みである。そのほかのスタートアップスクリプトの記法については

を参照していただきたい。みなさんが利用する場合は、URLを自分のコードに書き換えて、コンパネから以下のように張り付けていただきたい。

クラウドコンパネの編集画面

こうして作成したスタートアップスクリプトは、サーバ作成画面で指定すると、作成時に実行できるようになる。あとは呼び出されるスクリプトの方をメンテナンスすればよい。

セットアップスクリプトの例

セットアップを行うスクリプトは、お好みに合わせて自由にかいていただければと思うが、具体的にどのように書くかを例示したいと思う。

パッケージの追加

# install packages
dnf -y install dnf-utils python3-inotify || exit 1

初期イメージに入っておらず、ぜひ使いたいパッケージをここに書く。以前はwgetをここに書いていたが、社内でPullReqしたので今は入っている。このほか、今のところ自分の趣味で入れたいものを追加している。

設定ファイルの書き換え(sedの使い方)

# locale
sed -i 's/ja_JP/en_US/' /etc/locale.conf

# PAM
sed -i '/^UsePAM no/s/no/yes/' /etc/ssh/sshd_config

# logrotate
sed -i '/^rotate 4$/s/4/10/' /etc/logrotate.conf

設定ファイルの一部をちょっと書き換えたい、ということはよくあるが、そういうときはsedが便利だ。-iオプションはファイルを書き換えて上書きすることを指示するもので、上記のように使えば簡単だ。

蛇足だが「/検索パターン/s/置換前パターン/置換後文字列/」という記法は、特定行で置換を行いたいときに使える便利な手法だ。基本原則は「アドレス・コマンド」の組み合わせから逸脱していない。上記の例では、たとえば「s/^rotate 4/rotate 10/」としてもよいのだが、マッチのパターンと置換したいパターンが異なるときはこの記法を使うと分かりやすくなるので便利だ。

nftablesの有効化

以前記事にしたが、CentOS8ではnftablesは無効になっている。iptablesを経由して操作することを前提にした互換ルールしか入っていないのだ。自分はfail2banをnftables-nativeで使いたいので、nftablesを有効化しておかなければならない。ということで次のように設定変更する。

# nftables
sed -i '/inet-filter\.nft/s/^# //' /etc/sysconfig/nftables.conf
systemctl enable nftables
systemctl start nftables

.vimrcの作成(ヒア・ドキュメント)

# vi
cat <<EOL >/root/.vimrc
set compatible
syntax off
set ai
map g 1G
map q :e#
set cpo-=%
set notitle
set tabstop=4
set shiftwidth=4
set encoding=utf-8
set fileencodings=utf-8,euc-jp,sjis,cp932
set ambiwidth=double
set history=50
set more
EOL
sed -i '/^map q/s/$/\r/' /root/.vimrc
ln -s /root/.vimrc /root/.virc

ファイルを作成するときはこのようにヒア・ドキュメントを使うと楽だ。ちなみにsedを使った奇妙な置換をしているのは、ファイルの中にコントロール文字(具体的には^M)を置くと、GitHubやどこかで落とされるかもしれないと考えたからだ。 杞憂かもしれないが 、念のためということでこうしている。

fail2banのnftables設定

# fail2ban nftables
sed -i '/\[sshd\]/a mode = aggressive\
banaction = nftables-multiport\
banaction_allports = nftables-allports' /etc/fail2ban/jail.d/local.conf

fail2banのsshdフィルタをnftables-nativeにしたいのと、modeをアグレッシブに変更するために、この設定を入れる。local.confを書き換えている。

fail2banのblacklist拡張のインストール

fail2banのblacklist拡張(しつこくリトライしてくる攻撃元を1年間banする)を導入する。

# fail2ban blacklist
curl -L https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/filter.d/blacklist.conf > /etc/fail2ban/filter.d/blacklist.conf
curl -L https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/action.d/blacklist.conf > /etc/fail2ban/action.d/blacklist.conf
cat <<EOL >>/etc/fail2ban/jail.local

[blacklist]
enabled = true
backend = auto
logpath  = /var/log/fail2ban.*
filter = blacklist
banaction = blacklist
bantime  = 31536000   ; 1 year
findtime = 31536000   ; 1 year
maxretry = 10
EOL
touch /etc/fail2ban/ip.blacklist
systemctl restart fail2ban

サーバ作成後の処置

自分のスクリプトでは、セットアップスクリプト実行後はリブートしない。これは動作チェックをやっておきたいのと、自分で dnf update をしたいと思うので、意図的にリブートしないようにしている。確実にアップデート・リブートしたいという方は、スクリプトの末尾に

dnf -y update
reboot

を追記しておくとよい。