【覚え書き】開発者が最低限知っておくべきセキュリティ基礎
はじめに
アプリ開発を行うことは0から1を作るということで、つまりセキュリティ対策についても0から1つずつ実装する必要があります。一般的なセキュリティ対策を実装はしますが、それらがなぜ必要なのか、どのようなものなのか、実は理解できていないことを問題に感じていたため「開発者が最低限知っておくべきセキュリティ基礎」について調べました。
この記事のスタンス
基本的なセキュリティ概念・基礎知識についていくつか項目を洗い出して芋づる式に調べました。そのため「最低限知っておくべきセキュリティ基礎」と言いつつ全てを網羅しているわけではありません。 また自分用の覚え書きとしてリスト形式でまとめたものをそのまま記載しています。(リスト形式にすると整理しやすい)
ここから下の内容は、文章の体裁はあまり整えていません。あくまで自分用の覚え書きです(大事なことなので二回…)
基本的なセキュリティ概念
セキュリティの3つの主要な要素(CIA)
-
機密性(Confidentiality)
- 機密性とは:情報に対するアクセス制限を保護・管理すること。情報を外部に見せない、漏らさないこと。
- 必要になるのは:個人情報、顧客情報、開発情報、システムにアクセスするパスワード
- 高めるには:
- 情報を保存したHDDなどはアクセスコントロールされた場所に保存
- パスワードの設定方法、保管場所
- 権限を持つ者だけがアクセスできる仕組み
- ユーザー(人)だけでなくクライアント端末(物)に対しても適切に。
- ペネトレーションテスト:システムに不正侵入の弱点がないか確認する
-
完全性(Integrity)
- 完全性とは:改ざんや過不足のない正確な情報が保持されている状態
- 高めるには:
- 情報にデジタル署名
- 情報にアクセス履歴、変更履歴
- バックアップなど情報保管のルール
- Web改ざん通知という仕組みがある
-
可用性 (Availability)
- 可用性とは:情報をいつでも使える状態を保持
- 高めるには:
- システムの二重化(多重化)
- HDDのRAID構成
- UPS(無停電電源装置)
- BCP(事業継続対策)
- システムのクラウド化
- システム運用が大切
- オンプレミスでもできるけどクラウドの方が管理・運用・トラブル対応のコストが格段に低い
三要素に加え、さらに新たな四つの要素がある
-
真正性(Authenticity):アクセス許可された本人であることを確実にする
- デジタル署名
- 2段階認証
- 多要素認証(生体認証を含む)
-
信頼性(Reliability):期待通りの動作をすること
- 不具合を起こさない設計
- ヒューマンエラーが起こってもデータ改ざんや消失がない仕組み
-
責任追跡性(Accountability):企業組織や個人の動きを追跡して脅威や原因を明らかにできること
- アクセスログ、システムログ、デジタル署名、操作履歴、ログイン履歴
-
否認防止(non-repudiation):情報が後から否定されないように証明しておくこと
- 責任追跡性の施策(デジタル署名や各種ログ等)で実現できる。
情報セキュリティの脅威
以下の三つに対策している状態で対策基準を保っていると言える
- 「人的脅威」:従業員の不正や偶発的な誤り、情報セキュリティの意識の低さが原因で起こる
- 「技術的脅威」:コンピュータがウイルスやマルウェアに感染することによる情報漏洩。
- 「物理的脅威」:災害などでシステム停止することによる情報の破壊
その他
- ゼロトラストセキュリティ:守るべき情報にアクセスする全てを信用しないという考え方を前提に対策する
- クラウドを活用することでセキュリティ対策を効率よく行える
参考
情報セキュリティ3要素と7要素 CIAの定義から4つの新要素まで解説|コラム|クラウドソリューション|サービス|法人のお客さま|NTT東日本
情報セキュリティとは?3要素(CIA)と7要素の意味や定義と対策基準を解説
ネットワークセキュリティ
内部ネットワークを攻撃やデータ漏洩から保護するための技術。
アクセス制御、サイバー攻撃からの保護、マルウェア検出などのセキュリティ対策を行う。
そもそもネットワークとは
2つ以上のコンピュータ機器が接続されてできたグループのこと。
以下のような様々な規模がある。
PAN(パーソナルエリアネットワーク)
LAN(ローカルエリアネットワーク)
WAN(ワイドエリアネットワーク)
アクセス制御
データやデータを操作するソフトウェアへのアクセス権限を制限するもの。IAMのソリューションが役立つ。
多くの企業はVPNを使用してアクセスを制御しているが、VPNに代わる方法も今ではある。
ユーザー認証
アクセス制御において認証は非常に重要。二要素認証(2FA)は特に重要な措置。
ファイアウォール
ネットワーク通信において、その通信を許可するか判断する仕組み。内容ではなく送信元と宛先の情報を見て決める。=ファイアウォールを設置したから完全な情報セキュリティ対策になるわけではない。
ファイアウォールは元は火災などから建物を防御するための防火壁のこと。ネットワークにおいて、外部からの攻撃や不正から自分たちを防御する仕組みとしてそう呼んでいる。
コンピュータ単体を防御する「パーソナルファイアウォール」と企業や家庭のネットワーク全体を防御する「ファイアウォール」の二種類がある。
DDoS攻撃
DDos(Distributed Denial of Service)攻撃とは:マルウェア等を感染させたコンピュータを遠隔操作してターゲットとなるWebサイトに対して攻撃する。正常な通信で大量のデータをサーバーに送り込むため防御が難しい。大量の通信で回線を詰まらせることができればそれもDDoS攻撃が成功となる。
VPN
- VPNとは:VirtualPrivateNetworkの略で「仮想専用線」と呼ばれる。送信側、受信側に「カプセル化」を行い第三者に見えない仮想的な経路で通信する仕組み。(トンネリング)
通信時に正規の利用者であることを確認(認証)したり万が一侵入された場合に備えて通信内容を暗号化するなどの技術を併用することで安全性を高める。
仮想ネットワーク技術の一つ - ネットワークを仮想化するとは:
- 物理ネットワークの場合:ネットワーク構成を変更しようとするとケーブルや機器の接続を変更したり機器の設定を変更する必要があり、大変。作業中の配線・設定ミスのリスクもある。実現したい構成によっては機器の追加購入の必要もあり、コストが高い。
- →物理的なネットワークハードウェアをソフトウェアで抽象化し、コンピュータやサーバーを接続=ネットワークを構築する。ソフトウェアによる管理を行う。
- 物理構成の変更が必要ない、目的ごとにネットワークを細分化できセキュリティ向上、コスト削減のメリットがある
- VPNは「”仮想”専用線」では、「専用線」とは?:接続できる範囲が一対一(本社:拠点)一社で通信を独占して大容量のデータをやり取りしたい場合は安全性・信頼性の高い専用線が有効。ただし拠点間の通信はできず、拠点の距離が遠くなるほどコストが高くなる。
- メリット
- 通信を暗号化できる
- リモートで社内ネットワークへのアクセスが可能(モバイル端末も!)
- 低コストで拠点間通信が可能:仮想ネットワークを利用するため運用コストが低い
- デメリット
- 情報漏洩リスクがゼロとは言えない:セキュリティを意識して設定を行う必要がある
- 通信速度が遅くなることもある
- 製品によっては高コスト
- VPNプロトコルとは:VPNサーバーとの通信を安全で高速なものにするために必要な暗号基準
侵入検知/防止システム
- IDS(IntrusionDetectionSystem):不正侵入検知システム
- ネットワーク上の通信を監視して不正なアクセスやその予兆を管理者等に通知
- IPS(IntrusionPrevesionSystem):不正侵入防止システム
- ネットワーク上の通信を監視して不正なアクセスをブロックする
- あらかじめ異常なパターンを登録してマッチした通信を検知する「シグネチャ型」と正常なパターンを登録してマッチしない通信を検知する「アノマリ型」の二種類ある
- FW(ファイアウォール)は低階層、WAF(Web Application Firewall)が高階層(SQLインジェクションやcookie・パラメータの改ざん等による攻撃を防御)であればIDS/IPSは中階層でOSやWebサーバーの脆弱性を狙った攻撃を防ぐ
参考
ネットワークセキュリティとは? | Cloudflare
防御が難しいDDoS攻撃からWebサイトを守れるか?CDN導入のメリット|ネットワーク・モバイル | NTTコミュニケーションズ
VPN接続とは?VPNの基本とメリット・デメリットを紹介|ICT Digital Column 【公式】NTTPCコミュニケーションズ
仮想ネットワークとは?定番の技術から最新の情報まで徹底解説
IDS・IPSとは?攻撃を防ぐ仕組みや役割、導入の選定ポイントを紹介|ICT Digital Column 【公式】NTTPCコミュニケーションズ
暗号化
対称暗号と非対称暗号
- 対称暗号は暗号化と復号化に一つの鍵が使われる
- 非対称暗号は、公開鍵で暗号化して秘密鍵で復号化(またはその逆)を行う
- SSL/TLSは通信プロトコルの一つで、通信のセッション開始時に非対称暗号化で秘密のセッションキーを安全に交換→このセッションキーはその後の通信で対称暗号キーとして使われる。セッションキーの交換後は残りの通信はより効率的。
- SSL/TLS証明書:サーバーの公開鍵とその所有者情報を保持。証明書は信頼できる認証局により署名、デジタル署名の検証には非対称暗号化が用いられる。有効期限がある。
- HTTPS接続:ブラウザがサーバーから証明書を受け取り信頼性を検証→確認後、証明書に含まれる公開鍵を使用して一時的なセッションキーを暗号化してサーバーに送信→サーバーは秘密鍵を使用してこのセッションキーを復号化し、以降の通信はこのセッションキーを使用して対照暗号化される。
セッションは一般的にWebブラウザとサーバー間で維持される。同一ドメイン内のページ移動ではセッションは維持され、ユーザーがWebページやブラウザを閉じたり別のドメインに移動したりセッションタイムアウト、明示的なセッション終了の命令があった場合にセッションが終了する。
ハッシュ関数
- 入力に対して一意の出力(ハッシュ)を生成する。不可逆的で、ハッシュから元のデータは分からない。
- SHA-256等のハッシュアルゴリズムを使用する
- パスワードのハッシュ化やデータの整合性チェックに用いる
デジタル署名
- データの送信元の身元確認、メッセージの改ざん検知を行う
- デジタル署名の生成と検証:公開鍵暗号とハッシュ関数を用いる
- 生成
- 送信するデータ(メッセージ)にハッシュ関数を適用してメッセージダイジェストを生成
- 送信者の秘密鍵でダイジェストを暗号化→暗号化されたダイジェストがデジタル署名
- 署名と一緒にオリジナルのメッセージ(未加工のデータ)を受信者に送信する
- 検証
- 受信者は送信者の公開鍵を使って暗号化されたダイジェストを復号化
- 受信者はメッセージを同じハッシュ関数でダイジェストを再生成
- 復号化したダイジェストと再計算したダイジェストを比較して一致することを確認
- 生成
- デジタル署名は電子署名の一つであって、電子署名=デジタル署名ではなくデジタル署名⊂電子署名である
参考
デジタル署名とは?デジタル署名の仕組み・メリット・電子署名との違いを比較して解説 | クラウドサイン
ソフトウェアのセキュリティ
セキュアコーディング
-
セキュアコーディング(攻撃に備えた防御プログラムを書くこと)により対策すること
- SQLインジェクション:SQL文をフォームに入力してDBを操作
- コマンドインジェクション:コマンドをフォームに入力してコンピュータを操作。SQLインジェクションよりさらに広い範囲が攻撃対象となる。
- パラメータ改ざん:URLのパラメータを変更して攻撃
-
セキュアコーディングのための10の原則
- 適切なバリデーションを行う
- コンパイラの警告を確認する
- セキュリティポリシーを実装
- 設計はシンプルを心がける
- デフォルトで拒否する:アクセスを許可した人以外を全員拒否する
- 最小限の権限で:目的に必要な最低限の権限のみを与える
- サニタイズ処理:「&」等の特殊文字を一般的な文字に変換する。SQLコマンドやシェルコマンド等の入力は基本的に拒否できる
- 多層防御:入り口、内部、出口の三階層で、それぞれの観点からセキュリティ対策を実施して幅広い攻撃をカバー
- 品質保証技術を使用:外部のソースコード監査や脆弱性診断
- セキュアコーディング標準を採用:企業独自の規約を作る
Top 10 Secure Coding Practices - CERT Secure Coding - Confluence
-
セキュアなエラーハンドリング
- 攻撃者はエラー情報から内部の設計等を理解することができる
- スタックトレースやその他内部エラーの詳細を返さない
- 詳細なエラーメッセージを表示しない:状況に応じて異なるエラーを返しすぎると攻撃者の侵入を許してしまう(特に認証まわり)
- エラーログを適切に管理する:エラーメッセージはログに保存するが、機密情報を含む可能性があるため適切なセキュリティ対策を講じておく
- フェイルセキュア:システムに問題が生じた時、デフォルトで安全な状態にする
-
セッション管理
- ユーザーがログインしている間、そのユーザーを一意に識別するセッションIDの生成・保管を適切に行う
- 生成:ランダムで予測不可能かつ新たなログインの度に新しいIDを発行する
- 保管:一般的にはcookieに保存するが、cookieの設定を適切に行う
- secure属性:HTTPS通信でのみ送信を許可
- HttpOnly:JavaScriptからのアクセスを禁止する
- 適切なスコープの設定:ドメインやパスの制限
- セッションハイジャック攻撃を防御するため、上記のようにセッションIDを適切に保護する+有効期限を設ける、異常なアクティビティ(異常なログイン試行等)を検出するシステムの導入等を行う
- ユーザーがログインしている間、そのユーザーを一意に識別するセッションIDの生成・保管を適切に行う
-
XSSやCSRF等への理解と対策を行う
コードレビュー
- 一般的なセキュリティ対策に従っているか確認
- 入力の検証、エンコーディング、適切なエラーハンドリング、最小権限の原則等
- 具体的な攻撃手法からの防御が行われているか
- コードの設計・構造がセキュリティ確保のため適切であるか(機密情報の管理や認証認可のメカニズム等)
- 静的/動的分析ツールを利用
- コードのセキュリティ上の問題を自動的に検出できる。ツールは特定の問題を検出することに強いが、全体的な問題や特定のビジネスロジックに関連する問題の検出は難しいため、人的なレビューの補完として利用する
- レビュープロセスを明確にする
まとめ
セキュリティに関する必要な知識はここにまとめたこと以外にまだまだ多くあると思います。調べながら深掘りしたり内容に含んだりすることを省略した概念もいくつかありました。大前提として少なくとも知らないと実装はできないので自分の脳内にインデックスを作ることを継続し、機を見て深掘りしていきたいです。また限られた時間の中でセキュリティ対策を行う難しさもありますが、実装スピードを上げるためにもインデックスを広げること、時々深掘りすることを継続できればと思います。
Discussion