EC2でUbuntu用のBaseOSイメージを作ってみた

ローカルの仮想基盤(Hyper-V)よりEC2でサーバ構築することが増えてきました。
何といっても環境がすぐに準備できていらなくなったら捨てられるというのもいいですし、公私ともAWSでサーバ構築というパターンが増えてきています。

特にプライベートではHyper-V使ってるんですが仮想ディスクのHDDイメージが
わさわさできてきてディスク容量がいっぱいになってイメージ消したりしないと
いけなかったりと色々と面倒が出てきてます。
特にプライベートではAWSをそのまま使うと費用が掛かるのでGMOの株主優待使ってConohaでWebサーバを立てた方が割安なのでそっちを使っています。

仕事ではがんがんEC2を使っています。今までt2.microを使っていたんですが、ここにきて無料利用枠がそろそろ切れそうなので次のサーバはt3.microで構築した方がコスパが
イイかなぁと思いまして、でEC2のBaseのUbuntuイメージをAMI化したのでその時の
手順をまとめておこうかと思ってメモする次第です。
clamavはsmallレベルじゃないとバッチがまともに動かないので要注意です。
Fail2Banとかrootkitも同じく
それでは以下に手順です。

1.BaseOS インスタンス作成
・種別
  t3micro Ubuntu18.04LTS
・ElasticIPの割当
 停止している状態でインスタンスにElasticIPを割当する。

2.設定コマンド類

## ホスト名設定
$ sudo hostnamectl set-hostname basesrv

## アップデート
$ sudo apt-get -y update
$ sudo apt-get -y upgrade

## sshセキュア強化
$ sudo vi /etc/ssh/sshd_config
+   PermitRootLogin no

$ sudo service ssh restart

## 日本語化
$ sudo apt-get -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo apt-get -y install binutils
$ strings /etc/default/locale
$ sudo apt-get -y install manpages-ja manpages-ja-dev

## timeZone設定
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
$ strings /etc/localtime

## ntp
$ sudo apt-get -y install ntp

$ ntpq -p
$ date

## chkrootkitインストール
$ sudo apt-get -y install chkrootkit
$ sudo  chkrootkit | grep INFECTED

## デフォルトエディタ変更
$ sudo update-alternatives --config editor
$ sudo apt-get -y remove nano

## 追加リポジトリ
$ sudo apt-get -y install apt-file

## ウイルス検知ソフトインストール
$ sudo apt -y install clamav clamav-daemon
$ sudo rm /var/log/clamav/freshclam.log
$ sudo touch /var/log/clamav/freshclam.log
$ sudo chown clamav:clamav /var/log/clamav/freshclam.log
# ログローテーション設定
$ sudo vi /etc/logrotate.d/clamav-freshclam
以下の通り修正
++++++++++++++++++++++
create 640 clamav clamav
++++++++++++++++++++++
$ sudo freshclam
$ sudo service clamav-freshclam status
$ sudo clamscan --infected --remove --recursive /home
~半時間くらいかかる~
$ sudo systemctl start clamav-freshclam

# スクリプト
$ sudo mkdir /var/log/clamav/virus
$ sudo chown clamav /var/log/clamav/virus
$ sudo chgrp adm /var/log/clamav/virus

$ sudo vi clam-full.sh
++++++
#!/bin/sh
echo =========================================
date
clamscan / \
     --infected \
     --recursive \
     --log=/var/log/clamav/clamscan.log \
     --move=/var/log/clamav/virus \
     --exclude-dir=^/sys \
     --exclude-dir=^/proc \
     --exclude-dir=^/dev \
     --exclude-dir=^/var/log/clamav/virus

# --infected 感染を検出したファイルのみを結果に出力
# --recursive 指定ディレクトリ以下を再帰的に検査 圧縮ファイルは解凍して検査
# --log=FILE ログファイル
# --move=DIR 感染を検出したファイルの隔離先
# --remove 感染を検出したファイルを削除
# --exclude=FILE   検査除外ファイル(パターンで指定)
# --exclude-dir=DIR 検査除外ディレクトリ(パターンで指定)

if [ $? = 0 ]; then
    echo "ウイルス未検出."
    # cat /var/log/clamav/clamscan.log | mail -s "Clamav scan OK." root
else
    echo "ウイルス検出!!"
    cat /var/log/clamav/clamscan.log | mail -s "Clamav scan NG!" root
fi
++++++
$ sudo chmod +x clam-full.sh
$ sudo ./clam-full.sh
~1時間くらいかかる~

# clamav-deamon設定
$ sudo vi /etc/clamav/clamd.conf
コメントアウト
+++++++++++++
#User clamav
++++++++++++
$ sudo service clamav-daemon restart
$ sudo service clamav-daemon status
$ sudo crontab -e
+++++++++
0 0 * * *  /home/ubuntu/clam-full.sh >> /var/log/clamav/clamav_scan.log
+++++++++

## Fail2Banインストール
$ sudo apt-get -y install fail2ban
$ sudo fail2ban-client status
$ sudo fail2ban-client status sshd

## メール送信設定
$ sudo apt-get -y install postfix sasl2-bin mailutils

