fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

AWSマネージドなNework Firewallがリリースされたのでプロキシサーバ替わりにしてみる

re:Invent直前、素敵な機能がリリースされたようです。

AWS Network Firewall

aws.amazon.com

Network Firewallとは

ネットワークレイヤーでVPC内のリソースを保護できるAWSマネージドなFirewallのようです。 と言ってもよくわからないので実際に作って挙動を見ていきます。

これまで、外部アクセスをフィルタリングする場合はオープンソースのプロキシサーバであるSquidなどを使用してEC2でプロキシサーバを構築していましたが、これを使用することでマネージドな形でURLフィルタリングができます。

今回の構成

f:id:fu3ak1:20201118152837p:plain

ドキュメントのルーティング例にある一番シンプルな構成で作ります。 私の場合はEC2を配置するサブネットを10.0.0.0/24で作成しています。 配置したEC2から、外部通信時にFWを通すようにします。

Simple single zone architecture with an internet gateway - Network Firewall

※東京リージョンにはまだないため、今回はバージニア北部リージョンで試しています。

Network Firewallの作成

VPCのメニューに新しい項目が・・

f:id:fu3ak1:20201118112416p:plain

ファイアウォールを作成していきます。

f:id:fu3ak1:20201118112447p:plain

このような概要説明も画面に表示されていました。

f:id:fu3ak1:20201118112542p:plain

任意の名前を設定し、パブリックサブネットを2つ選択します。(名前がelbとなっていますが通常のパブリックサブネットです)

f:id:fu3ak1:20201118112759p:plain

初回のため空のポリシーを作成し、ファイアウォールを作成します。

f:id:fu3ak1:20201118112837p:plain

作成できたので、実際のルールを適用するためにルールグループを作成します。 ルールグループはステートレスとステートフルの2種類がありますが、今回はステートフルで作成します。

f:id:fu3ak1:20201118122447p:plain

ルールグループは以下の3つから選べます。ここではドメインベースで外部アクセスの拒否を使います。 IPSベースのルールも選べるようで、今後活用できそうですね。

キャパシティは1にするとエラーになるため、10としておきます。作成後にこの値は変更不可のようなので注意です。

f:id:fu3ak1:20201118153729p:plain

アクセス拒否したいドメインを記載し、アクションでDenyにします。 今回はサンプルとして「www.yahoo.co.jp」にしました。

f:id:fu3ak1:20201118153437p:plain

作成を押すとルールグループが追加されます。

f:id:fu3ak1:20201118153834p:plain

ファイアウォールの設定はここまでです。

Route Tableの設定

VPCの通信をファイヤーウォール経由とするため、Route Tableの設定を変更していきます。

具体的には以下赤丸のとおり3か所のルートテーブルを設定しますが、私はInternet GatewayにRoute Tableを設定するという概念が今まで頭になかったのでそこに悩んでしまいました。。

f:id:fu3ak1:20201118154229p:plain

実際に設定していきます。

① Internet Gatewayの Route Table

通常とは異なるルートテーブルを設定するため、新たにルートテーブルを作成します。

f:id:fu3ak1:20201118154652p:plain

作成したルートテーブルを選択し、アクションからEdit edge associationsを選択します。(Internet Gatewayと関連付けるため。私はここで初めてやりました)

f:id:fu3ak1:20201118154852p:plain

Internet Gatewayに関連付けしてSaveします。

f:id:fu3ak1:20201118155825p:plain

関連付けしたルートテーブルを編集し、以下のとおりターゲットをFirewallのエンドポイントに設定します。

※ここもわかりにくいのですが、選択肢にはFirewallという文字はなく、Gateway Load Balancer Endpointから選択します。おそらく裏ではこれが稼働しているためです。エンドポイントの情報は、ファイアウォール画面>ファイアウォールの詳細タブ>ファイアウォールエンドポイント から確認できます。

※エンドポイントはサブネット単位のため、マルチAZの場合は複数のルートが必要です。

f:id:fu3ak1:20201118155414p:plain

これで一つ目のルートテーブル設定は完了です。

Firewall Subnetの Route Table

Firewallを配置したサブネットのルートテーブルです。ここは通常のパブリックサブネット同様、以下のように設定すればOKです。 VPC向けのlocalと、0.0.0.0向けのIGWです。

