Skip to content

セキュアなネットワークの構築

セキュアなネットワークを構築し、その上に Growi を構築する。


Growi とは

Markdown でドキュメントを書くことができる Wiki ツールです。


この課題で作成するシステムの構成


環境の初期化

CloudFormation を使用して環境を初期化する。

初期化後の環境は以下のようになる。

CloudShell を起動する

以下のコマンドを実行して、CloudFormation のテンプレートファイル(template.yaml) を CloudShell 上にダウンロードする

curl -sL https://raw.githubusercontent.com/cupperservice/aws-hands-on/main/docs/hands-on/04.%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%A7%8B%E7%AF%89/cfn/template.yaml -o template.yaml

以下のコマンドを実行して環境を初期化する

aws cloudformation create-stack \
--stack-name initialize \
--template-body file://template.yaml

環境を構築する

EC2 インスタンスを用意する

以下の 3つの EC2 インスタンスを用意する

  • Web サーバ
  • Application サーバ
  • MongoDB サーバ

Web サーバを用意する

Web サーバ用のセキュリティグループを作成する

以下の項目を入力する

Item Value
Security group name web security group
Description for web server
VPC MyVPC

Inbound Roles に以下の2つのルールを追加

Type Port Source
SSH 22 bastion security group
HTTP 80 AnywhereIPv4

EC2 インスタンスを作成する

以下の項目を入力する

Item Value
Name web
AMI Amazon Linux 2023
Instance type t2.micro
Key pair vockey

Network Settings で [Edit] を押して以下を設定する

Item Value
VPC MyVPC
Subnet Public-subnet1
Auto-assign public IP Enable
Firewall (security groups) web security group

Application サーバを用意する

Application サーバ用のセキュリティグループを作成する

以下の項目を入力する

Name Value
Security group name application security group
Description for application server
VPC MyVPC

Inbound Roles に以下の2つのルールを追加

Type Port Source
SSH 22 bastion security group
Custom TCP 3000 web security group

EC2 インスタンスを作成する

以下の項目を入力する

Item Value
Name application
AMI Ubuntu
Instance type t2.large
Key pair vockey
Storage 20 GiB

Network Settings で [Edit] を押して以下を設定する

Item Value
VPC MyVPC
Subnet Private-subnet1
Auto-assign public IP Disable
Firewall (security groups) application security group

MongoDB サーバを用意する

MongoDB サーバ用のセキュリティグループを作成する

以下の項目を入力する

Item Value
Security group name mongodb security group
Description for mongodb server
VPC MyVPC

Inbound Roles に以下の2つのルールを追加

Type Port Source
SSH 22 bastion security group
Custom TCP 27017 application security group

EC2 インスタンスを作成する

以下の項目を入力する

Item Value
Name mongodb
AMI Amazon Linux 2
Instance type t2.micro
Key pair vockey

Network Settings で [Edit] を押して以下を設定する

Item Value
VPC MyVPC
Subnet Private-subnet1
Auto-assign public IP Disable
Firewall (security groups) mongodb security group

MongoDB サーバを構築する

CloudShell から mongodb サーバの EC2 インスタンスに SSH で接続する

MongoDB をインストールする

以下のコマンドを実行して、mongodb-org-6.0.repo を mongodb サーバ上の /etc/yum.repos.d/mongodb-org-6.0.repo に保管する

sudo curl -sL https://raw.githubusercontent.com/cupperservice/aws-hands-on/main/docs/hands-on/04.%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%A7%8B%E7%AF%89/conf/mongodb/mongodb-org-6.0.repo -o /etc/yum.repos.d/mongodb-org-6.0.repo

MongoDB をインストールする

sudo yum install -y mongodb-org

インストール結果を確認する

mongod --version

以下のように表示されればOK

mongod --version
db version v6.0.7
Build Info: {
  "version": "6.0.7",
  "gitVersion": "202ad4fda2618c652e35f5981ef2f903d8dd1f1a",
  "openSSLVersion": "OpenSSL 1.0.2k-fips  26 Jan 2017",
  "modules": [],
  "allocator": "tcmalloc",
  "environment": {
    "distmod": "amazon2",
    "distarch": "x86_64",
    "target_arch": "x86_64"
  }
}

MongoDB を起動する

sudo systemctl start mongod

自動起動を有効にする

sudo systemctl enable mongod

MongoDB をリモートからアクセスできるようにする

MongoDB の設定ファイルを編集する
リモートから MongoDB にアクセスできるように設定ファイルを変更する

sudo vi /etc/mongod.conf

bindIp の値を mongodb の EC2 インスタンスの Private IP アドレスに変更する

変更前

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

変更後

# network interfaces
net:
  port: 27017
  bindIp: mongodb EC2 インスタンスの Private IP

MongoDB を再起動する

sudo systemctl restart mongod

以下のコマンドを実行して MongoDB に接続できることを確認する

mongosh --host mongodb EC2 インスタンスの Private IP アドレス

以下のように MongoDB shell が起動すればOK

mongosh --host 10.0.30.46
Current Mongosh Log ID: 64a532a9a3cb3b62677c402e
Connecting to:          mongodb://10.0.30.46:27017/?directConnection=trueappName=mongosh+1.10.1
Using MongoDB:          6.0.7
Using Mongosh:          1.10.1
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
------
  The server generated these startup warnings when booting
  2023-07-05T09:04:13.226+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2023-07-05T09:04:13.226+00:00: vm.max_map_count is too low