$ sudo vi /etc/postfix/main.cf
++++++++++++++++++++++++
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587
++++++++++++++++++++++++

$ sudo vi /etc/postfix/sasl_passwd
++++++++++++++++++++++++++++
[smtp.sendgrid.net]:587 ID:password
++++++++++++++++++++++++++++

$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap hash:/etc/postfix/sasl_passwd
$ sudo systemctl restart postfix
$ echo "test" | mail -s "test" mayaddr@example.com

## logwatchインストール
$ sudo apt-get -y install logwatch
$ sudo vi /etc/aliases
++++++++++++++++++++++++
root: mayaddr@example.com
++++++++++++++++++++++++
$ sudo newaliases
$ logwatch --mailto root

## 日次バックアップ設定
管理コンソールでEC2FullACCESSユーザを作成
EC2に以下のタグを付ける
キー:サーバ名-Backup-Generation , 値:2
キー:Name 値:サーバ名

## AWS-CLI インストール
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install awscli
$ sudo aws --version
aws-cli/1.16.72 Python/2.7.15rc1 Linux/4.15.0-1021-aws botocore/1.12.62
$ sudo aws configure --profile ec2backup
AWS Access Key ID [None]: ACCESSKEY
AWS Secret Access Key [None]: SECRETKEY
Default region name [None]: ap-northeast-1
Default output format [None]: text
$ sudo aws ec2 describe-instances --profile ec2backup --region ap-northeast-1 --instance-ids インスタンスID

## バックアップ用Shell作成
$ sudo vi ami_auto_backup.sh

※commonの箇所については設定するサーバに併せて書き替えること。
+++++++++++++++++
#!/bin/bash
export HOME=/root;

PROFILE="ec2backup"
REGION="ap-northeast-1"
BILLINGGROUP="common"
BACKUPGROUP="common-Backup-Generation"

## tmpディレクトリチェック
if [ ! -e "/tmp" ];then
        mkdir -p /tmp
fi

## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得
/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=${BACKUPGROUP}" | awk '{print $3" "$5}' > /tmp/tmp_get_data

while read INSTANCE_ID SEDAI_NO; do
    if [ ! -z ${INSTANCE_ID}  -a ! -z ${SEDAI_NO} ];then
        ## AMIの数を確認
        NOW_AMI_CNT=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | wc -l`

        ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する
        if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then
            ## 削除対象のAMI_ID取得
            DELETE_AMI_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | head -1 | awk '{print $4}'`

            ## AMI登録の解除
            /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID}

            ## 削除対象のスナップショットID取得
            DELETE_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-snapshots --profile ${PROFILE} --region ${REGION} --filters Name=description,Values=*${DELETE_AMI_ID}* --query 'Snapshots[*].{ID:SnapshotId}'`
            ## スナップショットの削除
            /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID}
        fi

        ## インスタンス名取得
        INSTANCE_NAME=`/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Name" | grep "${INSTANCE_ID}" | awk '{print $5}'`

        ## AMI作成
        DATE=`date +%Y%m%d%H%M%S`
        CREATE_AMI_ID=`/usr/local/bin/aws ec2 create-image --profile ${PROFILE} --region ${REGION} --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${DATE}" --description "Create from ${INSTANCE_ID}" --no-reboot`

        sleep 2

        ## AMIにタグを付けする(例:  Name:amazon-linux-test-SV   Backup-Type:auto)
        /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${CREATE_AMI_ID} --tags Key=Name,Value=${INSTANCE_NAME} Key=Backup-Type,Value=auto Key=Billing,Value=${BILLINGGROUP}

       ## スナップショットにタグ付けする
       BKUP_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filter "Name=tag:Name,Values=${INSTANCE_NAME}" --query="Images[].[BlockDeviceMappings[].Ebs[].[SnapshotId]]" --output=text`
      /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${BKUP_SNAPSHOT_ID} --tags Key=Billing,Value=${BILLINGGROUP}

    fi
done < /tmp/tmp_get_data

rm -f /tmp/tmp_get_data

exit 0
+++++++++++++++++

$ sudo chmod 755 ami_auto_backup.sh
$ cd /home/ubuntu
$ sudo cp -R .aws /root/

$ sudo crontab -e
+++++++++++++++++
30 2 * * *  /home/ubuntu/ami_auto_backup.sh >/dev/null 2>&1
+++++++++++++++++

## ログ類初期化
$ sudo find /var/log/ -type f -name \* -exec cp -f /dev/null {} \;
$ sudo  history -c

3.AMIイメージ作成
AMIイメージ名:yyyymmdd_BaseOS_image
タグ:キー=Name,値=サーバ名


とりあえず以上でベースイメージは完成、Ubuntu18.04LTSは
10年サポートされるらしいですが、LTSといっても2年に1度は更新した方が
新しい機能とかいろいろあるのでいいかなぁと思います。それに古い基盤で
アプリ動かすのは少し気持ち悪いんですけどねぇ。
特に某PHPとか某Javaとか、何とかいうフレームワークとか脆弱性発見されても
修正されないサーバのなんと多い事よ。


コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)