f:id:fu3ak1:20201118160107p:plain

③ EC2 Subnetの Route Table

最後にEC2を配置するサブネットのルートテーブルです。vpce-**となっているのは、ファイアウォールエンドポイントです。 デフォルトゲートウェイ(0.0.0.0)として、ファイアウォールにルーティングさせます。

f:id:fu3ak1:20201118160311p:plain

以上で3つのルートテーブルの設定は完了です。Internet GatewayのルートテーブルとEC2のルートテーブルそれぞれでFWにルーティングさせて、FWサブネットを経由させる形ですね。

EC2から外部疎通確認

ファイアウォールの準備ができたので、サブネットにEC2を構築して外部疎通してみます。 (EC2構築手順は割愛します。)

まずは拒否されていない「www.google.co.jp」にcurlでアクセスしてみます。

[root@ip-10-0-0-58 ~]# curl -I https://www.google.co.jp/
HTTP/2 200
content-type: text/html; charset=Shift_JIS
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Wed, 18 Nov 2020 06:08:16 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Wed, 18 Nov 2020 06:08:16 GMT
cache-control: private
set-cookie: 1P_JAR=2020-11-18-06; expires=Fri, 18-Dec-2020 06:08:16 GMT; path=/; domain=.google.co.jp; Secure
set-cookie: NID=204=TrfasTpATfsY4c6PAqxv9izTeDMO-A9qoTOW86D4FrM0F_ChpBcER3tsdYfu7ARzYogEkEYo2MUYw60BbscDozNSizUyjtx4u2bSk6MJ_hefdf9RD_lggp_RLQrUoMUI7eZq-MgRVf7r_OozmjvJLinf7vnehJdBu1ImwwUToiU; expires=Thu, 20-May-2021 06:08:16 GMT; path=/; domain=.google.co.jp; HttpOnly
alt-svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

エラーなくステータス200で返ってきますね。

次に拒否している「www.yahoo.co.jp」。

[root@ip-10-0-0-58 ~]# curl -I https://www.yahoo.co.jp
curl: (28) Operation timed out after 300992 milliseconds with 0 out of 0 bytes received

タイムアウトとなりました!ドメインで拒否できていることがわかりますね。

まとめ、感想

Route Tableで詰まってしまい、思ったより時間がかかりました。

まだ東京リージョンでは未対応のようなので、東京リージョンやCloud Formationが対応したらテンプレートで作成・管理できるようにしたいです。

また、外部からのアクセスも制御できるようなので、これまでSecurity Groupで対応できなかった特定IPやポートのDenyなどもできるかもしれません(試せていません)

まだまだ奥が深そうなサービスなので、また機会があれば触ってみたいと思います。

ChatOpsの第一歩、Slack(Chatbot)経由でLambda関数を実行する

ChatOps=チャットで運用を行う という解釈のもと、その第一弾として、私もよく利用するSlack経由でLambda関数の実行をしてみたいと思います。 AWSにはChatbotというSlackとAWSを連携する機能があるので、それを利用してまずは単純なLambda関数の実行を実装してみます。

元々は通知機能がメインのChatbotでしたが、最近ではLambdaやEC2の操作も行えるようになっています。

AWSのbuilders.flashにもChatOpsの記事がありましたので参考までに貼っておきます。 aws.amazon.com

Chatbotのセットアップ

Chatbotのページに行き、クライアントを設定します。

f:id:fu3ak1:20201110225034p:plain

ブラウザでSlackにログインしていない場合は以下のようにSign in のページが表示されるので、ログインします。

f:id:fu3ak1:20201110225253p:plain

ログインしている場合は最初から以下のように連携のページが表示されるので許可します。

f:id:fu3ak1:20201110225439p:plain

ワークスペースが追加されるので、Chatbotを使用したいSlackのチャネルを設定します。

f:id:fu3ak1:20201110225653p:plain

今回私はchatbot-lambdaというSlackチャネルでChatbotを利用していきます。

f:id:fu3ak1:20201110225753p:plain

IAMロールはテンプレートから作成し、Lambda実行予定のため「Lambda呼び出しコマンドのアクセス許可」を追加しておきます。

