EC2 Amazon Linuxインスタンス起動後に最初にやること

最初に

サーバ構築時の基本的な考え方として、ミニマムインストール&できる限りyumなどのパッケージ管理コマンドを使ってインストールを行います。


基本設定

最新のソフトウェアにアップデート

$ sudo yum update -y

ホスト名

$ sudo hostname hoge;
$ sudo vim /etc/sysconfig/network
HOSTNAME=hoge;
# aws から払い出された<Private IPs>を書く。
$ echo "<Private IPs> hoge" |sudo tee -a /etc/hosts
  • 内部DNSサーバとかあればホスト名設定して踏み台からホスト名で入れるようにしたりします。内部DNSなければ、sshのconfigとかに設定して、skelに入れておく必要があります。
  • hostname 変更後は、syslog や crond の再起動も忘れないようにしましょう。(logにhostnameが含まれている為、再起動しないとhostnameが変わりません。)

タイムゾーン設定

$ echo -e 'ZONE="Asia/Tokyo"\nUTC=false' | sudo tee /etc/sysconfig/clock
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
  • 基本的には各ミドルウェア再起動しない限り、タイムゾーン変更前の時刻で記録されるので、タイムゾーン変更後はinstanceごと再起動するのが望ましいです。

言語設定

$ echo "LANG=ja_JP.UTF-8" | sudo tee /etc/sysconfig/i18n

スケルトン作成

# まずは最低限.sshディレクトリと公開鍵のスケルトン
$ sudo mkdir -m 700 /etc/skel/.ssh
$ sudo touch /etc/skel/.ssh/authorized_keys
$ sudo chmod 600 /etc/skel/.ssh/authorized_keys
  • config、本番サーバログイン用の秘密鍵、githubリポジトリ用の秘密鍵などお好みのものを設定してください。

プロンプト、コマンド履歴

$ sudo vim ~/.bashrc
# プロンプトと終了ステータスを顔文字で表現する。
function ps_exit() {
a=$?
if [ $a -ne 0 ]; then
echo "/(T_T)\\"
else
echo "\\(^o^)/"
fi
exit $a;
}
PS_EXIT="\$(ps_exit)"
# プロンプトを赤色にする。
PS1="\[\033[31m\][\u@\h \W]\$\[\033[00m\] "
# コマンド履歴をセッション内・bash_history共に10000件まで保存する。
HISTTIMEFORMAT='%Y-%m-%dT%T%z '
HISTSIZE=10000
HISTFILESIZE=10000
# aliase を設定しておくと便利です。
alias crontab='crontab -i'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
管理用ユーザー設定
# ユーザー追加、公開鍵追加(スケルトン設定している前提)
$ sudo useradd eureadmin
$ sudo su eureadmin
vim ~/.ssh/authorized_keys
# 特権付与、パスワードキャッシュを3分に
$ sudo visudo
Defaults timestamp_timeout = 3
eureadmin ALL = (ALL) NOPASSWD: ALL, !/bin/su
# root権限を持つことが可能な一般ユーザーを限定させる。
$ echo 'SU_WHEEL_ONLY yes' | sudo tee -a /etc/login.defs
$ echo 'auth required /lib64/security/pam_wheel.so use_uid' | sudo tee -a /etc/pam.d/su
# (管理ユーザーでログインしなおして)ec2ユーザーの削除
$ sudo userdel -r ec2-user
SSHログイン設定
$ sudo vim /etc/ssh/sshd_config
# rootログインの禁止
PermitRootLogin No
# パスワードログインの禁止(公開鍵認証のみ許可)
PasswordAuthentication no
  • global ipがついている場合はsecurity group等でアクセス制限をしましょう。
  • global ipがついている場合はportを変更すると安全です。
sendmailのstop
$ sudo /etc/init.d/sendmail stop
$ sudo /sbin/chkconfig sendmail off
  • 最近では postfix を使う事が多いので、postfix に切り替えてもいいと思います。
awsコマンドを利用できるように設定
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:
SELinuxの現在の動作モードを確認する
$ getenforce
Disabled
  • EC2 Amazon Linux インスタンスではデフォルトで無効になっています。
SELinuxを有効にしてみる (おまけ)
  • SELinux の設定については自己責任で行ってください。
# SELinuxパッケージのインストール
$ sudo yum -y install selinux-policy-targeted policycoreutils-python
# 最新のカーネルの起動パラメータに「security=selinux selinux=1」を追記
$ sudo vim /boot/grub/menu.lst
kernel /boot/vmlinuz-4.1.13-*.*.amzn1.x86_64 root=LABEL=/ console=ttyS0 security=selinux selinux=1
# 次回起動時にファイルシステムのSELinuxコンテキストが再設定されるように以下のファイルを作成する。
# ラベルをつけ直してから問題が起きてアクセスができなくなると困るので、SELinuxは一旦 permissiveモードにしておきます。
$ sudo touch /.autorelabel
$ sudo vim /etc/selinux/config
SELINUX=permissive
$ sudo reboot
# SELinuxコンテキストが正しく設定されていることを確認する。
$ ls -lZ /etc
# SELinuxの設定ファイルの「SELINUX=permissive」の部分を「SELINUX=enforcing」に変更する。
$ sudo vim /etc/selinux/config
SELINUX=enforcing
$ sudo reboot
まとめ
簡単にではありますが、EC2 Amazon Linuxインスタンス起動後に最初にやること書きました。
今後もこんな感じで運用に役立つtipsなどを書いていきたいと思います。