セキュリティの勘所

# はじめに
システムのセキュリティを考えるにあたり、システム基盤の観点から基本的な考え方についてまとめました。

セキュリティの考え方は生きる上での考え方と同じです。コストをかければ一時的にセキュリティは向上しますが、可用性とトレードオフであり、適切に運用がされなければ無駄以上の何物でもありません。また、コストをかけなくても、OSSを使用したり、設計や運用で向上させることはできます。

そして、いつかは廃れるものです。

**※本記事の内容は、あくまで考え方の一例であり、必ずしも全ての考え方がシステムに適合したり、ここに書いている内容で満たされている訳ではありません。**

## 共通編
- **最小権限の法則**   
アカウントに付与する権限は必要最小の権限を付与すること。また、利用しないアカウントは削除すること。
- **アカウントの共用禁止**   
セキュリティインシデント発生時に、ログの特定がしにくくなるため。また、可用性も損なわれる。
- **領域の分割**   
ネットワークの場合はネットワークを分割することで、マルウェア感染時に他のネットワークに対する不正アクセスを防止する。また、ディスクの場合はパーティションを分割することで、障害発生時の影響を局所化できる。
- **運用設計**  
インターネットやメールの送受信と、システムの運用でサーバに対する接続を同じPCで行わない。
- **踏み台サーバの利用（トランジットサーバ）**  
運用管理セグメントを設置せずに、業務のPCで運用を行うときなどに踏み台サーバを経由して対策する場合は、OTPや生体認証が有効。

## TCP/IP
- **ポートスキャン**    
ポートスキャン（TCP コネクトスキャン）された場合はログに出力される。但し、ハーフスキャン（TCP SYNキャン）の場合はTCPのコネクションが確立されていないため、ログに残らないのでスキャンされたか分からない。これをステルススキャンと言う。
- **外部から入ってくる自システムの通信**   
外部から入っくる通信で自システムのプライベートIPアドレスはあり得ないので、拒否すること。