f:id:fu3ak1:20201110225856p:plain

チャネルが設定できました。

f:id:fu3ak1:20201110235124p:plain

Slack側で動作確認してみます。まずは下記をSlack上で実行し、@awsユーザーをinviteします。

/invite @aws

invite後、以下のようにhelpを実行するとChatbotの色々な使い方が表示されます。

@aws help

lambdaのinvoke(呼び出し)もありますね。

f:id:fu3ak1:20201110230313p:plain

ここまででChatbotおよびSlackの準備は完了です。

Lambda関数の作成

今回はChatbotの実行を試すのがメインなので、関数の内容はとてもシンプルなものにしました。

ランタイムはPython3.8です。IAMロールはデフォルトでOK。

f:id:fu3ak1:20201110230618p:plain

関数のコードは以下のとおり。メッセージをreturnするだけです。

def lambda_handler(event, context):
    return {
        'message': 'Hello from Chatbot!'
    }

Chatbot(Slack)経由でLambda実行

Lambda関数ができたのでSlackから実行してみます。以下の通りメッセージを打ち込みます。初回はリージョン名を入力する必要がありました。

@aws lambda invoke --function-name ChatbotFunction --region ap-northeast-1

実行するかどうか聞かれるのでYesをポチっと押します。

f:id:fu3ak1:20201110234100p:plain

実行されたようです。Lambda関数に書いた「Hello from Chatbot!」もSlack上に表示されています。

f:id:fu3ak1:20201110235542p:plain

ちなみに2回目以降はリージョン指定が不要なことに加え、--function-nameは省略できたので以下でも実行できました。

@aws lambda invoke ChatbotFunction

まとめ

Slackから気軽にLambda実行、良いですね。この他にもChatbotの機能は多くありそうなので、本格的にChatbotを使用した運用も検討できそうです。 Chatbotに強い権限を渡して何でもできてしまうとそれはそれでセキュリティ的な問題にもなりそうなので、どこまでやるかは要検討ですね。

もうちょっと実際の運用で使えそうなChatbotのネタが無いか考えてみます。

EventBridgeのアーカイブ&リプレイ機能を使用してイベントを再現してみる

EventBridgeの検証にとても役立ちそうな機能がリリースされていました。

aws.amazon.com

EventBridgeとは

f:id:fu3ak1:20201108162559p:plain
Amazon EventBridge

AWS内で発生したイベントやサードパーティ(Zendesk、Datadog、Pagerdutyなど)のイベントをトリガーにLambda関数やSNSを実行できる機能です。 同様の機能としてCloudWatch Eventsがありますが、EventBridgeはCloudWatch Eventsの上位互換的な機能となります。

よくある質問より

Q: Amazon EventBridge は CloudWatch Events とどのように関連していますか? Amazon EventBridge は、CloudWatch Events をベースに構築された、CloudWatch Events を拡張するサービスです。

今回のアップデートについて

一度発生したイベントソースを、アーカイブして再現できることができるようになりました。

例えばCloudTrailやS3へのオブジェクトUPなど、特定のイベントを契機にターゲットでLambdaを実行していた場合、Lambdaの動作テストを行うために、再度イベントそのもの(CloudTrail(=特定のAPI実行)やオブジェクト再UP)を実行しなければならない場合がありました。今回のアップデートで、そういったイベントの再現を行わずに、ターゲットの検証が実行できるようになりました。

特にセキュリティインシデントをイベントトリガーとしている場合は、中々そのイベントを再現するのは難しい場合もあるかと思います。

試してみる

今回は再現のしやすさから、イベントにGuardDutyのサンプルイベント、ターゲットにSNS+Chatbot通知という設定で試していきます。(※今回はChatbotの通知設定部分は割愛します。)

EventBridgeから以下のパターンを定義してルールを作成します。これでGuradDutyで検知した内容をターゲットに渡すことができます。

f:id:fu3ak1:20201108153656p:plain

ターゲットにはChatbotを設定したSNSトピックを設定します。

f:id:fu3ak1:20201108153844p:plain

その他は基本デフォルトでOKです。この2つを設定して作成します。

ルールができたので、次にアーカイブを作成していきます。左側のメニューからアーカイブを選択すればOKです。

