【AWS】EC2にSSHで安全にアクセスする

9 min

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がオススメです。

国内最速しかも安い: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ではじめるインフラ構築入門 安全で堅牢な本番環境のつくり方」はオススメの書籍です。

全体像

  1. STEP

    【AWS】コンソール操作でEC2とRDSを準備する

  2. STEP

    【AWS】EC2にSSHで安全にアクセスする

  3. STEP

    【AWS】Apacheで最低限やっておくべきSSL/TLSの設定

  4. STEP

    【AWS】EC2とRDSでwordpressをセットアップする

  5. 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 NumberRFC Title
RFC 1421Privacy Enhancement for Internet Electronic Mail:
Part I: Message Encryption and Authentication Procedures
RFC 1422Privacy Enhancement for Internet Electronic Mail:
Part II: Certificate-Based Key Management
RFC 1423Privacy Enhancement for Internet Electronic Mail:
Part III: Algorithms, Modes, and Identifiers
RFC 1424Privacy Enhancement for Internet Electronic Mail:
Part IV: Key Certification and Related Services
表:RFC:Privacy Enhancement for Internet Electro

ざっくりまとめると、pemは電子メールシステムにメッセージの暗号化と本人認証の機能を取り込むための仕様で、暗号化により内容を秘匿し、ディジタル署名により改ざんやなりすましを検知する。ということです。

SSHの公開鍵、秘密鍵とは?

下記の2つのサイトがわかりやすくとても参考になりました。

電子署名の応用で、秘密鍵の所有者しか正しい署名が作れないことを利用し、署名の正しさを公開鍵で検証してもらうことで、確かに所有者であることを確認してもらいます。これが本人確認になっているということです。

このような使い方ですから、秘密鍵は利用者本人以外に漏らしてはいけませんし、公開鍵は予めサーバに登録しておく必要があります。

単純に言うと、ユーザが自身の秘密鍵を使って署名を生成し、その署名をサーバ側が公開鍵を使って検証できれば、その署名は確かに正当なユーザが作成したものだからと判断し、認証成功ということです。もちろん、ユーザと公開鍵との対応が適切かどうかも照合を行います。

ただし注意が必要なのは、認証の前の鍵交換、中でもその手続きによって共有されるセッションIDが絡んでくることです。

https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432

SSHを超ざっくりまとめると、「認証」に公開鍵認証を用い、データの通信を「暗号化」して安全に通信する通信プロトコル。ということでしょうか。

SSHの詳細については別の記事で詳しく書きたいと思います。

EC2インスタンスへSSH接続

EC2のダッシュボードからセキュリティーグループのインバウンドルールでSSHプロトコル(TCP22番)を特定のIPアドレスから許可しておきます。特定のIPアドレスとは自宅の固定IPアドレスなどです。

説明が長くなりましたが、EC2インスタンスへSSH接続します。まずは秘密鍵([インスタンス名].pem)のパーミションを400にして自分以外読み取り不可にします。ここでは秘密鍵の名前はsecret.pemとします。


chmod 400 secret.pem

続いてSSHでEC2インスタンスに接続します。接続するコマンドは下のようになります。


ssh -i "secret.pem" ec2-user@IP-address

SSHコマンドのオプションですが-iで秘密鍵を指定して、ユーザー名@サーバで接続先を指定します。サーバには現時点でドメインを取得していないのでElastic IPで関連づけたIPアドレスを指定します。

ユーザー名@サーバのサーバですが、Elastic IPを割り当てていない場合はEC2の管理画面で「パブリック IPv4 アドレス」や「パブリック IPv4 DNS」のどちらかを指定してもOKです。インスタンスを再起動すると「パブリック IPv4 アドレス」は変わるので「パブリック IPv4 DNS」がオススメです。

無事にログインすると以下のメッセージが表示されます。


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

ちなみにこのログイン後のメッセージは/etc/motdの内容で好きなように変更できます。

暗号技術の基礎をわかりやすく解説

