私の戦闘力は53万です

awsとgcpについて書きます

(初心者向け)AWS ClientVPNを設定してみる

リモートワークがどの会社でも進んでいますね・・・
割と問合せの多いClientVPNを調べてみましたのでブログにまとめてみようと思います。

ClientVPNの概要

clientVPNの概要は下記が分かりやすいと思います。
AWS Client VPN の詳細 - AWS Client VPN

f:id:remmemento:20200430022921p:plain
ClientVPNの概要

ポイントは下記です。
・End Userがインターネット経由でClientVPNエンドポイントへ接続
・ClientVPNエンドポイントからVPC内のサブネットへアクセス可能
 (サブネット内へENIを作成しNAT感覚で利用)
・Subnetと接続のあるリソースを利用可能
 (DirectConnect、VPCピアリング等)
・接続を制限するために認証機能がある
 認証方式は2つありますが、この記事では相互認証について扱います
 詳しくはこちらです。
クライアント認証と認可 - AWS Client VPN

相互認証の設定の流れ

相互認証での設定の流れはざっと下記です。
(1)認証局の構築
(2)証明書(ACM)の設定
(3)ClientVPNのAWS側設定
(4)ClientVPNクライアント設定(インストール)
(5)ClientVPNクライアント側設定
(6)VPN接続
(7)認証局の運用

検証の構成図

今回の検証では下記構成で設定してみました。
目的は、外部インターネットからClientVPNでアクセスし、
VPC内のEC2にローカルIPでアクセスすることです。

f:id:remmemento:20200502161719p:plain
試すこと

(1)認証局の構築と(2)証明書(ACM)の設定

EC2(AmazonLinux2)で認証局を構築します。
こちらの認証局のEC2は上記の構成図には登場しません。
別の場所で構築しても大丈夫です。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/authentication-authrization.html

cd ~
sudo yum install git -y
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1.domain.tld nopass


mkdir acm
cp pki/ca.crt acm/
cp pki/issued/server.crt acm/
cp pki/private/server.key acm/
cp pki/issued/client1.domain.tld.crt acm
cp pki/private/client1.domain.tld.key acm/
cd acm/
#ここでエラーが出る場合は、EC2へ適切なIAMRoleを付与しているかを確認してみてください。
aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt --region region

ドキュメント内では、クライアント証明書もアップロードしていますが、
クライアント証明書の認証機関 (発行者) がサーバー証明書の認証機関 (発行者) と異なる場合にのみ、
クライアント証明書を ACM にアップロードする必要があります。
そのため、ここではクライアント証明書はアップロードしません。

下記を実行時に、入力が促されますが、なんでも大丈夫です
./easyrsa build-ca nopass
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:clientVPN-test

(3)ClientVPNのAWS側設定

ClientVPNを設定します。
ここで、作業前に全体像を整理します。
下記図に示すように、Subnet内のリソースにアクセスさせるために
複数の箇所で設定が必要となります。
f:id:remmemento:20200502162619p:plain

(A)ClientVPN エンドポイント作成

まず、ClientVPNエンドポイントを作成します。
構成図で言う、下記の赤字部分です。
f:id:remmemento:20200502162853p:plain
AWSの画面で言うと、下記の設定です。
f:id:remmemento:20200430025820p:plain
スプリットトンネルは有効化しておきます。
f:id:remmemento:20200430024156p:plain

(B) ClinetVPNとSubnetを紐付け

続いて、ClinetVPNとSubnetを紐付け設定します。
図の下記赤字部分です。
f:id:remmemento:20200502163248p:plain

f:id:remmemento:20200430024217p:plain
f:id:remmemento:20200430024252p:plain

紐付けたいVPCとSubnetを入力します。

Subnetを紐付けると、ルートテーブルも自動的に作成されます。
このルートテーブルにより、clientVPNのエリアからSubnetへのルーティングが可能となります。

f:id:remmemento:20200430024311p:plain
続いて認証を設定します。
f:id:remmemento:20200430024322p:plain
今回はSubnetの通信に送信を許可したいので、
「172.30.5.0/24」を入力します。

f:id:remmemento:20200430024348p:plain

(C) セキュリティグループの設定

続いてセキュリティグループの設定をします。
図の下記赤字部分です。
f:id:remmemento:20200502163427p:plain


f:id:remmemento:20200430024359p:plain

また、接続先のEC2へ、このセキュリティグループ、または
IPアドレスからの接続が許可されている必要があります。


全て設定した後、利用可能状態になるまで待ちます。
私の環境では10分ぐらいかかりました。

(4)ClientVPNクライアント設定(インストール)

AWS側の設定の準備ができたので、次はクライアントの設定です。
AWSが提供するClientをインストールします
https://aws.amazon.com/jp/vpn/client-vpn-download/