f:id:fu3ak1:20201108154308p:plain

任意の名前を入力し、ソースには今回作成したルールが所属するデフォルトのイベントバス「default」を選択します。

f:id:fu3ak1:20201108154419p:plain

イベントのフィルタでは、すべてのイベントを対象としても良いのですが、今回はGuradDutyの検証のため、ルール作成時と同様のフィルタパターンを設定します。

f:id:fu3ak1:20201108154604p:plain

アーカイブができました。

f:id:fu3ak1:20201108154743p:plain

アーカイブの準備ができたので初回のGuradDutyのサンプルイベントを作成してみます。

GuardDuty>設定>結果のサンプルから生成できます。ポチっと。

f:id:fu3ak1:20201108155040p:plain

しばらくするとSlackに以下のようにたくさんメッセージが飛んできます。

f:id:fu3ak1:20201108155741p:plain

これらのイベントをEventBridge経由で再現してみます。EventBridgeのアーカイブから新しい再生を開始を選択します。

f:id:fu3ak1:20201108160040p:plain

作成しておいたアーカイブとルールを選択し、発生した時刻が含まれるよう開始、終了時刻を選択します。

f:id:fu3ak1:20201108160257p:plain

再生を開始をクリックするとイベントが再生され、しばらくすると以下の通りイベントが再生済みとなります。

f:id:fu3ak1:20201108160542p:plain

再びSlack側を見てみると、以下のように再度新しい通知が行われていました。

f:id:fu3ak1:20201108160652p:plain

ということで、GuradDutyのサンプルイベントの再作成なしで、通知のみの検証を行うことができました。

感想・まとめ

ターゲットの設定でインプットトランスフォーマーを使用した通知内容の調整や、Lambdaの実行を検証したい場合はイベントを意図的に複数回発生させていたことがあったので、そういった検証時に役立ちそうな機能です。

ただ、現状は時間指定での再現のようなので、発生したイベントが一覧で出てきて、特定のイベントを選んで再生。とできるとさらに良いなと思いました。特にGuardDutyのサンプルイベントは数が多すぎるところもあるので・・。今後に期待です。

CloudWatch AlarmsとOpsCenterの連携機能が出たのでインシデント管理が捗りそう

なにやら良さそうな記事が・・

CloudWatch Alarmsで検知したアラームを、インシデント管理のOpsCenterに自動連携してくれるようです。 これでAWS上でアラームをインシデントとして一元管理できるかも?

実際に動かしてみたいと思います。

aws.amazon.com

CloudWatch Alarmsとは

EC2のCPU使用率やClodWatch Logsのログフィルターなど各種メトリクスを、アラームとしてSNSなどで通知できる機能です。

OpsCenterとは

Systems Managerの一機能で、運用担当の運用作業項目 (OpsItems=障害やインシデント)を管理できる機能です。

今回のアップデート

CloudWatchアラームを作成するときに、ポチっとOpsCenterの設定を有効にするだけで、自動的にアラームをOpsCenterに登録してくれるようになりました。良いですね。

試してみる

実際にアラームを作成してみます。今回はEC2のCPU使用率に対してアラームを設定します。

f:id:fu3ak1:20201106095112p:plain

今回は意図的にアラームを発生させるため、CPU使用率100%以下で検知するよう設定します。

f:id:fu3ak1:20201106095302p:plain

アクションの設定にすすむと、「Systems Manager OpsCenter アクション」が追加されてました。 有効にしてみます。

f:id:fu3ak1:20201106100117p:plain

重要度とカテゴリを入力できました。イイ!

f:id:fu3ak1:20201106100211p:plain

その他は名前など任意で入力してアラームを作成します。

作成後、しばらくすると以下のようにアラームが発動します。

f:id:fu3ak1:20201106100610p:plain

これでOpsItemが作成されたはずなので、Systems ManagerのOpsCenterに遷移して状況を見てみます。 1件のOpsItemが出ていました。想定通りですね。

f:id:fu3ak1:20201106100815p:plain

IDをクリックして詳細を見てみます。 先ほど設定した重要度やカテゴリー、関連リソース(今回はEC2インスタンスとCloudWatch アラーム)が表示されています。