暗号技術入門 第3版 秘密の国のアリス

2008年の刊行以来、セキュリティ関連部門で長期間トップをキープしている『新版暗号技術入門』の改訂版です。「対称暗号」「公開鍵暗号」「デジタル署名」「PKI」「PGP」「SSL/TLS」など、暗号技術の基礎を、たくさんの図とやさしい文章で解説しています。今回の【第3版】では、これまでの基本的な暗号技術の解説に加えて、大幅な加筆修正を行っています。

●対象読者
 本書は、主に以下の読者を対象にしています。
 ・暗号全般に興味がある人
 ・公開鍵暗号やデジタル署名など、暗号技術の仕組みを理解したいと思っている人
 ・セキュリティに興味がある人
 また、情報セキュリティスペシャリスト試験の対策にも最適です。

Amazon

EC2インスタンスのタイムゾーンとロケール設定

何はともあれアップデート

ログイン後にまずは何はともあれをアップデートします。


sudo yum update

Debian系のUbuntuではapt updateapt upgradeの2つのコマンドが必要ですが、Redhat系は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が公開鍵、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

秘密鍵の指定(-i .ssh/id_ed25519)はなくてもSSHできます。

自分がどのグループに属しているかを確認します。wheelグループに所属していることを確認します。


groups
namileri wheel

sudoコマンドが使えることを確認

まずは権限のないファイルをcatしてみます。(Permission deniedになる)


cat /var/log/secure
cat: /var/log/secure: Permission denied

sudoが使えることを確認します。


sudo cat /var/log/secure

sudoが使えない場合

そのユーザーがwheelグループに所属しているけれどsudoコマンドが使えない場合は、sudo visudoコマンドで%wheel  ALL=(ALL)  ALLの行のコメントが外れていない場合はコメントを外してください。


sudo visudo
%wheel  ALL=(ALL)       ALL
# 上の行のコメントを外す wheelグループはすべてのコマンドでsudoできるようにします

ec2-userのSSHを禁止する

追加したユーザーでSSHでログインができ、またsudoコマンドが使えることを確認できたら、セキュリティの観点でec2-userのSSH接続を禁止した方が良いです。

ただし追加したユーザーで何らかの不備がありSSH接続できない場合やsudoコマンドが使えなくなると一巻の終わりなので、ec2-userのSSH禁止は慎重にやりましょう

/etc/ssh/sshd_configDenyUsers 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

  1. STEP

    IAM コンソールにアクセス

    AWS Management Console にサインインし、IAM コンソールにアクセスします。

    IAMコンソール:https://console.aws.amazon.com/iam/

  2. STEP

    セキュリティ認証情報をクリック

    右上のナビゲーションバーでユーザー名を選択し、セキュリティ認証情報をクリックします。

  3. STEP

    MFAが有効か無効かを確認

    MFAが有効でない場合は下の画像のようにアラートが出ています。

  4. STEP

    MFAを割り当てる

    では実際にMFAを割り当て設定します。

  5. STEP

    MFAデバイスを選択

    今回は1Password8でワンタイムパスワードを管理するので「Authenticator app」を選択します。デバイス名にはわかりやすい名前をつけます。(なんでも構いません)

  6. STEP

    デバイスの設定

    QRコードを表示して、1Password8でスキャンします。

    1Password8では、ワンタイムパスワードの項目を追加して下の画像のようにスキャンします。

  7. STEP

    MFAコードを2つ入力しMFAを追加する

    1Password8の追加したワンタイムパスワードの項目に表示された6桁のコードを入力し、最大30秒後に新しいコードが生成されるのでそれを入力します。

    これでMFAを追加することができました。

最後に

最後まで読んでいただきありがとうございます。【AWS】EC2とRDSでwordpressをセットアップする【SSH接続編】はいかがでしたでしょうか。次回は、EC2インスタンスにログインしApacheのセットアップをします。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

定番おすすめ記事

EC2とRDSでwordpressをセットアップするシリーズです。

カテゴリー:
関連記事