(5)ClientVPNクライアント側設定

f:id:remmemento:20200430024438p:plain
続いて「クライアント設定のダウンロード」を押下します
「〜.ovpn」のファイルがダウンロードされますのでテキストエディタで開きます。
下記のようになっているかと思います。

client
dev tun
proto udp
remote xxxxxxxxxxxxxxxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</ca>

reneg-sec 0

ここに追記していきます。
追記内容は(1)で作成した下記ABの内容です
(A)client1.domain.tld.keyの下記で囲まれた部分
 -----BEGIN PRIVATE KEY-----
 -----END PRIVATE KEY——

(B)client1.domain.tld.crtの下記で囲まれた部分
 -----BEGIN CERTIFICATE——
 -----END CERTIFICATE——
追加後のイメージは下記です。

client
dev tun
proto udp
remote xxxxxxxxxxxxxxxxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</ca>

reneg-sec 0
<cert>
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----
</key>


Clinet VPNのアプリを開き、File > ManageProfilesを選択します。
下記はMacでの実行例です。

f:id:remmemento:20200430024559p:plain

f:id:remmemento:20200430024615p:plain


Add Profileから上記で作成したファイルを選択し、適当な名前をつけます

(6)VPN接続

Connectボタンを押下します
Connectedと表示されれば接続されています。

f:id:remmemento:20200430024650p:plain

これで、Subnet内のEC2にローカルIPで直接アクセスできます。

ssh  172.30.5.120
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 5 available
Run "sudo yum update" to apply all updates.

(7)認証局の運用

こちらは繋がった後の運用作業です。
相互認証では、クライアント側も機密データ(証明書)を保持します。
そのためクライアント側で問題が発生した場合には、その対応をする必要があります。
(例えば社員がパソコンを無くしてしまった時、その端末は接続不可となるよう設定すべき、など)
その場合、下記に従い、証明書失効リストを作成し
クライアントVPNエンドポイントにインストールすることで
クライアント証明書を無効化させ、接続を不可とします。
上記の例で言うと、パソコンを無くした社員に配布していたクライアント証明書を無効化させる流れです。
下記にサンプルがあるので実際に試してみます。
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-working-certificates.html


(1)を実施したEC2上でコマンドを実行します。

./easyrsa revoke  client1.domain.tld
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017

Please confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = client1.domain.tld


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes
Using configuration from /home/ec2-user/easy-rsa/easyrsa3/pki/xxxxxxxxxxxxx
Revoking Certificate xxxxxxxxxxxxxxxxxxx.
Data Base Updated

IMPORTANT!!!

Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.

CRLファイルを作成

./easyrsa gen-crl
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Using configuration from /home/ec2-user/easy-rsa/easyrsa3/pki/xxxxxxxxxxx
An updated CRL has been created.
CRL file: /home/ec2-user/easy-rsa/easyrsa3/pki/crl.pem

CRLファイルをインポート

aws ec2 import-client-vpn-client-certificate-revocation-list --client-vpn-endpoint-id xxxxxxxxxx --region ap-northeast-1 --certificate-revocation-list file:///xxxxxxxxxxx/crl.pem
{
    "Return": true
}

こちらを実行すると、クライアント証明書が無効化され、接続が不可となります。

まとめ

以上が大まかに利用の流れになります。
認証局の運用を自分でやらなくてはならないのが面倒ですが、
VPN自体の接続にはサーバを利用しないため、
自前でVPNサーバを構築するのと比較して可用性や性能の面でメリットがありそうです。
AWSACMにはプライベートCAの機能もあるので、
こちらを利用すれば(高いですが)サーバを利用しなくても良いようです。

AWS WAFv2とWAF classicの違いを簡単にまとめ

AWS WAF がいつの間にかWAF Classicという名前になっている・・・・
そして今のWAFはWAFv2と呼ぶらしいです。
何が違うのか分からなかったので触ってみました。

主な変化点

WCU

WAF v2にはWCUという概念が導入されています。
WCUは遠足のおやつのような概念です。
遠足のおやつは300円までと決まっており、好きなお菓子の組み合わせを値段を見ながら300円に収まるように選びます。

WAFでも、似たようにWebACL1つにつき、1500WCUまでというスコア上限が決まっており、
好きなルールの組み合わせをWCUのスコアを見ながら全体で1500WCUに収まるように選びます。
例:wordpress用のルールグループ:100WCU
  AWSの選ぶIPブラックリストルール:25WCU
この1500という値は上限緩和申請により、上乗せが可能ですが、
あまりたくさんのルールは追加できないと思っておいた方が良いです。
基本的には複雑なルールほどWCUが高いです
docs.aws.amazon.com

また自作ルールもWCUが適応されます。目安は下記です。
docs.aws.amazon.com