f:id:fu3ak1:20201106102023p:plain

その下には、OpsItemに関するAutomationの実行履歴とランブックが一覧で表示されて、実行できるようになっています。 運用作業や障害対応用のランブックを用意しておけば、誰でも簡単に一次対応(ランブック実行)ができそうですね。

f:id:fu3ak1:20201106102739p:plain

最下部には情報管理に役立ちそうな各種データ登録の機能がありました。 件数集計や類似アイテムの検索に役立ちそうです。

f:id:fu3ak1:20201106102915p:plain

情報をひととおり見たので、ステータスを解決済みにしておきます。

f:id:fu3ak1:20201106103120p:plain

完了!

f:id:fu3ak1:20201106103155p:plain

感想・まとめ

うまく活用することで、AWS上でインシデント管理ができそうですね!

個人的には、CloudWatch Alarmだけではなく、CloudWatch EventsでGuardDuty等の検知も行っているので、そういった情報もOpsItemに登録してAlarm以外のイベントも一元管理するとすごーく良い感じになりそうだなと思いました。

※CloudWatch EventsでもターゲットにSSM OpsItemを指定することで簡単に登録できそうです。

機会があれば何かのプロジェクトで提案したいと思います。

AWS Security JAM 2020 に参加してきた

AWS Security Roadshow内で開催されたAWS Security JAMに参加してきたのでそのレポートです。課題の詳細は記載できないので、概要と感想を書いておきます。

AWS Security Roadshow Japan | AWS

AWS Security JAMとは

以下公式の申込ページにあった記載内容です。

AWS Security JAM は、権限管理、自動化、インシデントレスポンスなどに関連するサービスを利用して、参加者が各課題ごとに AWS 環境を適切に修正するゲーミング形式のイベントです。 参加者はオンライン上で提示されたセキュリティ上の課題に対して、実際の AWS マネジメントコンソールを利用し、ご自身の知識、経験を活用し、必要に応じて学習をしながら課題解決に取り組みます。

実際のマネコンに入って調査、修正を行うので、実運用に近い形式で学習することができます。

実施概要

今回はオンライン開催ということもあり、チーム戦ではなく個人戦でした。2019年はチーム戦だったようですね。

dev.classmethod.jp

ということで一人でモクモクやっておりました。

セキュリティインシデントが発生しているいくつかのAWSアカウント、システムがあって、示されたセキュリティ要件を満たすように修正していく形式でした。 解決数に応じてスコアがもらえ、参加者の順位がダッシュボードに表示されます。

以下は問題の選択画面です。世界各地でインシデント起きているから解決してクレヨ!と言った感じですね。 問題にEasyやHardと言ったレベルがあるので好きなものを選んで順に解いていきます。

f:id:fu3ak1:20201028161614p:plain

出題範囲

ここは問題の詳細を説明できませんのでざっくりと。 幅広く色々なサービスから出題されます。

大事なIAMから、サーバーレス、ネットワーク系、SecurityGroupやWAFなどのセキュリティサービスなど。課題によって使用するサービスは様々でした。 具体的な設定内容がわからないと解けないので、サービス基礎知識だけでなく実践力も必要でした。

今後参加を検討する方へ

是非参加してみてください!

初心者の方は「難しそう・・」と思うかもしれませんが、課題にはわからない人向けのヒント(スコア減点あり)があったり、AWSの人にも質問ができますので、是非チャレンジだと思って参加してみると良いと思います。実力つきます。

まとめ、感想

とても楽しかったです!新しい知識も色々とつきました。 私はAWS Gamedayにも参加したことがあるのですが、それよりもより私の実業務に近いところだったのがとても良かったです。

ちなみに私の最終順位はTop11(全70人くらい?)でした。序盤の課題で詰まり時間をかけてしまったのが反省点です。

是非日本でもたくさん開催されると良いなと思います。開催していただいたAWSさんありがとうございました。

Oracle CloudでRACデータベースを作成してみる

今回はAWSではなく、Oracle Cloudの記事となります。

f:id:fu3ak1:20201012165629p:plain

ちなみに私はこの記事でOracle Cloudデビューとなります。基礎的な内容かつ、理解が不足している部分があるかもしれませんがご容赦ください。

