Cloud One Application Security(Preview)でリモートコマンドと不正なファイルアクセスの設定と検知をしてみた
こんにちは、コンサル部@大阪オフィスのTodaです。
トレンドマイクロ社が提供しているCloud One Application Security(Preview)を試す機会が ありましたのでリモートコマンドと不正なファイルアクセスに関する設定と検知をしてみました。
Cloud One Application Security(Preview)の詳細は下記記事を合わせてご覧下さい。
この記事は前回EC2にLaravel(PHP)を導入して検証をした続きになります。
オープンリダイレクトの検知は下記記事をご覧下さい。
前提条件
- 現在(2020/09/29時点)はPreview版であり、今後変更される予定があるため、ご注意ください。
- Cloud One トライアル版アカウント登録し、30日無償にてトライアルで簡単にテストしています。
- EC2はLAMP環境が整っている状態から利用しています。
リモートコマンドの判定を試してみる
PHPには外部コマンドを呼び出すことができる関数が存在します。
開発者、運用者が想定している動きなら問題ありませんが、プログラムの不具合・脆弱性を利用して実行されている場合大きな問題になります。
リモートコマンドの検出、遮断をしてみます。
PHPで外部コマンドが実行できる関数例
exec(), shell_exec(), system()
リモートコマンドの設定確認
フィルタグループのリモートコマンド設定を確認します。
初期状態では全てのリモートコマンドが対象となっています。
意図的にリモートコマンドを設定
pingコマンドを実行してテンプレートに結果が表示されるように設定します。
※下記プログラムはお試し用途のためバリデーション・不正対策をしておりません。
ルーティング設定
vi /routes/web.php // 下記を最終行に追加 Route::get('/ping', 'HomeController@ping');
コントロール設定
vi /app/Http/Controllers/HomeController.php // 下記を追加 /** * Ping Test * * @param \Illuminate\Http\Request $request * @return \Illuminate\Contracts\Support\Renderable */ public function ping(Request $request) { $ipaddr = $request->input('ip'); exec('ping -c 3 '.$ipaddr, $result); return view('home')->with('result', $result); }
ビュー設定
vi /resources/views/home.blade.php <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif <!— 追記 start —> @if(!empty($result)) {!! nl2br(implode("\n", $result)) !!} @endif <!— 追記 end —> </div>
ブラウザでURLにアクセス
アクセスをするとLaravelの画面上にPingの結果が表示されます。
このときリモートコマンドはブロックされず実行されます。
アクセス:http://[サーバIP]/ping?ip=localhost
Cloud Oneのログ
Cloud One画面には「Remote Command Execution」で表示されます。
ログ詳細
アクセス元や実行されたコマンドが表示されます。
スタック表示
コマンド実行が行われたプログラムを特定する場合はスタック表示を利用します。
リモートコマンドをブロックする
ブロックに設定変更
リモートコマンドの設定をREPORTからMITIGATEに変更します。
ブラウザでURLにアクセス
先ほどと違いリモートコマンドは実行されずエラー画面が表示されるようになりました。
リモートコマンドを一部許可する
ポリシー設定に移動
リモートコマンドのポリシー設定画面に移動します。
ルールの追加
コマンドの判定ルールに新しいルールを追加します。右上の+ボタンをクリックします。
ルールの設定
コマンドの内容をPCRE形式の正規表現で登録します。
コマンド内容が決まっている場合はそのまま記載でも良いと考えます。
PingでLocalhostのみの場合
ping \-c 3 localhost
コマンドの内容で任意の文字列を指定する場合、利用できる文字列を指定することをおすすめいたします。
任意IPを指定する場合
ping \-c 3 (([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
ルールの反映
上記登録をすると一覧に追加されます。
一覧は上部のルールが優先して反映されます。順番を調整して画面下の保存ボタンをクリックします。
実際にアクセス
作業後、先ほどブロックされていたURLにアクセスしたところPingの結果画面が表示されるようになりました。
不正なファイルアクセスの設定を試してみる
不正なファイルアクセスはルールに設定したファイル、ディレクトリに読み書きががあった場合に通知・ブロックをします。
Laravelを利用して検証をしていると初期設定でもCloud Oneのログが出力されることがわかりました。
これはLaravelの機能でキャッシュファイルが生成された時に不正なファイル書き込みと認識しているため表示されます。
キャッシュファイルや画像、ログファイルなどファイル生成がある場合は事前にCloud Oneに除外で登録をする必要があります。
今回はLaravelの仕様にあわせてCloud Oneに除外設定をいれています。
ファイル生成の仕様を知る
フレームワークの場合、ドキュメントを確認してシステム動作時にファイルが生成される箇所を確認します。 Laravelの場合は公式ドキュメントにパーミッションの設定に関する説明から判断します。
[ディレクトリパーミッション] Laravelをインストールした後に、多少のパーミッションの設定が必要です。 storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください。 設定しないとLaravelは正しく実行されません。Homestead仮想マシンを使用する場合は、あらかじめ設定されています。
引用元 : https://readouble.com/laravel/6.x/ja/installation.html
上記の説明からstorageとbootstrap/cacheディレクトリ配下を除外に設定をする必要がありそうです。
ポリシー設定に移動
不正なファイルアクセス(Illegal File Access)のポリシー設定画面に移動します。 画面移動の流れは上記リモートコマンドと同じになります。
ルールの追加
判定ルールに新しいルールを追加します。右上の+ボタンをクリックします。 今回は書き込みファイルの判定のためWRITE CONTROLSに設定します。
ルールの設定
コマンドの内容をPCRE形式の正規表現で登録します。
コマンド内容が決まっている場合はそのまま記載でも良いと考えます。
storageディレクトリの場合
/var/www/html/storage/*
bootstrap/cacheディレクトリの場合
/var/www/html/public/bootstrap/cache/*
ルールの反映
上記登録をすると一覧に追加されます。
一覧は上部のルールが優先して反映されます。順番を調整して画面下の保存ボタンをクリックします。
実際にアクセス
作業後、キャッシュファイルをクリアして同じ動作をおこなったところ判定を受けないようになりました。
少し気になった点
・各ルール設定の画面
ウィンドウサイズが小さい状態で2重スクロールが表示されるときにマウススクロールをするとページャーの表示までスクロールできず見た感じでルールの件数を勘違いするケースがありました。
一覧上部にルールの件数とページャーがあるといいなと思いました。
さいごに
Cloud OneのApplication Securityに関して試してみました。 設定をいろいろ試しておりますが、簡単にポリシーの設定ができるため運営者・管理者でも操作がやりやすいと感じております。 ポリシーを検討する際は開発担当者も交えて考える事をおすすめいたします。
今回は、リモートコマンドと不正なファイルアクセスについて試してみました。 上記以外にも機能はございますので別記事でご案内させていただきたいと思います。