README
¶
システム構成
セキュリティを保つ上で、常に最新の状態に保つことは必須です。このことを念頭に置いて、開発者は Go を常に最新版に更新し、Web アプリケーションで使用する外部パッケージや フレームワークも最新のものに更新しておく必要があります。
Go では、サーバーへのリクエストはすべて HTTP/1.1 か HTTP/2 で行われることを知っておく必要があります。
req, _ := http.NewRequest("POST", url, buffer)
req.Proto = "HTTP/1.0"
Proto は無視され、HTTP/1.1 によるリクエストとなります。
ディレクトリの一覧表示
開発者がディレクトリ一覧表示(OWASP では Directory Indexing と呼ぶ)を無効にするのを忘れた場合、攻撃者はディレクトリ内を移動して機密ファイルをチェックできてしまいます。
Go Web サーバーアプリケーションを動かしているなら、この点にも注意する必要があります。
http.ListenAndServe(":8080", http.FileServer(http.Dir("/tmp/static")))
localhost:8080
にアクセスすると index.html
が開かれます。しかし機密データの入ったテストディレクトリだった場合、何が起こるでしょうか?
なぜこのようなことが起こるのでしょうか?
Go はディレクトリの中にある index.html
を探そうとします。
が存在しない場合、ディレクトリのリストを表示します。
これに対して 3 つの解決策があります。
- Web アプリケーションでディレクトリのリストを表示しないようにする。
- 不要なディレクトリやファイルへのアクセスを制限する。
- 各ディレクトリにインデックスファイルを作成する
本ガイドでは、ディレクトリの一覧表示を無効にする方法を説明します。 まず、リクエストされたパスをチェックし、表示可能かどうかを確認する関数を作成します。
type justFilesFilesystem struct {
fs http.FileSystem
}
func (fs justFilesFilesystem) Open(name string) (http.File, error) {
f, err := fs.fs.Open(name)
if err != nil {
return nil, err
}
return neuteredReaddirFile{f}, nil
}
そして、次のように http.ListenAndServe
に対して使用するだけです。
fs := justFilesFilesystem{http.Dir("tmp/static/")}
http.ListenAndServe(":8080", http.StripPrefix("/tmp/static", http.FileServer(fs)))
このアプリケーションでは、tmp/static/
のパスだけ閲覧を許可していることに注意してください。
保護されたファイルに直接アクセスしようとすると、次のようになります。
また、test/
フォルダに対してディレクトリリスティングしようしても、同じエラーが表示されます。
不要なものの削除/無効化
本番環境では、不要な機能およびファイルをすべて削除してください。 (本番環境へ移行する)最終バージョンで必要とされないテストコードや機能は、開発者レイヤにとどめておくべきです。 誰もが見ることのできる場所、つまり公開される場所には置かないようにしましょう。
HTTP レスポンスヘッダもチェックすべきです。以下のような機密情報を開示するヘッダは削除してください。
- OS のバージョン
- Web サーバーのバージョン
- フレームワークやプログラミング言語のバージョン
攻撃者がバージョンの脆弱性を確認するために使用される可能性があるため、削除することをお勧めします。
デフォルトでは、Go によって開示されることはありません。しかし、もしあなたが何らかの外部パッケージやフレームワークを使用している場合は、ダブルチェックを忘れないようにしてください。
以下のようなものを探してみてください。
w.Header().Set("X-Request-With", "Go Vulnerable Framework 1.2")
公開されている HTTP ヘッダのコードを探して、削除できます。
また、Web アプリケーションがサポートする HTTP メソッドを定義できます。 POST と GET しか使わない/受け入れない場合は、CORS を実装して次のようにします。
w.Header().Set("Access-Control-Allow-Methods", "POST, GET")
WebDAV などの無効化は気にする必要はありません。もし WebDAV サーバーを実装したい場合は、パッケージのインポートが必要です。
より良いセキュリティを実現する
セキュリティを考慮し、サーバー、プロセス、およびサービスアカウントについて、最小権限の原則に従いましょう。
Web アプリケーションのエラー処理に気を付けましょう。例外が発生したら、安全に失敗しましょう。このトピックの詳細については、エラー処理とログ記録のセクションを参照してください。
robots.txt
ファイルによってディレクトリ構造が漏れないようにしましょう。
robots.txt
はディレクションファイルであり、セキュリティコントロールではありません。
以下のように、ホワイトリスト方式を採用しましょう。
User-agent: *
Allow: /sitemap.xml
Allow: /index
Allow: /contact
Allow: /aboutus
Disallow: /
上記の例では、ユーザーエージェントや bot に特定のページをインデックスさせ、それ以外を拒否します。これによって、管理者のパスやそのほかの重要なデータなど、機密性の高いフォルダーやページ、つまり管理者パスやそのほかの重要なデータなど、を公開することはありません。
開発環境を本番ネットワークから分離する。開発者とテストグループに は適切なアクセスを提供し、さらに追加のセキュリティレイヤを作成して保護すると良いでしょう。 多くの場合、開発環境の方が攻撃の対象としては容易です。
最後に、非常に重要なことですが、ソフトウェア変更管理システムを導入して Web アプリケーションのコード(開発環境と本番環境)の変更を管理し、記録しましょう。 このために使用できる GitHub のセルフホスティング式クローンが数多く存在します。
資産管理システム
資産管理システムは、Go 固有の問題ではありませんが、その概念と実践の簡単な概要を以下に説明します。
資産管理は、資産が目的に応じて最適なパフォーマンスを達成するために、組織が行う一連の活動が含まれます。 また、各資産に求められるセキュリティレベルを評価することも含まれます。
このセクションで、「資産」という場合、システムの構成要素だけでなくそのソフトウェアについても言及しています。
システム導入の手順は以下の通りです。
- ビジネスにおける情報セキュリティの重要性を確立する。
- AMS の適用範囲を明確にする。
- セキュリティポリシーを定める。
- セキュリティ組織体制を構築する。
- 資産を特定し分類する。
- リスクを特定し評価する。
- リスクマネジメントを計画する。
- リスク軽減戦略を実施する。
- 適用可能性を記述する。
- スタッフを訓練し、セキュリティ意識を向上させる。
- AMS の性能を監視し、見直す。
- AMS を維持し、継続的に改善する。
より詳細な分析は、こちらをご覧ください。