オンプレミス環境でOracle Real Application Clusters(Oracle RAC)の構築経験があるのですが、 設定内容が複雑であり、インストール時間もかかるので、データセンター内でヒーヒー言いながら構築した思い出があります。

今回はそのRAC構成のデータベースをOracle Cloudではどれだけ簡単に作れるのか?という観点で実際に作っていきたいと思います。 とりあえずRACを作ってみたいという方の参考になれば幸いです。

Oracle Cloud アカウントの作成

本記事ではデータベースを作るところを書きたいのでアカウント作成部分は割愛します。 他のクラウドと同様、メールアドレスやクレジットカード情報を登録することでアカウントの作成ができます。 Oracle Cloud Free Tierという無料枠があるので、今回はその枠を使用して作成していきます。

docs.oracle.com

仮想クラウド・ネットワーク(VCN)の作成

データベースを所属するネットワークを事前に作成します。 VCNと言われ、AWSだとVPC的なやつですね。 左側のメニューから「ネットワーキング>仮想クラウドネットワーク」を選択します。 選択後、VCNの作成をクリックします。

f:id:fu3ak1:20201012102833p:plain

名前に「OracleNetwork」、CIDRに「10.0.0.0/16」を入力して作成します。

f:id:fu3ak1:20201012103143p:plain

VCN内にサブネットを作成していきます。

f:id:fu3ak1:20201012103557p:plain

名前に「OracleSubnet」、CIDRに「10.0.0.0/24」を入力して作成します。 今回はインターネット経由で接続確認を行う予定のため、パブリック・サブネットで作成します。 実際の本番環境ではプライベート状態で作ることが多いと思います。今回は検証用途ということでご認識ください。

f:id:fu3ak1:20201012104359p:plain

インターネットから疎通を行うため、インターネットゲートウェイを作成し、ルートテーブルを変更しておきます。

f:id:fu3ak1:20201012110004p:plain

作成後↓

f:id:fu3ak1:20201012110121p:plain

先ほどのサブネットに指定したルートテーブルで、宛先0.0.0.0/0、ターゲットInternetGatewayを設定しておきます。

f:id:fu3ak1:20201012110344p:plain

以上でVCNの準備は完了です。

SSHキーペアの作成

データベースインスタンスに接続する際に必要なため作成しておきます。 OCI標準のシェル機能であるCloud Shellで作成していきます。 右上のCloud Shellのマークをクリックすることで下部にターミナルが出てきます。

f:id:fu3ak1:20201012112120p:plain

ターミナル上で下記コマンドを実行します。 Oracle公式ドキュメントのとおりです。

$ ssh-keygen

保存先とパスフレーズを聞かれますので任意で入力します。 今回は全てデフォルトでEnterを押下します。(パスフレーズなし)

実行後、.sshフォルダに公開鍵と秘密鍵が作成されていることを確認します。

$ ls -l ~/.ssh/
total 8
-rw-------. 1 xxxx oci 1679 Oct 12 02:23 id_rsa
-rw-r--r--. 1 xxxx oci  401 Oct 12 02:23 id_rsa.pub

データベースの作成

準備ができたのでデータベースを作成していきます。 Oracle CloudにはOracle Autonomous Databaseという良い感じで自動管理してくれるデータベースがあるのですが、 今回はよりオンプレミスに近いRACデータベースを作ってみるという目的で、仮想マシン型のデータベースを作成していきます。

「データベース>ベア・メタル、VMおよびExadata」を選択します。

f:id:fu3ak1:20201009172937p:plain

DBシステムの作成をクリック

f:id:fu3ak1:20201012101355p:plain

必要情報を入れていきます。

  • シェイプ(スペック)はデフォルトから1段階小さいStandard2.2
  • 冗長構成(2ノード)で作成したかったが、無料枠ではコア数に制限があるようなのでここではノード数1とする(残念)。
  • その他デフォルト

f:id:fu3ak1:20201012135045p:plain

  • SSHキーに、先ほどCloudShellで作成した「~/.ssh/id_rsa.pub」の内容を貼り付け。
  • その他デフォルト

f:id:fu3ak1:20201012133500p:plain

  • ネットワークはあらかじめ準備していたVCNとサブネットを指定
  • ホスト名接頭辞には任意の名前を入力。今回は「orcl202010」

