Help us understand the problem. What is going on with this article?

AWS EC2 Amazon Linuxインスタンス起動後、最初にやることまとめ(SysVinit編)

More than 1 year has passed since last update.

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

インスタンスの起動直後は、インストール済みソフトウェアのバージョンが古い場合があります。
まとめてアップデートしましょう。

$ sudo yum update -y

タイムゾーンの変更

サーバを日本時間で運用する場合は、タイムゾーンを日本時間に設定します。

/etc/localtimeの設定変更

$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

/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
/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しておきましょう。

crondの再起動
$ 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

ntsysv.png

ランレベル3で設定がONになってるサービスの確認
$ 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

不要なコンソールの起動を無効にしてサーバ資源を節約

/etc/sysconfig/initの編集
$ 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プロセスの数が減っていることを確認できます。

サーバ再起動前の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
サーバ再起動後のmingettyプロセス
$ 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は無効にして、新しいユーザを作成しましょう。

newuserの追加
$ sudo adduser newuser

newuserにsudo権限を与えます。
wheelグループに所属するユーザはsudo権限があるので、wheelグループにnewuserを所属させることにします。
※2015/9/29追記
最近のEC2インスタンスで確認をしたところ、wheelグループに所属していてもsudo権限がない場合があるようでした。
(もしかしたら、昔から、初期設定ではwheelグループにsudo権限が無いかもしれませんが。)

newuserをwheelグループに追加
$ sudo usermod -G wheel newuser
wheelグループのユーザの確認
$ grep wheel /etc/group
wheel:x:10:ec2-user,newuser

※2015/9/29追記
/etc/sudoers.d/cloud-initにnewuser ALL = NOPASSWD: ALLの一行を追加します。

/etc/sudoers.d/cloud-initに設定を追加
$ echo 'newuser ALL = NOPASSWD: ALL' | sudo tee --append /etc/sudoers.d/cloud-init

/etc/sudoersの設定でnewuserにsudo権限を与えることもできます。
newuser ALL=(ALL) NOPASSWD: ALL
の一行を追加します。

/etc/sudoersの設定
$ sudo visudo

ec2-userのauthorized_keysをnewuserの.sshディレクトリにコピーし、適切なパーミッションを設定します。

authorized_keysのコピーと適切なパーミッションの設定
$ 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
newuserにsudo権限があるか確認
$ sudo su - newuser
$ sudo -s
#

newuserがsshでログインできることと、sudo権限を持つことを確認できたら、最後にec2-userを削除します。

ec2-userアカウントの削除
$ sudo userdel ec2-user

ec2-userの削除ではなく、sshでのログインを禁止する場合は、
/etc/ssh/sshd_configの設定でec2-userのsshログインを禁止することもできます。
DenyUsers ec2-userの一行を追加します。

/etc/ssh/sshd_configの設定
$ sudo vi /etc/ssh/sshd_config

/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コマンド確認
$ 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コマンドを利用するための環境設定がされていない場合
$ 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の両方を設定することにします。

/etc/ssh/sshd_configの編集
# 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
コマンドを実行し、最新の設定を反映させます。

/etc/ssh/sshd_configの設定を反映
$ sudo service sshd reload
Reloading sshd:                                            [  OK  ]

問題が無ければ、netstatコマンドでsshdがポート22022をLISTENしていることの確認ができます。

sshdの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_configPort 22を削除し、sshdに最新の設定を反映させます。

/etc/ssh/sshd_configのポート22設定を削除
# 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
/etc/ssh/sshd_configの設定を反映
$ sudo service sshd reload
Reloading sshd:                                            [  OK  ]
sshdのLISTENポート確認
$ 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      

関連

以下もよろしければどうぞ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away