------
test>

MongoDB shell を抜ける

quit

Application サーバを構築する

CloudShell から application サーバの EC2 インスタンスに SSH で接続する

必要なパッケージをインストールする

nodejs をインストールする
以下のコマンドを実行して nodejs 関連のパッケージをインストールする

  • リポジトリを設定
curl -fsSL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
  • nodejs をインストール
sudo apt-get install nodejs
  • yarn をインストール
sudo npm install -g yarn
  • インストール結果を確認

以下のように表示されればOK

node -v
v18.19.0
yarn -v
1.22.21

build-essentialをインストール

sudo apt install build-essential

turboをインストール

sudo yarn global add turbo

growi をセットアップする

  • インストール先ディレクトリを作成
sudo mkdir /opt
  • インストール先ディレクトリのオーナーを変更
sudo chown ubuntu /opt
  • インストール先ディレクトリに移動
cd /opt
  • growi を github から取得
git clone https://github.com/weseek/growi.git
  • 使用する growi のバージョンを指定
cd growi
git checkout -b v6.1.0 refs/tags/v6.1.0
  • 必要なパッケージをインストール
sudo yarn

growi の起動設定をセットアップ

以下のコマンドを実行して、growi の定義ファイルを application サーバ上の growi-start.sh に保管する

curl -sL https://raw.githubusercontent.com/cupperservice/aws-hands-on/main/docs/hands-on/04.%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%A7%8B%E7%AF%89/conf/growi/growi-start.sh -o growi-start.sh

growi-start.sh を編集
<mongodb> の部分を mongodb サーバの Private IP アドレスに変更する

  • 変更前
MONGO_URI="mongodb://<mongodb>:27017/growi" \
  • 変更後
MONGO_URI="mongodb://10.0.30.210:27017/growi" \

権限を変更する

sudo chmod +x /opt/growi/growi-start.sh

以下のコマンドを実行して、growi を起動するためのユニットファイルを application サーバ上の /etc/systemd/system/growi.service に保管する

sudo curl -sL https://raw.githubusercontent.com/cupperservice/aws-hands-on/main/docs/hands-on/04.%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%A7%8B%E7%AF%89/conf/growi/growi.service -o /etc/systemd/system/growi.service

定義を systemd に認識させる

sudo systemctl daemon-reload

growi を起動

sudo systemctl start growi

起動結果を確認

sudo journalctl -f -u growi

以下のように表示されればOK

Jul 08 00:03:51 ip-10-0-30-92 npm[2806]: > growi@4.5.8 start /opt/growi
Jul 08 00:03:51 ip-10-0-30-92 npm[2806]: > yarn app:server
Jul 08 00:03:51 ip-10-0-30-92 npm[3684]: yarn run v1.22.19
Jul 08 00:03:51 ip-10-0-30-92 npm[3684]: $ yarn lerna run server --scope@growi/app
Jul 08 00:03:51 ip-10-0-30-92 npm[3696]: $ /opt/growi/node_modules/.binlerna run server --scope @growi/app
Jul 08 00:03:52 ip-10-0-30-92 npm[3708]: lerna notice cli v4.0.0
Jul 08 00:03:52 ip-10-0-30-92 npm[3708]: lerna notice filter including"@growi/app"
Jul 08 00:03:52 ip-10-0-30-92 npm[3708]: lerna info filter [ '@growi/app' ]
Jul 08 00:03:52 ip-10-0-30-92 npm[3708]: lerna info Executing command in 1package: "yarn run server"

growi の自動起動を設定

sudo systemctl enable growi

Web サーバを構築する

Nginx をインストールする

web サーバに CloudShell から SSH で接続する

nginx をインストールする

sudo dnf install nginx -y

nginx を起動する

sudo systemctl start nginx

nginx の自動起動を有効にする

sudo systemctl enable nginx

Web ブラウザから web サーバの Public IP アドレスにアクセスして nginx が動作していることを確認する

以下のように表示されればOK

リバースプロキシの設定

以下のコマンドを実行して、リバースプロキシ用の定義ファイル を web サーバ上の /etc/nginx/conf.d/growi.conf に保管する

sudo curl -sL https://raw.githubusercontent.com/cupperservice/aws-hands-on/main/docs/hands-on/04.%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%A7%8B%E7%AF%89/conf/nginx/growi.conf -o /etc/nginx/conf.d/growi.conf

リバースプロキシの定義ファイルを編集
vi で編集する例
sudo vi /etc/nginx/conf.d/growi.conf

<application>の部分を Application サーバの Private IPv4 address に変更する

  • 編集前
upstream growi {
    server <application>:3000;
}
  • 編集後の例
upstream growi {
    server 10.0.10.200:3000;
}

server_nameを探して、<server> を Web サーバの Public IPv4 address に変更する

  • 編集前
server {
    listen 80;
    server_name <server>;
  • 編集後の例
server {
    listen 80;
    server_name 54.175.66.232;

以下のコマンドを実行して Nginx を再起動する

sudo systemctl restart nginx

Growi が動作することを確認

Web ブラウザから web サーバの Public IP アドレスにアクセスして以下のように表示されればOK