f:id:fu3ak1:20201012133820p:plain

  • 管理ユーザーsysのパスワードを入力。複雑要件が高いです。

「パスワードは9文字から30文字とし、大文字、小文字、特殊文字および数字をそれぞれ2つ以上含める必要があります。特殊文字は_、#または-のいずれかです。」

  • その他デフォルト

f:id:fu3ak1:20201012134052p:plain

以上、これで「DBシステムの作成」をクリックします。

作成完了までしばらく時間がかかります。 「プロビジョニング中」になっていることを確認し待機・・

f:id:fu3ak1:20201012140210p:plain

しばらくすると使用可能状態となります。 (私は使用可能になるまで1時間ほどかかりました。普通なのでしょうか)

f:id:fu3ak1:20201012150316p:plain

SSH接続からのSQL接続

Cloud Shell経由で接続してみます。パブリックサブネットに作成したので、ノードにはパブリックIPが付与されています。 先ほどの使用可能状態が見えた画面からDBシステム名をクリックし、左下の「ノード」をクリックしてIPアドレス情報を確認します。

f:id:fu3ak1:20201012152805p:plain

作成したSSHキーとIPアドレス情報を使用して接続します。

$ ssh -i id_rsa opc@168.138.193.64
The authenticity of host '168.138.193.64 (168.138.193.64)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxx
ECDSA key fingerprint is MD5:xxxxxxxxxxxxxxxxxxxxxx
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '168.138.193.64' (ECDSA) to the list of known hosts.
[opc@orcl202010 ~]$

接続できました。ルートユーザーにもなれます。 oracleユーザーに切り替え、sqlplusで接続してみます。