## プロキシ
- **クライアントのIPアドレスを特定**  
プロキシはクライアントのIPアドレスを隠蔽する。クライアントの送信元IPアドレスを特定する際は、[X-Forwarded-For](https://ja.wikipedia.org/wiki/X-Forwarded-For)をつける。
- **CONNECTメソッドの制限**   
https通信をプロキシ経由で行う場合は、プロキシサーバに対してクライアントがCONNECTメソッドを使用する。マルウェア対策を検討する場合はCONNECTメソッドを制限するとよい。（マルウェアの通信は、独自プロトコルやランダムなポートへのアクセスするため、443以外は拒否する等）
- **プロキシ認証機能の有効化**   
C&Cサーバとコネクトバック通信を行うマルウェアのよくあるパターンは、まずプロキシを経由しないでインターネットに出ようとする。よって、PCからインターネットあての通信をFWでプロキシのみに制限していれば対策はできている。しかし、プロキシの制限をしていないと簡単に利用されてしまうので、プロキシ認証機能を有効化する。
- **プロキシ認証を突破するマルウェアの対策**   
ブラウザのオートコンプリートを無効化し、ブラウザ起動時に毎回認証情報を入力する。なお、Active Directoryの場合はグループポリシーで制限が可能。また、Basic認証は使用しない。（IDとパスワードは平文でネットワークを流れるため）
- **ログ監視による対策**
プロキシ認証型の更なる対策として、SSOを利用している場合でもそれを不正利用されることがある。そのようなときは、プロキシのログを監視し、同一の時間帯に同一ユーザIDによるログインが複数のユーザPCのIPアドレスで発生していなかったかを検査することで検知できる。または、時間帯ごとの認証ログに着目し、業務時間外（深夜など）の認証ログが特定端末から定期的に出力されている場合についてもマルウェア感染の疑いが強いと考えることができる。

- **プロキシとDNS**
DNSとプロキシでは、プロキシ通信のほうが優先される。プロキシを設定する場合、DNSによる名前解決はプロキシサーバが行う。よって、プロキシを使っている環境ではクライアント側のDNSサーバ設定を変更しても効果がない。

## DNS
- **再帰的問い合わせの制限**
キャッシュポイズニングや、マルウェアが保持しているFQDNのTXTレコードを問い合わせ、得られた文字列を指示として解釈し動作する攻撃などに有効。

- **送信元ポート番号のランダム化**
DNSキャッシュポイズニング攻撃を成功させる場合は、送信元ポート番号、トランザクションIDを本来の応答レコードと合致させる必要がある。そのため対策として、UDPヘッダの送信元ポート番号のランダム化設定を行うことが有効である。

- **クエリログ**
DNSクエリログはデフォルトで出力しない製品が多い。セキュリティを考慮する場合はログ出力するとよいが、クエリログは膨大になるため、適切なディスク設計及びログ管理を行うこと。

- **hosts**
Windows及びLinuxについて、DNSの参照順序は基本的にhostsを最初に見て、ない場合はDNS問い合わせを行う。よって、hostsに不正な書き換えが行われると意図しないサイトにアクセスする。

## メール
- **SMTPの脆弱性**   
SMTPは脆弱性のあるプロコトルである。SMTP AUTHまたはPOP before SMTPで利用者認証が行える。なお、SNTP AUTHのみ認証時のパスワードが暗号化される。
- **オープンリレー（第三者中継）防止**   
エンベロープアドレスに自システム以外のドメインは拒否すること。
- **迷惑メール対策**   
迷惑メール対策として、SPF、DKIM等の技術は「送信ドメイン認証」と呼ばれる。但し、攻撃者がSPFレコードを適切に設定している場合は対策にならない。

## Webサーバ
- **バージョン情報非表示**   
攻撃者に情報を与えないため、ミドルウェアのバージョンは非表示にする設定を行う。
- **メソッドの制限**    
最近のブラウザやWebサーバソフトウェアはデフォルトでTRACEメソッドは無効にされている。必要に応じて他のメソッドも制限する。
- **ディレクトリインデックスの非表示**    
不要な情報は表示しない。
- **ディレクトリトラバーサル対策**   
ファイルのアクセス権や外部からのパラメータでWebサーバ内のファイルを参照できないようにすること。
- **Dos攻撃対策**    
リクエストボディのサイズや、コネクションタイムアウト、プロセス数のチューニング等ミドルウェアでも対策の仕方はあるので見直す。
- **GETメソッドとPOSTメソッド**    
POSTメソッドはデータ送信時にリクエストボディにデータを格納するので、GETメソッドに比べて安全である。
- **不正アクセス時の対応**   
不正アクセス発生時はWebサーバのOS再起動を無闇に行わない。Webサーバが不正アクセスを受けて被害が発生した場合では、シャットダウンによってメモリ上の多くの情報が失われ、被害の原因となる情報も失われることになり、調査が困難となるため。

## 暗号化
- **共通鍵暗号**  
DES、3DES、RC4等脆弱性が発見されている暗号化方式は使用しない。
- **ブロック暗号方式のモード選択**   
ブロック暗号方式でECBモードは利用しない。ECBモードは暗号化されたブロックのすりかえを容易に可能とする。
- **擬似乱数**   
乱数を使用する場合に求められるのは、再現性がないこと、推測しにくいこと、規則性がないこと。よって、線形合同法を使用している擬似乱数機は使用しない方がよい。
- **ファイル圧縮時の暗号化の順序**    
暗号化するときにファイルを圧縮する場合は、先に圧縮を行うこと。ビット列の冗長性が失われるため、暗号化を行ったあとにファイルを圧縮しても効果は殆ど得られない。
- **ファイル暗号化の注意事項**    
ウイルススキャンを行うときは、ファイルを暗号化する前にスキャンを行うこと。暗号化されたファイルはスキャン時に検知できない。

## マルウェア
- **内部対策**    
最近のマルウェアは感染すると、まずは内部の情報を収集するため感染したPCでアクセス可能なファイルサーバなどから情報を収集し、感染を広めていく。よって、外部だけでなくマルウェア感染時の内部のセキュリティ設計を強く意識するとよい。（アクセス権、無駄な共有フォルダの削除、ネットワークの分割（運用LANの新設）等）
- **堅牢性**    
内部対策としてコストをかけずにできることとしては、パーソナルFWを有効化する。Linuxサーバの場合はSELinuxを有効にする。
- **C&Cサーバとの通信**   
マルウェア内にC&CサーバのFQDNを保持していて、C&Cサーバと通信するタイプの場合、通信が失敗してもログには残らないケースがある。例えば、マルウェアがFQDNの名前解決を行い、サーバで設定されている内部DNSサーバに対して問い合わせるが、内部DNSサーバ側で再帰的な問い合わせが許可されていない場合など。（DNSでクエリログを出力する設定になっていなくて、FWにも通信が届かないため）
- **自己防衛**   
マルウェアが自己防衛としてデバッガの存在を検知する方法はいくつかある。開かれているウィンドウの名前を取得し既知のデバッガを探す。実行中のプロセスの一覧を取得し既知のデバッガのプロセス名を探す。OSのAPIを使用してデバッガの存在を検知する。
- **ディジタルフォレンジックス**   
マルウェア感染時にPCを調査するときは、証拠となるデータを失わないようにメモリダンプの取得やHDの複製作業を行い、解析の対象となるデータの保全を図るべきである。

## ランサムウェア
- **ファイル暗号化型**
ランサムウェアのタイプは大きく、ファイル暗号化型と、端末ロック型に大別される。現在主流なファイル暗号化型の特徴は、感染するとまず暗号化を行う鍵を作成する。次に作成した鍵で、ファイルの暗号化を行い攻撃者に送信してPCに脅迫メッセージを表示する。対策としてはバックアップを取得すること。また、クラウドやNAS等利用する資産に対して適切なアクセスコントロールを行うこと。（ファイル暗号化型の場合、同一ネットワーク上のファイルサーバや接続している記録媒体などにもその影響が及ぶため）

- **バックアップにおける留意事項**
バックアップに使用する装置・媒体は、バックアップ時のみパソコンと接続する。（外付けHDDやUSBメモリは、パソコンに接続していない状態であればランサムウェアの影響は及ばないため）なお、光学メディアなど一度データを書き込んだ後はその書き換えができないタイプの媒体であれば、パソコンに接続していても（メディアが挿入された状態でも）問題はない。

## 脆弱性
- **IPSによる防御**   
脆弱性によりパッチ適用が難しい場合は（パッチ適用の検証で時間がかかる等）、ホスト型IPS（HIPS）が有効である。これにより、当該ホストに対する不審な通信を遮断し、不正なプロセスを実行を防ぐ。

## 標的型攻撃
- **標的型メール攻撃**  
基本的な対策として怪しいメールは開かないこと。攻撃手法にはURLリンク型、やりとり型等いくつかの手法があるが、添付ファイル型の場合開いたら感染する。（例としては添付ファイルのテキストファイルを開いた場合、ショートカットファイル（.lnk）でスクリプトが実行されるなど）
- **ショートカットファイル（.lnk）**    
対策としてはアイコン左下を見てショートカットファイルになっていないか、また、プロパティのリンク先を見てショートカットファイル内にスクリプトが設定されていないことを確認する。
- **RLO**    
文字コードを利用してスクリプトを実行させる攻撃。添付ファイル名を逆から読んで、batなど怪しい文字がないか確認する。
- **フィッシングメール対策**  
Office365のアカウントを狙うフィッシングメールが増えている。Office365を導入している企業は多く、攻撃者にとって有益な情報がそこにはあるため。手口としてはメールを開かせるような文面で、URLをクリックすると攻撃者が用意したフィッシングサイトに接続し、Office365のアカウントでのログインを促しアカウント情報を盗むとういうもの。対策としては、「IDやパスワードの入力が求められる画面は本物であるか、URL 等を確認する」や、「ウェブサイトを開く場合、メールに書かれたリンクからではなく、ブックマーク等信頼できる方法で開く」という対策が有効である。
- **DDEを悪用した攻撃**   
メールに添付されたWord文書を開いたり、Outlookでメールを開くと、「リンクされたデータで文書を更新する」旨の警告ウィンドウが表示される。このときに警告ウィンドウが表示され「はい」をクリックし、「遠隔データへのアクセスができないため、アプリケーションを起動する」旨の警告ウィンドウが表示される。２回目の警告ウィンドウで「はい」をクリックするとウイルスに感染する。

## ファイル共有
- **アクセス制御**  
ユーザPCにおいてファイル共有機能を利用していない場合は、グループポリシーなどを利用してファ
イル共有機能を停止するとともに、ユーザによるファイル共有の作成を禁止する。なお、OS標準状態で有効になっている管理共有（C$やD$、ADMIN$など）が非常に良く狙われるため、設定後に正しく無効化できているか「net share」コマンドを利用して確認することを推奨する。
- **監査ポリシー**   
重要なファイルに対するアクセスは、Windowsの場合、監査ポリシーを有効にすることで、指定したフォルダやファイルに対するアクセスをイベントログに出力することができる。

## 無線LAN
- **SSIDのステルス化**   
SSIDを非表示にすることでセキュリティを向上させる。
- **不正なアクセスポイントの設置**   
アクセスポイントが勝手に設置されてセキュリティが脅かされる可能性は大いに考えられる。もし、PCが無線LANに自動接続される設定になっている場合はリスクがあるのを認識すること。
- **なりすまし**   
無線LANを自動的に接続するためには、アクセスポイントのSSIDを認識しており、かつ、暗号化方式（WEP、WPA、WPA2等）、暗号化方式で使用する事前共有鍵を設定しておく必要がある。したがって、SSID、暗号化方式、事前共有鍵に公衆無線LANで使用されているものを設定すれば、公衆無線LANの利用者を自動的に接続させる攻撃を可能とする。

## SNMP
- **コミュニティ名**   
SNMPを使用するときは、デフォルトのコミュニティ名は殆どpublicになっているので変更すること。

## バックアップ
- **改ざんによる被害**   
Webサーバが改ざんされたときに、改ざんされたコンテンツの日付と取得しているバックアップの日付を照合する。もし、改ざんが大分前に行われて、どの時点のバックアップが改ざん前の情報を保持しているか不明な場合はバックアップデータを使用しない方がよい。

## ログ管理
- **ログ管理方式**  
セキュリティインシデント発生時にサーバのログとログ管理サーバのログを照合する場合は、適切にサーバのローカル内にログを保管していること。また、ログ管理サーバの証跡ログの管理を行うこと。
- **改ざん対策**   
内部の不正及びマルウェアを考慮するときは、ログに対する適切な権限設定、また、改ざん対策を行なっている場合はログ改ざん発生時に通知できること。
- **適切なログ出力設定**   
ログの取得を目的とするのではなく、セキュリティインシデント発生時に知りたい情報の特定を行いやすいように、ログ出力設計を行うこと。

## その他
- **管理者アカウント**   
特にWindowsなど管理者アカウントは変名することが望ましい。
- **タスクスケジューラのログ取得設定**  
Windowsのタスクスケジューラのログはデフォルトで出力されないが、イベントビューアの設定で出力ができる。これにより、不正タスクを検知する。
- **スティッキービット**   
root権限で実行されるため、不要なスティッキービットは削除すること。
- **デフォルトポート変更**   
OS、MWで使用するポートは大体変更可能である。特にSSHなどポートを変更することでセキュリティの向上が望める。
- **トラップアカウント**  
普段は絶対利用しないトラップアカウントを作成し、そのアカウントの認証失敗のログを監視することで、不正侵入を検知することができる。
- **IOTのデフォルトパスワード**    
IOTのデフォルトパスワードは必ず変更すること。
- **リバースブルートフォース攻撃**   
リバースブルートフォース攻撃は、パスワードの文字種やレングスが少なく、かつユーザIDの文字種やレングスが少い場合には非常に有効。対策としては、利用者の単位時間当たりの認証失敗数がしきい値を超えた場合などにアカウントロックや追加認証を行う。
- **ソルト**  
 レインボーテーブルを用いたパスワードクラックに対しては、ソルトが有効である。同じパスワードでもハッシュ値が違うため、ハッシュ値から元のパスワードを特定するのは困難になる。

# さいごに
まずはソーシャルエンジニアリングを心得ること。

また、セキュリティを広義で捉えたときに、大規模システムにおける障害の多くは人的ミス（単純なオペレーションミス）により偶発的に引き起こされているのが、統計的、歴史的に見て分かります。