最新のソフトウェアにアップデート
インスタンスの起動直後は、インストール済みソフトウェアのバージョンが古い場合があります。
まとめてアップデートしましょう。
$ sudo yum update -y
タイムゾーンの変更
サーバを日本時間で運用する場合は、タイムゾーンを日本時間に設定します。
/etc/localtimeの設定変更
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
/etc/localtimeの設定前と設定後でタイムゾーンの設定が変わっていることを確認できます。
$ date
2014年 12月 16日 火曜日 09:03:29 UTC
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
2014年 12月 16日 火曜日 18:03:38 JST
/etc/sysconfig/clockの設定変更
$ sudo vi /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC= true
※UTC=true
ハードウェアクロックはUTCとしています。
cat << EOL | sudo tee /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
EOL
サーバを再起動し、全てのプロセスが新しいタイムゾーン設定を利用するようにします。
$ sudo reboot
rebootできない場合は、crondをrestartしておきましょう。
$ sudo service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
※2016-03-07追記
/etc/sysconfig/clockの変更をせずとも、/etc/localtimeを設定すれば日本時間で動作しますが、/etc/sysconfig/clockのタイムゾーンがデフォルトのUTCのままだと、glibcのアップデート時にタイムゾーンがUTCに戻ります。
glibcをアップデートする機会があったので、実験してみました。
$ date # 日本時間になっている
2016年 3月 7日 月曜日 10:19:47 JST
$ more /etc/sysconfig/clock # タイムゾーンはUTCの設定
ZONE="UTC"
UTC=true
$ sudo yum update glibc -y
$ date # 再度時刻を確認するとタイムゾーンがUTCに…
2016年 3月 7日 月曜日 01:20:37 UTC
不要なサービス(デーモン)の停止
最低限必要なサービスだけがサーバの起動時に自動起動されるように設定します。その後、必要に応じてサービスの起動設定をしましょう。
cloud-final
crond
irqbalance
network
ntpd
ntpdate
rsyslog
sshd
chkconfig --list
でサービス起動設定がONになっているサービスを探し、不要なサービスをsudo chkconfig off サービス名
で停止しても良いのですが、ntsysv
コマンドを使うと設定が楽にできます。
$ sudo ntsysv
$ chkconfig --list | cut -f1,5 | grep 3:on
cloud-final 3:on
crond 3:on
irqbalance 3:on
network 3:on
ntpd 3:on
ntpdate 3:on
rsyslog 3:on
sshd 3:on
不要なコンソールの起動を無効にしてサーバ資源を節約
$ sudo vi /etc/sysconfig/init
ACTIVE_CONSOLES=/dev/tty[1-6]
の部分をコメントアウトし、
ACTIVE_CONSOLES=/dev/tty1
を追加します。
#ACTIVE_CONSOLES=/dev/tty[1-6]
ACTIVE_CONSOLES=/dev/tty1
サーバを再起動すると、mingettyプロセスの数が減っていることを確認できます。
$ ps alx | grep mingetty | grep -v grep
4 0 2343 1 20 0 4180 580 n_tty_ Ss+ tty1 0:00 /sbin/mingetty /dev/tty1
4 0 2345 1 20 0 4180 580 n_tty_ Ss+ tty2 0:00 /sbin/mingetty /dev/tty2
4 0 2347 1 20 0 4180 580 n_tty_ Ss+ tty3 0:00 /sbin/mingetty /dev/tty3
4 0 2349 1 20 0 4180 580 n_tty_ Ss+ tty4 0:00 /sbin/mingetty /dev/tty4
4 0 2351 1 20 0 4180 584 n_tty_ Ss+ tty5 0:00 /sbin/mingetty /dev/tty5
4 0 2353 1 20 0 4180 584 n_tty_ Ss+ tty6 0:00 /sbin/mingetty /dev/tty6
$ ps alx | grep mingetty | grep -v grep
4 0 2115 1 20 0 4180 580 n_tty_ Ss+ tty1 0:00 /sbin/mingetty /dev/tty1
ec2-userの削除
セキュリティを強化するのであれば、ec2-userのアカウント名をそのまま使うのではなく、ec2-userは無効にして、新しいユーザを作成しましょう。
$ sudo adduser newuser
newuserにsudo権限を与えます。
wheelグループに所属するユーザはsudo権限があるので、wheelグループにnewuserを所属させることにします。
※2015/9/29追記
最近のEC2インスタンスで確認をしたところ、wheelグループに所属していてもsudo権限がない場合があるようでした。
(もしかしたら、昔から、初期設定ではwheelグループにsudo権限が無いかもしれませんが。)
$ sudo usermod -G wheel newuser
$ grep wheel /etc/group
wheel:x:10:ec2-user,newuser
※2015/9/29追記
/etc/sudoers.d/cloud-initにnewuser ALL = NOPASSWD: ALL
の一行を追加します。
$ echo 'newuser ALL = NOPASSWD: ALL' | sudo tee --append /etc/sudoers.d/cloud-init
/etc/sudoersの設定でnewuserにsudo権限を与えることもできます。
newuser ALL=(ALL) NOPASSWD: ALL
の一行を追加します。
$ sudo visudo
ec2-userのauthorized_keys
をnewuserの.sshディレクトリにコピーし、適切なパーミッションを設定します。
$ sudo rsync -a ~/.ssh/authorized_keys ~newuser/.ssh/
$ sudo chown -R newuser:newuser ~newuser/.ssh
$ sudo chmod -R go-rwx ~newuser/.ssh
$ sudo ls -al ~newuser/.ssh
合計 12
drwx------ 2 newuser newuser 4096 12月 17 13:27 .
drwx------ 3 newuser newuser 4096 12月 17 13:27 ..
-rw------- 1 newuser newuser 388 12月 17 13:16 authorized_keys
$ sudo su - newuser
$ sudo -s
#
newuserがsshでログインできることと、sudo権限を持つことを確認できたら、最後にec2-userを削除します。
$ sudo userdel ec2-user
ec2-userの削除ではなく、sshでのログインを禁止する場合は、
/etc/ssh/sshd_config
の設定でec2-userのsshログインを禁止することもできます。
DenyUsers ec2-user
の一行を追加します。
$ sudo vi /etc/ssh/sshd_config
/etc/ssh/sshd_configを修正したら、設定を反映させます。
$ sudo service sshd reload
awsコマンドを利用できるように設定
aws configure
で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]:
aws ec2 describe-instance-status
を実行すると、EC2インスタンスのスタータスの確認ができます。
$ aws ec2 describe-instance-status
{
"InstanceStatuses": [
{
"InstanceId": "i-xxxxxxxx",
"InstanceState": {
"Code": 16,
"Name": "running"
},
"AvailabilityZone": "ap-northeast-1b",
"SystemStatus": {
"Status": "ok",
"Details": [
{
"Status": "passed",
"Name": "reachability"
}
]
},
"InstanceStatus": {
"Status": "ok",
"Details": [
{
"Status": "passed",
"Name": "reachability"
}
]
}
},
...(略)...
]
}
awsコマンドを利用するための環境設定がされていない場合は、エラーメッセージが表示されます。
$ aws ec2 describe-instance-status
Unable to locate credentials. You can configure credentials by running "aws configure".
aws config
での設定は、ホームディレクトリの.awsディレクトリ内に保存されます。
$ more ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ more ~/.aws/config
[default]
region = ap-northeast-1
sshdのLISTENポート変更
sshdのLISTENポートを標準の22から別の番号へ変えておくことで、第三者からの攻撃被害を防げる可能性が高くなります。
下記は、sshdのLISTENポートを22から22022
※に変更を行う手順となります。
※22022の部分はRegistered Port Number(1024~49151)範囲内のポート番号に適当にかえてください。
/etc/ssh/sshd_configを編集し、
Port 22022
を追加します。
22022ポートへの接続確認ができるまで、22ポートのLISTENは残しておいたほうが安全なので、一旦、Port 22とPort 22022の両方を設定することにします。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
Port 22
Port 22022
/etc/ssh/sshd_config
の設定が完了したら、
sudo service sshd reload
コマンドを実行し、最新の設定を反映させます。
$ sudo service sshd reload
Reloading sshd: [ OK ]
問題が無ければ、netstat
コマンドでsshdがポート22022をLISTENしていることの確認ができます。
$ sudo netstat -anp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 540/sshd
tcp 0 0 0.0.0.0:22022 0.0.0.0:* LISTEN 540/sshd
tcp 0 0 xxx.xxx.xxx.xxx:22 yyy.yyy.yyy.yyy:63916 ESTABLISHED 462/sshd
tcp 0 0 :::22 :::* LISTEN 540/sshd
tcp 0 0 :::22022 :::* LISTEN 540/sshd
unix 3 [ ] STREAM CONNECTED 489675 462/sshd
unix 2 [ ] DGRAM 489671 462/sshd
unix 3 [ ] STREAM CONNECTED 489674 464/sshd
※netstatの-p
オプションはroot権限が必要なので、sudoコマンドでnetstatを実行しています。
22022ポートでのssh接続を確認できたなら、ポート22のLISTENは不要ですので、
/etc/ssh/sshd_config
のPort 22
を削除し、sshdに最新の設定を反映させます。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
Port 22022
$ sudo service sshd reload
Reloading sshd: [ OK ]
$ sudo netstat -anp | grep ssh
tcp 0 0 0.0.0.0:22022 0.0.0.0:* LISTEN 32166/sshd
tcp 0 0 xxx.xxx.xxx.xxx:22022 yyy.yyy.yyy.yyy:61530 ESTABLISHED 32358/sshd
tcp 0 0 :::22022 :::* LISTEN 32166/sshd
unix 2 [ ] DGRAM 484858 32358/sshd
unix 3 [ ] STREAM CONNECTED 484862 32358/sshd
unix 3 [ ] STREAM CONNECTED 484861 32360/sshd
関連
以下もよろしければどうぞ。