AWSでEC2とRDSでwordpressをセットアップしてみたので記事にする!の第2回です。この記事ではローカル環境からSSHでEC2インスタンスに安全に接続するまでを紹介します。
この記事はこんな人にオススメ
- AWSを初めて使う方
- EC2インスタンスを立ち上げた後に最低限何をやればいいか知りたい方
- なんとなくSSHを使っているが公開鍵と秘密鍵を理解したい方
このサイト(ブログ)はConoHa WINGで運用しています。国内最速、超安定、稼働率99.99%以上、ということだけあってConoHa WINGにまったく不満もなくむしろ動作もキビキビ速いし、コンソールもまずまず使いやすく快適で満足しかないです。ConoHa WINGの詳細はこちらです。
本シリーズの記事はAWSのEC2とRDSを使ってwordpressをセットアップし、バックアップにはS3を活用します。自由度や柔軟性は圧倒的にAWSが高い反面、セキュリティの対策や日々のメンテナンスも必要になってきます。つまりネットーワークやセキュリティ、AWSの勉強にはもってこい!ってことです。
それとは逆に、コンテンツ制作やクリエイティブ面に注力したい場合は、ネットワークやセキュリティ、サーバ構築、メンテナンスなどがほぼ必要のないConoHa WINGがオススメです。
さて、第1回ではAWSのアカウント登録からEC2インスタンス作成、Elastic IPの割り当てと関連づけ、RDSデータベースの作成を説明しています。まだAWSアカウントを作成されていない方や、インスタンスをまだ立ち上げていない方は、まず下の記事からご覧ください。
この記事でわかること
- EC2インスタンス安全にSSH接続する方法
- 新ユーザーでSSHでログインできるようにする方法
- ec2-userのSSHを禁止する方法
このシリーズではEC2インスタンスの初期設定、apache、php、mysql、などをインストール・設定し、作成したRDSにwordpress用のDBを構築していきます。第2回のこの記事ではローカル環境からSSHでEC2インスタンスに安全に接続するまでを紹介します。
ネットワーク、セキュリティや各種チューニング、AWSの各サービスの詳細は奥が深すぎるので今回は触れませんが、「AWSではじめるインフラ構築入門 安全で堅牢な本番環境のつくり方」はオススメの書籍です。
目次
全体像
- STEP
【AWS】コンソール操作でEC2とRDSを準備する
- STEP
【AWS】EC2にSSHで安全にアクセスする
- STEP
【AWS】Apacheで最低限やっておくべきSSL/TLSの設定
- STEP
【AWS】EC2とRDSでwordpressをセットアップする
- STEP
【AWS】S3にwordpressをバックアップする
EC2インスタンスへまずはSSH接続する
前回の記事でインスタンス作成時にキーペアを作成しプライベートキー(秘密鍵)をダウンロードしました。[インスタンス名].pemというファイル名です。対になるパブリックキー(公開鍵)はEC2インスタンスのec2-userのホームディレクトリに格納されています。
SSHの公開鍵暗号化方式をざっくり理解する
SSHは、データを暗号化してセキュアにサーバに接続しやり取りする。ということはわかっている。公開鍵や秘密鍵という用語もなんとなく知っている。が、深くは理解していないけどいつも使っている。という感じではないでしょうか。(私もです)
pemについてもpemってなんだ?鍵でしょ。ぐらいであまり深く突っ込んで理解することがないようにも思います。(私もです)
良い機会なのでざっくりですが知っていて損のないSSHの公開鍵暗号化方式について記載します。
pemとは?
前述のEC2インスタンス作成時にキーペアを作成してプライベートキー(秘密鍵)をダウンロードしました。拡張子は.pemになっています。このpemですが「Privacy Enhanced Mail」の略です。ん?Mail?と思った方は素晴らしいです。そうです。pemは電子メールシステムにメッセージの暗号化と本人認証の機能を取り込むための仕様で、RFCに規定されています。(下記の表参照)
RFC Number | RFC Title |
---|---|
RFC 1421 | Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures |
RFC 1422 | Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management |
RFC 1423 | Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms, Modes, and Identifiers |
RFC 1424 | Privacy Enhancement for Internet Electronic Mail: Part IV: Key Certification and Related Services |
SSHの公開鍵、秘密鍵とは?
下記の2つのサイトがわかりやすくとても参考になりました。
電子署名の応用で、秘密鍵の所有者しか正しい署名が作れないことを利用し、署名の正しさを公開鍵で検証してもらうことで、確かに所有者であることを確認してもらいます。これが本人確認になっているということです。
このような使い方ですから、秘密鍵は利用者本人以外に漏らしてはいけませんし、公開鍵は予めサーバに登録しておく必要があります。
単純に言うと、ユーザが自身の秘密鍵を使って署名を生成し、その署名をサーバ側が公開鍵を使って検証できれば、その署名は確かに正当なユーザが作成したものだからと判断し、認証成功ということです。もちろん、ユーザと公開鍵との対応が適切かどうかも照合を行います。
ただし注意が必要なのは、認証の前の鍵交換、中でもその手続きによって共有されるセッションIDが絡んでくることです。
https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432
SSHの詳細については別の記事で詳しく書きたいと思います。
EC2インスタンスへSSH接続
説明が長くなりましたが、EC2インスタンスへSSH接続します。まずは秘密鍵([インスタンス名].pem)のパーミションを400にして自分以外読み取り不可にします。ここでは秘密鍵の名前はsecret.pemとします。
chmod 400 secret.pem
続いてSSHでEC2インスタンスに接続します。接続するコマンドは下のようになります。
ssh -i "secret.pem" ec2-user@IP-address
無事にログインすると以下のメッセージが表示されます。
Last login: Tue Oct 4 19:45:41 2022 from xxxxx
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
uname -r
5.10.135-122.509.amzn2.x86_64
暗号技術入門 第3版 秘密の国のアリス
EC2インスタンスのタイムゾーンとロケール設定
何はともあれアップデート
ログイン後にまずは何はともあれをアップデートします。
sudo yum update
タイムゾーンとロケールの設定
インスタンス立ち上げたデフォルトの状態ではタイムゾーンやロケーションがUTCになっていて、様々なログ(例えばapacheのログ)でロギングされる時間もUTCになってしまうので変更します。
sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8
タイムゾーンとロケールの確認
下記のコマンドでタイムゾーンとロケールを確認します。
sudo timedatectl
Local time: 水 2022-10-05 00:28:35 JST
Universal time: 火 2022-10-04 15:28:35 UTC
RTC time: 火 2022-10-04 15:28:36
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
sudo localectl
System Locale: LANG=ja_JP.utf8
VC Keymap: n/a
X11 Layout: n/a
EC2インスタンスへ新規ユーザーの追加
EC2インスタンスは立ち上げたその時からec2-userというユーザーが作成されています。上のSSH接続の説明記事でもこのec2-userでログインしています。このec2-userはすぐ利用も出来て便利ではありますが、一方でEC2インスタンスにはec2-userというユーザーが存在する、ということが広く知られている状態です。悪意のある攻撃者からは格好の餌食になる可能性もあります。
セキュリティを高めるために新たなユーザーを追加し、加えてこのec2-userのSSH接続を禁止にしていきます。
新しいユーザーの作成
下記のコマンドで新しいユーザーを作成します。ここでは「namileri」というユーザーを追加しています。
sudo useradd namileri
新しいユーザーのパスワードの設定
下記のコマンドで「namileri」のパスワードを設定します。
sudo passwd namileri
ユーザー namileri のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
wheelグループへ追加
「namileri」がsudoを使えるようにwheelグループに追加します。
sudo usermod -aG wheel namileri
新ユーザーでSSHでログインできるようにする
追加したユーザー「namileri」でSSHでリモートログインするために、キーペアを作ってローカル側には秘密鍵、サーバ側に公開鍵を設置しておく必要があります。
ec2-userのサーバ側の秘密鍵をコピーし新ユーザーのディレクトリに設置する方法もありますが、今回はローカルのMacで新たにキーペアを作り、ローカル側には秘密鍵、サーバ側に公開鍵を設定する方法でやります。
ローカルのMacでキーペアを作成します。(サーバ側ではなくローカル側)
ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/u/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/u/.ssh/id_ed25519
Your public key has been saved in /Users/u/.ssh/id_ed25519.pub
The key fingerprint is:
(省略)
上の例では、デジタル署名アルゴリズムにed25519を指定しています。ed25519はOpenSSHのバージョン6.5から導入され、これまでのアルゴリズムより優れたセキュリティと優れたパフォーマンスの楕円曲線を使ったアルゴリズムです。詳しくは下記を参考にしてください。
作成した公開鍵と秘密鍵の確認
ssh-keygenした際のメッセージにもあった通り、作成した公開鍵と秘密鍵はホームディレクトリの.sshに入っています。確認してみましょう。
ls -l ~/.ssh
total 40
-rw------- 1 u staff 399 10 6 22:47 id_ed25519
-rw-r--r-- 1 u staff 92 10 6 22:47 id_ed25519.pub
作成した公開鍵をサーバに設置
公開鍵であるid_ed25519.pubをEC2インスタンスの該当ユーザディレクトリの~/.ssh/authorized_keysに追加します。(該当ユーザーは今回は「namileri」です)
やり方はいくつかありますが、今回は一番簡単なコピペでやってみましょう。
ローカル側の公開鍵の内容をコピーする
ターミナルを開いて以下のコマンドで内容を表示し、ssh-ed25519で始まる1行をコピーします。
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
サーバ側に設置する
ターミナルを新規ウィンドウで立ち上げて、EC2にec2-userでSSHし、該当ユーザディレクトリの~/.ssh/authorized_keysにペーストします。(該当ユーザーは今回は「namileri」です)
まずは、EC2インタンスの新規ユーザーのホームディレクトリに.ssh/ディレクトリを作成し、空のauthorized_keysファイルを作成します。(「namileri」の部分は適宜読み替えてください)
sudo mkdir /home/namileri/.ssh
sudo touch /home/namileri/.ssh/authorized_keys
sudo chown -R namileri:namileri /home/namileri/.ssh/
sudo chmod 400 /home/namileri/.ssh/authorized_keys
作成したauthorized_keysにローカルでコピーしたid_ed25519.pubの内容をペーストします。
sudo vi /home/namileri/.ssh/authorized_keys
# viで開いて貼り付けて保存する
新規ユーザーでSSHログインする
下のコマンドで秘密鍵を指定し、「namileri」ユーザーでSSH接続します。
ssh -i .ssh/id_ed25519 namileri@IP-address
自分がどのグループに属しているかを確認します。wheelグループに所属していることを確認します。
groups
namileri wheel
sudoコマンドが使えることを確認
まずは権限のないファイルをcatしてみます。(Permission deniedになる)
cat /var/log/secure
cat: /var/log/secure: Permission denied
sudoが使えることを確認します。
sudo cat /var/log/secure
そのユーザーがwheelグループに所属しているけれどsudoコマンドが使えない場合は、sudo visudoコマンドで%wheel ALL=(ALL) ALLの行のコメントが外れていない場合はコメントを外してください。
sudo visudo
%wheel ALL=(ALL) ALL
# 上の行のコメントを外す wheelグループはすべてのコマンドでsudoできるようにします
ec2-userのSSHを禁止する
追加したユーザーでSSHでログインができ、またsudoコマンドが使えることを確認できたら、セキュリティの観点でec2-userのSSH接続を禁止した方が良いです。
/etc/ssh/sshd_configにDenyUsers ec2-userの1行を追加し、sshdをリスタートします。
sudo vi /etc/ssh/sshd_config
DenyUsers ec2-user
# この1行を追加
sudo systemctl restart sshd
sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 金 2022-10-07 00:00:48 JST; 4s ago
ec2-userのSSHを禁止した後に、ec2-userでSSHログインを試すと以下のログが確認できます。
sudo tail /var/log/secure
User ec2-user from x.x.x.x not allowed because listed in DenyUsers
MFA(多要素認証)を有効にする
AWSで必ずやっておきたい多要素認証の設定方法を紹介します。
AWSではセキュリティ強化のために必ずMFA(多要素認証)を設定しましょう。AWSアカウントのルートユーザーとIAMユーザーでMFAを設定することができます。設定も簡単です。
ざっくりMFAとは?
MFAとは、一般的なログイン認証情報であるユーザー名とパスワードに加えて、もう1つ(1つ以上)の認証要素を加え、ユーザに対してこの2つ以上の認証要素を要求し認証する方法です。
今回は追加の認証要素としてワンタイムパスワード(OTP)を追加します。ワンタイムパスワードは6桁の数字となり、受信方法はSMSやメールといったケースも多いですが、私は1Password8で保存してワンタイムパスワードを管理しています。
2FAとの違いは?
ちなみに、2FAという単語もよく見かけますが2FAとは「2要素認証」です。2FAは2つの要素で認証する方法ですが、MFAは2つ以上の要素を設定し認証する方式です。
それではAWSのMFAを有効にしましょう。
AWSでワンタイムパスワードを追加する手順
以下のAWS公式ドキュメントを参考にMFAを有効にします。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_checking-status.html
- STEP
IAM コンソールにアクセス
AWS Management Console にサインインし、IAM コンソールにアクセスします。
IAMコンソール:https://console.aws.amazon.com/iam/
- STEP
セキュリティ認証情報をクリック
右上のナビゲーションバーでユーザー名を選択し、セキュリティ認証情報をクリックします。
- STEP
MFAが有効か無効かを確認
MFAが有効でない場合は下の画像のようにアラートが出ています。
- STEP
MFAを割り当てる
では実際にMFAを割り当て設定します。
- STEP
MFAデバイスを選択
今回は1Password8でワンタイムパスワードを管理するので「Authenticator app」を選択します。デバイス名にはわかりやすい名前をつけます。(なんでも構いません)
- STEP
デバイスの設定
- STEP
MFAコードを2つ入力しMFAを追加する
最後に
最後まで読んでいただきありがとうございます。【AWS】EC2とRDSでwordpressをセットアップする【SSH接続編】はいかがでしたでしょうか。次回は、EC2インスタンスにログインしApacheのセットアップをします。
MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。
Amazonの電子書籍読み放題サービス「Kindle Unlimited」でプライム会員を対象に、最初の3か月間を無料体験できるキャンペーンを実施中。マンガ、小説、ビジネス書、雑誌など500万冊から、好きな本を何冊でも読めるキャンペーンです。
初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。