Skip to content

セキュリティ概要

環境変数には機密情報が格納されることが多く、安全な取り扱いが極めて重要です。このドキュメントでは、env ライブラリのセキュリティアーキテクチャとコア機能の概要を説明します。

セキュリティアーキテクチャ

text
┌──────────────────────────────────────────────────────────────┐
│                          アプリケーション層                      │
├──────────────────────────────────────────────────────────────┤
│   SecureValue   │    マスク    │    ゼロクリア    │   メモリロック        │
├──────────────────────────────────────────────────────────────┤
│                          Loader 層                            │
├──────────────────────────────────────────────────────────────┤
│     キー検証      │   値検証   │   禁止キー   │   サイズ制限         │
├──────────────────────────────────────────────────────────────┤
│                          解析層                              │
├──────────────────────────────────────────────────────────────┤
│    フォーマット検出     │  展開チェック  │       パス検証                  │
└──────────────────────────────────────────────────────────────┘

コアセキュリティ機能

機能説明ドキュメント
SecureValue機密値のメモリ保護、自動ゼロクリアSecureValue API
禁止キーシステム重要変数の変更を防止定数とエラー
機密キー検出機密設定キーの自動識別定数とエラー
値検証制御文字、ヌルバイトなどの検出Config API
監査ログ完全な操作追跡コンポーネントファクトリー

SecureValue の紹介

機密データの場合、GetString ではなく GetSecure を使用します:

go
// 非推奨
password := env.GetString("DB_PASSWORD")

// 推奨
secret := env.GetSecure("DB_PASSWORD")
defer secret.Close()
password := secret.Reveal()  // 平文が必要な場合のみ呼び出し

コア機能:

  • メモリロック - ディスクへのスワップを防止(Linux/macOS/Windows/FreeBSD)
  • 自動ゼロクリア - Close() 時にメモリを安全に消去
  • マスク表示 - Masked() はログ出力に使用
  • スレッドセーフ - 並行読み取りをサポート

完全な API

詳細は SecureValue API を参照してください。

キー/値検証

キー検証

デフォルトのキー名ルール:^[A-Za-z][A-Za-z0-9_]*$

  • アルファベットで始まる
  • アルファベット、数字、アンダースコアのみ含む
  • 長さは MaxKeyLength を超えない

禁止キー

組み込み禁止キーにより、システム重要変数の変更を防止します:

カテゴリリスク
システムパスPATH, LD_LIBRARY_PATHコマンド/ライブラリハイジャック
動的リンクLD_PRELOAD, DYLD_INSERT_LIBRARIES悪意あるライブラリの注入
ShellSHELL, IFS, BASH_ENVShell ハイジャック
言語ランタイムPYTHONPATH, NODE_PATHモジュールハイジャック

完全なリスト

完全な禁止キーリストについては DefaultForbiddenKeys を参照してください。

値検証

値検証を有効にすると、潜在的な危険を検出します:

go
cfg := env.ProductionConfig()
cfg.ValidateValues = true  // 制御文字、ヌルバイトなどを検出

ファイルセキュリティの基礎

ファイル権限

bash
# 所有者のみ読み書き可能
chmod 600 .env

# またはより厳格に(読み取り専用)
chmod 400 .env

Git で無視

bash
.env
.env.local
.env.*.local
*.pem
*.key

設定セキュリティレベル

プリセット用途特徴
DevelopmentConfig()開発環境緩やかな制限、YAML 構文サポート
TestingConfig()テスト環境既存変数の上書き、テスト分離
ProductionConfig()本番環境厳格な検証 + 監査ログ、既存変数の上書きなし
go
// 本番環境の推奨設定
cfg := env.ProductionConfig()
cfg.RequiredKeys = []string{"DB_HOST", "API_KEY"}
cfg.AllowedKeys = []string{"APP_NAME", "PORT", "DB_HOST", "API_KEY"}

関連ドキュメント