AWS EC2にユーザを追加してsudoに制限をかける
まえがき
AWSの勉強のために下記のような構成のAWS環境を構築した https://gyazo.com/f69f3874bed881f7ed98a874027a56ae
踏み台からwebサーバにec2-userとして接続できるようになり、最低限作業ができる状態になった。しかしこの環境のままいきなり開発をするとセキュリティ的によろしくない。よろしくない理由は下記の通り。
ec2-userというユーザ名はEC2にデフォルトで用意されるもので、名前が広く知れ渡っている ユーザ名が容易に予測できてしまう(不正アクセスに利用されやすい)
誤操作、不正操作の場合のリスクを伴う
よって、AWS環境を構築する場合は、一般に「EC2接続が可能になったタイミングで専用のユーザを別途追加し、ec2-userはログイン不可、あるいは削除する」ことが良いとされる。
今回AWS環境を自分で構築するにあたり、そういった過去の知見を踏襲し、適切な権限を付与したユーザ、グループを用意してみる。
やること
webサーバへの新規ユーザ、グループの追加
踏み台サーバからwebサーバへSSH接続するための公開鍵の登録
開発用グループへのsudo権限の付与
ec2-userユーザの削除
(おまけ)rootユーザのパスワードの変更
webサーバへの新規ユーザ、グループの追加
方針として、開発者ユーザは開発者グループに属するものとし、sudo権限は開発者グループに付与するものとする。命名とかは特に考えていないが、下記のような命名にした。
table:user_group
user group
dev01 dev
dev02 dev
... dev
開発者が増える都度devXXユーザを追加する。あるべきとしては開発者名がそのままユーザ名にしたほうが良いのだろうけれど、今回は僕しか使わないのでこの名前にすることにした。
実際にwebサーバにユーザとグループを追加する。
以下はwebサーバにec2-userとしてログインした直後に実行したコマンド。
code:bash
su -
adduser dev01
groupadd dev
gpasswd -a dev01 dev
# 念の為ユーザに切り替えられるか確認
su - dev01
これでユーザとグループは追加できた。ただしこの時点ではsudo権限も何も付与されていないため、sudo lsすら実行できない。また、踏み台サーバからSSHでdev01としてアクセスすることもできない。
踏み台サーバからwebサーバへSSH接続するための公開鍵の登録
EC2作成時に踏み台からec2-userとしてwebサーバにSSH接続できるようにしたように、今回新規で追加したユーザもSSH接続できるようにする。違いは、EC2を作成したときは公開鍵の作成はAWSが自動でやってくれていたが、今回は自分で作成して登録する必要があることである。
EC2作成時にポップアップで秘密鍵(pemファイル)のダウンロード云々が表示される。踏み台からSSH接続する際は、踏み台環境にダウンロードした秘密鍵を配置し、$HOME/.ssh/configにIdentityFileとして秘密鍵のパスを指定すれば、すぐに接続できるようになっていた。公開鍵をec2-userに登録するのはEC2作成時にAWSがよしなにやってくれていたということになる。今回はそれを自前でやることになる。以下に鍵生成と登録の手順を書く。
code:bash
# 踏み台サーバでの作業
ssh-keygen -t rsa
# 秘密鍵、公開鍵の確認 (id_rsaファイルの存在確認)
ls ~/.ssh/
scp ~/.ssh/id_rsa.pub web:/tmp/
# webサーバでの作業
ssh web
su -
cd /home/dev01
mkdir .ssh
cd $_
mv /tmp/id_rsa.pub .
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chown dev01:dev01 authorized_keys
rm id_rsa.pub
これで踏み台サーバからSSH接続が可能になった。
開発用グループへのsudo権限の付与
グループに対してsudo権限を付与する。sudo可能かどうかの設定は/etc/sudoersにかかれている。これを直接vimで変更することもできるが、シンタックスチェックなどもやってくれるvisudoを使うほうがベター。
code:bash
su -
visudo
ファイルの末尾に下記の記載を追加する。
code:visudo
# for developer group
Cmnd_Alias DEV = /usr/sbin/
%dev ALL = (ALL) DEV
%dev ALL = (ALL) NOPASSWD: DEV
再度dev01ユーザとして接続しなおして、以下のコマンドをためしてみる。
code:bash
$ sudo ls -la
Sorry, try again.
sudo: 1 回パスワード試行を間違えました
$ sudo lsof
以下略...
lsコマンドは失敗して、lsofは成功する。lsofは先のsudo許可のディレクトリに含まれるコマンドのためである。これでsuコマンドをsudoで実行できなくなった。よってdevグループのユーザがroot相当でコマンドを実行するには、sudoersに登録されているものをsudo指定で実行するか、rootユーザにsuで切り替える以外なくなった。suに切り替えるにはrootのパスワードを知る必要があるため、devグループユーザは好き勝手にrootとしてコマンドを実行できなくなった。sudo rmとかもできない。
sudo権限が必要なコマンドが見つかった場合は、rootでsudo権限を登録する必要がある。
余談:ガチガチにコマンドを制限したい場合は、ユーザディレクトリ配下にコマンド用のディレクトリを作成してシンボリックリンクを配置して、sudoersにはそのディレクトリを指定するという方法があるらしい。
参考
ec2-userユーザの削除
ec2-user以外にsudo権限を付与できる状態が整ったので、ec2-userを削除する。以下のコマンドをrootユーザで実行する。
code:bash
$ userdel -r ec2-user
$ ls /home/
dev01
踏み台からもec2-userとして接続できなくなったことを確認したら完了。
参考
(おまけ)rootユーザのパスワードの変更
インスタンス作成直後はrootユーザにパスワードが設定されていない。ec2-userからsu -とかすれば普通にrootユーザに切り替えられてしまうため、パスワードはしっかり変更しておく。手順は下記。
code:bash
su -
passwd
以上