1、アカウントを作成する
↓
2、IAMで「管理者ユーザー」作成
(目的)
・ルートアカウントは請求やサービス解除など危険操作も全部できるため、常用せず保管用にする
・普段の運用はIAMユーザーで行い、必要に応じて権限を付与
(方法)
・コンソール上部検索バーで「IAM」と入力して IAM サービスを開く
1.左メニューから 「ユーザー」 → 「ユーザーを追加」
2.「ユーザー名」:〇〇〇 ※メールアドレスでなく任意文字列
3.「AWS マネジメントコンソールへのアクセスを許可」 にチェック
4.「Identity Center でユーザーを指定する 」にチェック
5.「次へ」押下
6.「IAM Identity Center」を有効にする
【「IAM Identity Center」の設定】
1.Identity Centerの左メニュー「許可セット」から 「許可セットを作成」
2.テンプレートから 「AdministratorAccess」 を選択
・これはIAMのAdministratorAccessポリシーと同等
3.名前を AdminAccess として作成
4.左メニュー「ユーザー」→「ユーザーを追加」
5.情報を入力
6.作成完了
7.パスワードの設定
8.MFAの設定
【CloudTrail 有効化(操作履歴記録)】
CloudTrailは、AWSアカウントで行われたAPIコール(ほぼ全操作)を記録します。
証拠保全・不正操作検知・原因調査に必須です。
(手順)
1.コンソール上部検索バーに「CloudTrail」と入力 → 開く
2.左メニュー「証跡」をクリック
3.「証跡の作成」をクリック
証跡名:〇〇〇(任意)
「組織内のすべてのアカウントについて有効化」のチェックは、「AWS Organizations 」を使用している場合。
「新しいS3バケットを作成」にチェック(自動でCloudTrail用バケットが作られる)
「ログファイルの SSE-KMS 暗号化」は特別なセキュリティ要件がなければ空欄でOK。
※将来監査対応やマルチアカウントの集中管理をするときに追加すれば良い。
「証跡作成」ボタンを押す
[ログイベントの選択]※費用がかかるので、状況によって変更する
例)
・管理イベント 読み取り+書き込み 有効化 リソース操作の全履歴が取れる、無料枠内で済むことが多い
・データイベント 無効 コスト対策(S3運用開始後に検討)
・インサイトイベント 無効 小規模では不要、将来監視強化時に有効化
【Budgetsで課金アラート設定】
予算設定をしておくと、使用料金や使用量が一定額を超えたらメール通知されます。
AWSは使いすぎによる高額請求の事例が多いので必須です。
1.上部検索バーで「Budgets」と入力 → 開く
2.「予算の作成」をクリック
3.「コスト予算」を選択 → 「次へ」
4.名前:monthly-cost-limit
5.期間の種類:毎月
6.金額:例)3000(円)
7.「次へ」
【有効なリージョンのみ設定】※まだ設定できなかった。
・攻撃者が勝手に別リージョンで仮想マシンやS3を作成してもブロックできる
・無効化したリージョンはコンソールからも選べなくなる(必要時は再有効化可能)
1.AWSマネジメントコンソール右上のアカウント名をクリック
「アカウント」 を選択
(または検索バーで「account settings」と検索)
2. 「有効なリージョン」設定に移動
【EC2設定】
事前準備(1回だけやればOK)
1.EBSデフォルト暗号化ON
これはEC2を作る前にONにしておくべきです。
ONにしてから作ったEC2のディスクは自動暗号化されますが、後からONにしても既存ディスクには反映されません。
(後で暗号化したい場合は、スナップショットを作って暗号化して再作成する必要あり)
・EC2コンソール → 左メニュー「設定」 → 「EBS 暗号化既定」
・「有効化」にチェック → 保存(KMSキーは aws/ebs のままでOK)
→ これで新規EC2のディスクは自動暗号化されます
2.EC2用IAMロール作成(SSM用)
設定しないと、
SSMコンソールの一覧に**“非管理”**として出る/そもそも出ない
セッション開始で失敗(チャネルを開けない)
Run Command/パッチ適用が未対応のまま
など不都合がでる。
IAMコンソール → 「ロール作成」
信頼されたエンティティ → AWSサービス
ユースケース → EC2
ポリシー選択で AmazonSSMManagedInstanceCore を付与
名前例:EC2-SSM-Role
3.GuardDuty有効化
AWSの不審な操作やマルウェア通信を検知
「セキュリティサービス → GuardDuty → 有効化」だけでOK
無料トライアル30日あり、小規模だと月数百円レベル
GuardDutyコンソール → 「有効化」
東京リージョンで開始(他リージョンも必要なら追加)
【EC2作成(セキュリティ考慮)】
1.EC2コンソール → 「インスタンスを起動」
2.AMI選択
「Rocky Linux 9 (Official) - x86_64」を選択
無料枠なら、
「Rocky Linux 9 (Rocky 9) with support by ProComputers」を選択
インスタンス起動時に購読
3.インスタンスタイプ
t3.small 以上推奨(t2.microは遅い)
| インスタンスタイプ | vCPU | メモリ | 時間単価 | 月額目安(24時間稼働) |
| --------- | ---- | --- | ------------------ | ------------ |
| t3.micro | 2 | 1GB | 約 \$0.0104(約1.6円) | 約1,200円 |
| t3.small | 2 | 2GB | 約 \$0.0208(約3.2円) | 約2,400円 |
| t3.medium | 2 | 4GB | 約 \$0.0416(約6.4円) | 約4,800円 |
| t3.large | 2 | 8GB | 約 \$0.0832(約12.8円) | 約9,600円 |
・無料枠対象は t2.micro または t3.micro のみ(アカウント作成から12か月間)
・t3.small 以上にすると 即時課金開始
・無料枠の750時間を超えると、超過分も課金
・t3.micro はメモリ1GBでWebサーバとしてはかなりギリギリ
→ WordPressやLAMPを動かすとSwap必須で遅い
・t3.small(2GB)は最低限の余裕があり、Apache+PHP+MySQLも動作安定
・もしアクセス数が多いなら t3.medium 以上が無難
[まとめ]
無料枠重視 → t3.micro(ただし性能は低い)
実用性重視 → t3.small(有料だが安定)
高負荷対応 → t3.medium〜(料金は倍以上)
4.キーペア:
新規作成(ED25519推奨)→ ダウンロードして安全保管
※SSMだけで運用するなら後で22番閉じて鍵不要化も可能
※SSM(デメリットもあるよ)
SSM Session Managerを使う方法
ブラウザ上のAWSコンソールやAWS CLIから、直接インスタンスのシェルに入れる
接続経路はAWS内部の安全なチャネル(ssmmessages・ec2messages API)
SSHポート不要
キーペア不要(秘密鍵を配布・管理する必要なし)
4.ネットワーク設定:
セキュリティグループ新規作成
・SSH(22/tcp):自分の固定IPのみ or 後で削除
・HTTP(80/tcp):0.0.0.0/0
・HTTPS(443/tcp):0.0.0.0/0
5.ストレージ設定
・Amazon LinuxやRocky Linux公式AMIの場合、デフォルトはだいたい 8GB〜20GB に設定されています。
(注意) EC2作成時に指定した容量は、後からEBSの設定で拡張できますが、縮小はできません。
[暗号化ON]
EBSはデフォルト暗号化をONにしておくのがおすすめです。
暗号化すると、保存データはKMS(AWS Key Management Service)で自動的に暗号化されます。
パフォーマンス低下はほぼなし。
セキュリティ的に必須に近い設定。
コンソール上で「暗号化」にチェックが入っていることを確認してください。
・gp3(最新・推奨)
汎用SSDの新世代タイプ。
料金が安い(gp2の約20%オフ)。
容量とは別にIOPSやスループットを個別に設定できる。
無料枠対象。
を選択でよい。
※無料枠は EBS 30GB(gp2/gp3問わず)まで が対象。
30GBを超えると、その分だけ課金。
6.高度な詳細
・IAM インスタンスプロフィール ※SSMを使用する場合
事前に作った EC2-SSM-Role を選択
・インスタンスの自動復旧
デフォルト
・シャットダウン動作
停止
・停止 - 休止動作
無効化
・終了保護
有効化
誤操作やスクリプトのミスでインスタンスを終了(Terminate)してしまうのを防ぐ機能
・停止保護
本番運用予定 → 有効化
テスト・開発環境 → 無効化(自由に停止できる方が便利)
・CloudWatch モニタリングの詳細
有効化
→CPU使用率、ネットワークトラフィック、ディスクI/Oなどのメトリクスを1分間隔で収集
より精密な監視・アラーム設定が可能
追加料金あり(EC2の詳細モニタリング料金)
無効化
→メトリクスは5分間隔で収集(標準監視)
料金は無料
簡易的な監視には十分
本番環境 → 有効化(負荷監視やオートスケーリング用)
検証・学習環境 → 無効化(コスト節約)
※詳細モニタリングは CloudWatchの有料メトリクス料金が発生します(インスタンス数×監視項目×期間)
無効化(標準5分間隔)は無料
・クレジット仕様
t2 / t3 系インスタンスタイプなどのバースト性能インスタンスで CPUクレジットをどのように使うかを指定する設定です。
「前提:CPUクレジットとは?」
t2/t3 系は、低負荷時にCPUクレジットを貯めて、高負荷時にそのクレジットを消費して一時的に高性能を発揮します。
例えば、普段は5%のCPUしか使わないけど、アクセス集中時は一時的に100%使いたい…といった用途に向いています。
[無制限(Unlimited)]
クレジットがなくなっても追加料金を払えば性能を維持
高負荷が長く続いても性能が落ちにくい
料金が予想外に増えるリスクあり(CPU時間の超過分が課金される)
[スタンダード(Standard)]
クレジットがなくなると、CPU性能が制限される
追加料金なし(無料枠内での利用にも安心)
高負荷が続くと極端に遅くなる可能性あり
基本、スタンダード(Standard)
予算心配なし→無制限
・プレイスメントグループ
冗長構成(複数AZ・複数インスタンス)や高可用性要件がある場合のみ検討
HPCや大規模分散処理をしない限り、クラスタやパーティション配置は不要
・EBS 最適化インスタンス
EC2インスタンスとEBS(Elastic Block Store)間のデータ転送を専用の帯域で行えるようにする設定です。
BS最適化を有効にすると、EC2のネットワーク帯域とEBSストレージのI/O帯域が分離されます。
これにより、ネットワークトラフィックが多くてもEBSへのアクセス速度が低下しにくくなる。
有効化 ※コストが発生する場合は、無効化検討
・購入オプション
基本、なし
[キャパシティブロック]
特定の期間(例:1日単位〜数週間)インスタンスのキャパシティを確保する予約方式
使う・使わないに関わらず、その期間分の料金が固定で発生
高需要時でもインスタンスを確保できるが、長期運用には割高
主に短期間のイベント・バーストトラフィック対応などで利用
[スポットインスタンス]
AWSの空きキャパシティを**大幅割引(最大90%引き)**で利用
ただし、AWS側の都合で2分前通知で停止される可能性がある
中断に強いバッチ処理や分散計算向け
Webサーバ(LAMP)には通常不向き
・キャパシティーの予約
指定なし
・テナンシー
[共有(Shared Tenancy/デフォルト)]
他のAWSユーザーのインスタンスと同じ物理サーバ上に配置される
最も安価
無料枠や通常用途はこちら
[専有(Dedicated Instance)]
物理サーバを占有(他顧客と共有しない)
セキュリティ要件や規制で必要な場合のみ
料金は高く、時間単位で専有ホスト料金が発生
[専有ホスト(Dedicated Host)]
特定の物理ホストを完全に割り当て
ライセンス管理(BYOL)や規制遵守用
最も高額
・RAMディスクID / カーネルID
空欄でOK
・Nitro Enclave
無効化
※EC2で機密情報の安全処理(例:暗号化された医療データや金融情報)を扱う計画があれば有効化を検討
・ライセンス設定
空欄でOK
・CPU オプション
デフォルトの CPU オプションを使用する
・アクセス可能なメタデータ
有効
・メタデータのバージョン
v2
・メタデータレスポンスのホップ制
1
・メタデータのタグを許可
基本は「無効化」
→ 特にタグ取得が不要なら閉じておく
必要になったときだけ有効化し、タグには機密情報を含めない
【サーバ設定】
ssh -i "●●●.pem" ●●●●●●● でログイン
[スワップ領域を作る(推奨)]
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
[SSHを鍵専用にする]
/etc/ssh/sshd_config.d/ は *“後から読み込む .conf が前の設定を上書き” されます。
今あるのが 50-cloud-init.conf / 50-redhat.conf なので、番号が大きい自前ファイルを作れば安全に上書きできます
(例:90-hardening.conf か 99-hardening.conf)。
vi /etc/ssh/sshd_config.d/99-hardening.conf
/////////////////////////////////////////
# 鍵認証のみ
PasswordAuthentication no
PubkeyAuthentication yes
# root直ログイン禁止
PermitRootLogin no
# 試行回数/猶予を厳しめに
MaxAuthTries 3
LoginGraceTime 20s
# 近代的アルゴリズムのみ(古いクライアントがある場合は調整)
KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com
/////////////////////////////////////////
構文エラーが無いか必ずチェック
sudo sshd -t && echo "sshd 設定OK"
反映(いきなり restart せず reload 推奨)
sudo systemctl reload sshd
1. システムアップデート
sudo dnf update -y
sudo reboot
2. PHPの導入(AppStream モジュール)※例)訳あって、7.4
sudo dnf install -y
https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset php -y
sudo dnf module enable php:remi-7.4 -y
sudo dnf install -y php php-cli php-mysqlnd php-pdo php-gd php-mbstring php-xml php-opcache php-intl php-json
php -v
3.MySQLの導入 ※例)8.0
sudo dnf remove -y mariadb*
sudo dnf install -y
https://repo.mysql.com/mysql80-community-release-el9.rpm
sudo dnf install -y mysql-community-server
sudo systemctl enable --now mysqld
sudo grep 'temporary password' /var/log/mysqld.log
で現状のrootパスワードを確認しておく
初回セットアップ:
sudo mysql_secure_installation
↓
(推奨設定)
rootパスワードの強化(英数字+記号)
匿名ユーザー削除
テストDB削除
リモートrootログイン無効化
4.Apache or Nginx の設定(例: Apache
sudo dnf install -y httpd
sudo systemctl enable --now httpd
5.ファイアウォール設定
sudo dnf install firewalld -y
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
[セキュリティアップ]
(IP制限をする場合)
6.Fail2Ban (詳細はまた今度)
sudo dnf install -y fail2ban
sudo systemctl enable --now fail2ban
・SSHブルートフォース対策
・/etc/fail2ban/jail.local を編集して sshd の BAN 設定
(IP制限ができない場合)
・デフォルトユーザ名を変更
# 新規ユーザー作成
sudo adduser myadmin
sudo usermod -aG wheel myadmin
# 鍵コピー
sudo rsync -avz /home/rocky/.ssh /home/myadmin/
sudo chown -R myadmin:myadmin /home/myadmin/.ssh
#sudoのパスワード設定
sudo passwd myadmin
# SSHで新ユーザーに切り替えテスト
ssh -i mykey.pem myadmin@xx.xx.xx.xx
# 問題なければrockyを無効化
sudo usermod -L rocky
sudo vi /etc/ssh/sshd_config.d/99-disable-rocky.conf
# rocky ユーザーのSSHログインを拒否
/////////////////////////////////////////
Match User rocky
PermitTTY no
ForceCommand /bin/false
/////////////////////////////////////////
#構文チェック(超重要:エラーが出ないことを確認)
sudo sshd -t && echo "sshd 設定OK"
#反映(今のセッションは開いたまま)
sudo systemctl reload sshd
・port変更
sudo vi /etc/ssh/sshd_config.d/99-port.conf
/////////////////////////////////////////
Port 22022
/////////////////////////////////////////
SELinuxのポート許可(SELinuxが有効な場合)
sudo semanage port -a -t ssh_port_t -p tcp 22022
※ もし「semanage: command not found」と出たら
sudo dnf install policycoreutils-python-utils -y
sudo systemctl restart sshd
firewalld変更
sudo firewall-cmd --permanent --add-port=22022/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all