$ sudo su -
Last login: Mon Oct 12 15:20:34 JST 2020
[root@orcl202010 ~]# su - oracle
Last login: Mon Oct 12 15:20:34 JST 2020
[oracle@orcl202010 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 12 15:22:56 2020
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Version 19.8.0.0.0

接続できました!

RAC管理で使用するcrsctlコマンドで状況の確認も可能です。

$ /u01/app/19.0.0.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.COMMONSTORE.advm
               ONLINE  ONLINE       orcl202010               STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       orcl202010               STABLE
ora.chad
               ONLINE  ONLINE       orcl202010               STABLE
ora.data.commonstore.acfs
               ONLINE  ONLINE       orcl202010               mounted on /opt/orac
                                                             le/dcs/commonstore,S
                                                             TABLE
ora.net1.network
               ONLINE  ONLINE       orcl202010               STABLE
ora.ons
               ONLINE  ONLINE       orcl202010               STABLE
ora.proxy_advm
               ONLINE  ONLINE       orcl202010               STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.LISTENER_SCAN1.lsnr
      1        OFFLINE OFFLINE                               STABLE
ora.RECO.dg(ora.asmgroup)
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       orcl202010               Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.cvu
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.db1012_nrt1hk.db
      1        ONLINE  ONLINE       orcl202010               Open,HOME=/u01/app/o
                                                             racle/product/19.0.0
                                                             .0/dbhome_1,STABLE
ora.orcl202010.vip
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.qosmserver
      1        ONLINE  ONLINE       orcl202010               STABLE
ora.scan1.vip
      1        OFFLINE OFFLINE                               STABLE
--------------------------------------------------------------------------------

AWSのRDSとは違い、OSにログイン出来るのはちょっと不思議な感じがしますね。 (私がAWSに慣れているだけですが)

外部からSQL接続

せっかくなのでローカルPCのSQL Developerからも接続してみます。

DBインスタンスの1521ポートへ接続許可するため、作成したサブネットのセキュリティ・リストに以下のルールを追加しておきます。ソースはDBへ接続するクライアントのIPアドレスです。

ネットワーキング>仮想クラウド・ネットワーク>[作成したネットワーク名]>[作成したサブネット名] の順でクリックするとセキュリティ・リストの画面へ遷移できます。

f:id:fu3ak1:20201012161928p:plain

次に接続情報を確認します。データベースの詳細からDB接続をクリックします。

f:id:fu3ak1:20201012164248p:plain

簡易接続の情報をコピーしておきます。

f:id:fu3ak1:20201012164426p:plain

以下のような情報が取れるのでメモしておきます。

orcl202010.oraclesubnet.oraclenetwork.oraclevcn.com:1521/DB1012_nrt1hk.oraclesubnet.oraclenetwork.oraclevcn.com

では接続です。 ローカルPCにインストールしたSQL Developerから接続します。

以下の通り接続情報を入力し、接続します。

  • ユーザー名:system
  • パスワード:作成時に設定したパスワード
  • ホスト名:SSH接続で使用したパブリックIP
  • ポート:1521
  • サービス名:メモしておいた接続情報の「/」の後部分(今回ではDB1012_nrt1hk.oraclesubnet.oraclenetwork.oraclevcn.com)

f:id:fu3ak1:20201012161420p:plain

接続が完了すると、以下のようにデフォルトで存在するテーブルの情報が表示されます。

f:id:fu3ak1:20201012165044p:plain

接続確認は以上です。

まとめ

ネットワーク(VCN)の作成からやったことを考えると、それなりに時間がかかりましたね。「プロビジョニング中」で1時間待たされるのも意外でした。

ただやはりオンプレミスでOracleRACを作成する場合に比べると格段に速く作成できますので、Oracle RACの動きを見たい場合や、開発環境用途としては良いなと思いました。

今回の手順ではパブリック公開であったりセキュリティ・リストの設定が一部緩い部分もあったので、本番利用の際はここらへんもきちんと設計したいですね。

ではでは~

SecurityHubのレベル別通知が飛んでこなくなった

SecurityHub、使ってますか?細かい内容なのですが、SecurityHubの通知部分のパラメータが変更されていたのでその情報共有です。

f:id:fu3ak1:20201002142545p:plain
AWS Security Hub

Security Hubとは?

Security Hubは、AWSアカウント内のセキュリティ状況やコンプライアンスの準拠状況を1ヵ所で確認できるサービスです。 GuardDutyやMacieなど他のセキュリティサービスで検知した情報もSecurity Hub上で確認ができます。 使ったことのない方は是非一度有効にして確認してみてください。

aws.amazon.com

Security Hubの通知について

Security Hubを有効にすることで画面上で状況は確認できるのですが、セキュリティイベントが発生した場合の検知は別途設定する必要があります。 私は以前Security-JAWSで以下のようなお話をしていました。 「Security Hubの通知を全て行うとたくさん飛んでしまうのでフィルタを検討しましょう」

その中で、レベルがHIGHとMEDIUMのみ通知する設定例を紹介していました。

※CloudWatch Events または EventBridgeの設定です。

とある新しいAWSアカウントでこの通知を検証していたところ、この設定では通知が飛んでこないことが判明しました。

サポートに確認したところ、 AWSのフォーラムで案内があったとのことでした。

通知設定の変更内容

今現在HIGHとMEDIUMのみ通知を行う場合は以下の通り記載を変更する必要があります。

変更前(古い内容)

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "ProductFields": {
        "aws/securityhub/SeverityLabel": [
          "HIGH",
          "MEDIUM"
        ]
      }
    }
  }
}

変更後(新しい内容)

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "Severity": {
        "Label": [
          "HIGH",
          "MEDIUM"
        ]
      }
    }
  }
}

「ProductFields.aws/securityhub/SeverityLabel」にあった項目が、「Severity.Label」に移ったようです。

登壇資料も更新いたしました。

こっちはダメよ!

こっちで!

もし私の資料を参考に通知設定をされている方がいましたら、更新よろしくお願いしますm(__)m

下記の記事にも同様の記載があり、まだ古い状態ですので近いうちに更新予定です。

www.nri-net.com

ちなみに、上記HIGHとMEDIUMの設定はあくまで例なので、通知の状況や要件に合わせて設定はカスタマイズするようお願いします。

今後の変更に気付くには

現状はAWSのフォーラムを定期的に確認していくしか方法が無いようです。 メール通知は無いとのこと。ちょっと設定がマニアックで影響のあるユーザーが少ないかもしれないですね。

フォーラムのRSSがあるのでそこを登録して見るようにしたいと思います。

こういった細かいところも気を付けないとなーと反省した出来事でした。