マネージドルール

マネージドルールという概念が追加されました。
こちらはルールをある程度良かろうという物がまとめられた物です。
以前からも、そのような機能はありましたが、下記が大きく異なります。

AWS提供のマネージドルール

AWS提供のマネージドルールが存在します。
これまではサードパーティ製の物が主でしたが
AWSが提供してくれるマネージドルールが存在します(しかも無料!)

docs.aws.amazon.com

マネージドルール中の、ルール別の設定が可能

以前は、ルールの集合を適応するときは、
まとめて適応するかどうかだったのですが、
WAFv2からは、マネージドルールの中の、さらにどのルールを適応・除外するかを選択できます。

f:id:remmemento:20200424025526p:plain
ManagedRule

より柔軟なルールの記載が可能に

ネストされたルールにより、より柔軟なルールの記載が可能になりました。
ちなみにこちらはAWSコンソールからでは設定が不可のようです。
docs.aws.amazon.com



他にも細かな違いはありますが、主な変化点は上記かと思いました。
また触ってみたらブログ書きたいと思います。

AWS Database Specialityに合格できました

AWS Database Specialityに合格できました。

合格エントリ

下記の合格エントリを参考にさせて頂きました。
自分はベータ版でなく、普通の試験を受けました。
blog.serverworks.co.jp
medium.com

勉強したこと

RDS・Auroraのドキュメントをひたすら読み込みました。
AuroraはBlackbeltも参考にさせて頂きました。
aws.amazon.com
aws.amazon.com
特にホワイトペーパーとかは読まず、
各DBで、トラブルシューティングのページがあるので
試験ガイドの「監視およびトラブルシューティング」の対策として
こちらは特に読み込んで行きました。

結果・感想

結果は800点ぐらいでした。
やはり新しい試験というのは面白いです。
問題が古い試験だとベストプラクティスから外れているものもあり
あまり勉強のしがいがありませんが、
新しい試験だと自分の実力を試されている気がします。
そして、Auroraのアップデートの多さに驚きました。普段いかに自分が使いなせていないかを痛感しました。
Auroraを好きになる試験だと思います。

AWS Certified Machine Learning – Specialtyに合格できました

先日、AWS Certified Machine Learning – Specialtyに合格できました。

勉強方法

まずは模試試験を受け、自分のレベルと、何を学ばないと行けないかを把握しました。
aws.amazon.com

その後、勉強方法について調べました。
こちらがよくまとまっていました。
qiita.com

ただこちら情報量が多く、結局何を勉強するか悩んだのですが、
私の場合、基礎をしっかり学びたい想いがあったので、
模試の結果から併せて考え、下記を中心に勉強しました。

こちらを1冊読みきりました。
www.amazon.co.jp

こちらは前半の半分程度を読みました。
www.amazon.co.jp

こちらは前半の2割程度を読みました。
www.amazon.co.jp

ある程度バランス取りながら上記のオライリーの本を読んでいたところ
試験日も近くなったので、仕上げでSagemakerのドキュメントを読み
本試験を受けてみたら合格できました。

結果は750点が合格ラインで、800点程度でした。

あと私は試験終わってから知ったのですが、
アルゴリズムの概要を知るのに、下記のyoutubeチャンネルが結構分かりやすかったです。
本を読んでみても分からんという場合、見てみると良いと思います。
www.youtube.com

【EFS Single File Restore】AWS backupとEFSの連携でファイル単位のリストアを試してみる

AWS BackupでEFSとの連携が便利になり、
EFSでのファイル単位のリストアができるようになりました。
機能を使ってみる機会がありましたのでメモ的に書いてみます。
aws.amazon.com

ユースケースとしては、ユーザやシステムが誤ってファイルを消してしまった場合のリカバリが考えられます。
ドキュメントの細かい箇所を読み込んで行くと、
おおよそ下記のメリット/デメリットがあることが分かりました。

メリット

  • AWS Backupは増分バックアップなので容量を無駄に取りすぎない
  • EFSの安価ストレージクラス(IAとか)関係なく利用可能

デメリット

  • 復元に時間(数分程度)がかかる
  • 復元の容量に応じて料金が発生する

検証準備

まずは検証の準備です。
EC2にEFSをマウントし、EFS内に適当なファイルを2つ作成します。

ls -lh /mnt/efs/test/bkup/
合計 8.0K
-rw-rw-r-- 1 ec2-user ec2-user 2  1月 28 03:10 1.txt
-rw-rw-r-- 1 ec2-user ec2-user 2  1月 28 03:10 2.txt

AWS Backupで、オンデマンドバックアップ(EFS)を取得します

f:id:remmemento:20200204000308p:plain
AWS Backup

その後、EFS内のファイルを一つ消してみます

rm /mnt/efs/test/bkup/1.txt 
ls -lh /mnt/efs/test/bkup/
合計 4.0K
-rw-rw-r-- 1 ec2-user ec2-user 2  1月 28 03:10 2.txt

リストア実施

上記で消してしまったファイルをリストアします。
AWS Backupの画面から、ファイルリストアを実行します。

f:id:remmemento:20200204000923p:plain
パス指定
ここで注意なのが、パスの指定方法です。
パスはマウントポイントからのパスを記入します。
上記の例は、下記の場合の例です。
マウントポイント「/mnt/efs」
ファイルフルパス「/mnt/efs/test/bkup/1.txt」
指定するパス「/test/bkup/1.txt」
f:id:remmemento:20200203235413p:plain
リストアが実行されると復元がジョブとなり、コンソールで確認できます。
ジョブが完了すると、マウントポイント直下に
「マウントポイント/aws-backup-restore_*」の形式で
ファイルがリストアされています。

ls -ld /mnt/efs/aws-backup-restore_*
drwxr-xr-x 3 ec2-user ec2-user 6144  1月 28 03:09 /mnt/efs/aws-backup-restore_2020-01-29T09-05-15-134Z
drwxr-xr-x 4 ec2-user ec2-user 6144  1月 28 03:09 /mnt/efs/aws-backup-restore_2020-01-29T09-20-26-282Z


ちなみに、バックアップ中に指定したファイルが存在しない場合は、
空のフォルダが作成されていました(ただし復元ジョブは成功の扱い)

ls -lh /mnt/efs/aws-backup-restore_2020-01-29T09-05-15-134Z/
合計 36K
drw--w---- 2 root root 38K  1月 29 09:05 aws-backup-lost+found_2020-01-29T09-05-15-135Z


上記はファイル単位でのリストアでしたが、
フォルダ単位のリストアも可能なため、
誤操作によるファイル削除等のリカバリには有効な機能です。
AWS EFSを利用する際には利用を検討してみる価値ありです。

AWS SAMでError: PythonPipBuilder:None - Binary validation failed!

小ネタです。 SAMで「sam build」したところ下記のエラーが出てしまいました。

Build Failed
Error: PythonPipBuilder:None - Binary validation failed!

sam build --debugで詳細見ると、
ローカルのpython versionがpython3.7だけど
runtimeを3.8に指定していたことが原因のようでした。
runtimeを3.7にして実行すると正常に動作しました。

ダニエルピンク モチベーション3.0を読んだ

面白かったでまとめてみたいと思います。
ネタバレありです。

簡単にさわりを知りたい方は下記を見ると良いと思います。
本書の最初の部分が、下記でプレゼンされています。
www.ted.com

短めにまとめ

既存のモチベーション維持方法は古く、
科学的に正しいと立証されている方法と、
(本書ではモチベーショ3.0と呼ぶ。自律性、熟達、目的にフォーカスした方法)
現在の企業や学校で行われている方法
(本書ではモチベーション2.0と呼ぶ。いわゆるアメとムチ。)
には乖離がある。
本書ではモチベーショ3.0の解説と、
実際の適用例、実験結果、2.0から3.0へ移す方法例をあげています。
あと、レアケースでアメとムチがうまくいくケースについても触れています。

モチベーション3.0とは

下記を中心に人間のモチベーションが下がる/上がるをコントロールすること。

(1)自律性
自己決定できること。課題、時間、手法について自分たちで考え行動できること。
上司から非効率なやり方を強制されるとモチベーションが下がり、
好きにやって良いよと言われると楽しんでやれるといった具合のことです。

(2)熟達
より上を求めて向上すること。
難しすぎず、易しすぎない業務に取り組み
自分のレベルをアップさせていくことを表します。

(3)目的
なぜやるのかを明示すること。利益以外の社会的な目標。

人間のモチベーションがアメとムチ(報酬と罰)だけとすると、
世の中には説明できないことがあります。
例えばボランティア、wikipediaの発達、オープンソースの発達・・・。
人には本来、自分で考えて行動したい、
より向上したい、人の役に立ちたい、、といった願望があり、
それらに任せて仕事ができる環境を作ると
よりモチベーションが高い状態で仕事ができるといった考え方です。

誰しもが上記に当てはまる訳ではないと思いますが、
確かに、良いエンジニアと話すときは、こういった姿勢が感じられます。
また、良いエンジニアが集まる会社は上記の雰囲気が感じられます。
今の世の中、上司に素直に言われたことだけをやる人は価値が低くて、
自律的に学習して向上する筋力が必要とされることを改めて感じました。
また、マネジメントでは、単に指示を出すことでなく、
こういった雰囲気やルールを作る能力が求められていきそうと感じました。
そう考えるとサーバントリーダシップと繋がってまた面白いです。