Open2

nginxのgcc周りのオプションについて

catatsuycatatsuy
Ubuntu
  --with-cc-opt='-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fPIC -Wdate-time -D_FORTIFY_SOURCE=3 -march=native -mtune=native' \
  --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC -Wl,--as-needed -Wl,-O1' \

Debian
  --with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-AoTv4W/nginx-1.22.1=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \
  --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' \

for perfomance
  --with-cc-opt='-O3 -march=native -mtune=native -flto -ffat-lto-objects -fno-stack-protector -fomit-frame-pointer' \
  --with-ld-opt='-flto -fomit-frame-pointer' \

for security
  --with-cc-opt='-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=3 -fPIE -fstack-clash-protection -Wformat -Werror=format-security -Wl,-z,relro -Wl,-z,now' \
  --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \
catatsuycatatsuy

ChatGPTの解説

各設定の解説は以下の通りです:

Ubuntu向けのコンパイルオプション

--with-cc-opt='-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fPIC -Wdate-time -D_FORTIFY_SOURCE=3 -march=native -mtune=native'
--with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC -Wl,--as-needed -Wl,-O1'
  • -g: デバッグ情報を含め、トラブルシューティングを容易にします。
  • -O2: 最適化レベル2で、パフォーマンスを向上させます。
  • -fno-omit-frame-pointer-mno-omit-leaf-frame-pointer: フレームポインタを保持し、デバッグやプロファイリングを支援します。
  • -ffile-prefix-map: ビルド時のパス情報をデバッグシンボルに短縮して記録します。
  • -flto=auto-ffat-lto-objects: リンクタイム最適化(LTO)により、プログラム全体で最適化します。
  • -fstack-protector-strong-fstack-clash-protection: スタック保護を強化し、バッファオーバーフローから保護します。
  • -Wformat -Werror=format-security: フォーマット文字列の誤りを検出し、攻撃を防ぎます。
  • -fcf-protection: コントロールフロー保護により、メモリ保護を強化します。
  • -fPIC: 位置独立コードにより、共有ライブラリとしての使用が可能になります。
  • -D_FORTIFY_SOURCE=3: メモリ操作の安全性を高めます(最高レベル)。
  • -march=native-mtune=native: 実行環境に最適化し、パフォーマンスを向上させます。

Debian向けのコンパイルオプション

--with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-AoTv4W/nginx-1.22.1=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2'
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC'
  • -D_FORTIFY_SOURCE=2: Ubuntuの=3よりも緩やかで、メモリ操作の基本的な安全性を提供します。
  • -fstack-protector-strong: バッファオーバーフロー保護を有効にしていますが、Ubuntuに比べて他のセキュリティフラグは少ないです。
  • -fPIC: 位置独立コードで共有ライブラリとしての使用が可能です。
  • -Wl,-z,relro -Wl,-z,now: 実行時にメモリ保護を有効にし、セキュリティを向上させます。

パフォーマンス重視の設定

--with-cc-opt='-O3 -march=native -mtune=native -flto -ffat-lto-objects -fno-stack-protector -fomit-frame-pointer'
--with-ld-opt='-flto -fomit-frame-pointer'
  • -O3: 最も高いレベルの最適化を行い、パフォーマンスを最大限に引き出しますが、バイナリサイズが大きくなる可能性があります。
  • -march=native-mtune=native: 実行環境のCPUアーキテクチャに特化した最適化を行います。
  • -flto-ffat-lto-objects: リンクタイム最適化により関数間の最適化を可能にします。
  • -fno-stack-protector: スタック保護を無効にしてパフォーマンスを向上させますが、セキュリティが低下します。
  • -fomit-frame-pointer: デバッグ機能を省略し、パフォーマンスをさらに向上させます。

セキュリティ重視の設定

--with-cc-opt='-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=3 -fPIE -fstack-clash-protection -Wformat -Werror=format-security -Wl,-z,relro -Wl,-z,now'
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
  • -fstack-protector-strong-fstack-clash-protection: スタック関連のセキュリティを強化します。
  • -D_FORTIFY_SOURCE=3: メモリ操作を厳格にチェックし、バッファオーバーフローなどを防ぎます。
  • -fPIE-pie: 位置独立実行ファイルでASLRを有効にし、攻撃耐性を高めます。
  • -Wl,-z,relro-Wl,-z,now: 実行時メモリ保護を強化し、攻撃者がシェルコードを挿入するリスクを低減します。

比較と選択

  • UbuntuとDebianの設定は、セキュリティとパフォーマンスのバランスが取れた構成です。Ubuntuは若干強化されたセキュリティと最適化が含まれ、Debianはやや控えめです。
  • パフォーマンス重視の設定はセキュリティを犠牲にしており、特定の安全な環境下や内部システムでの利用が適しています。
  • セキュリティ重視の設定はパフォーマンスを若干犠牲にしても、公開サーバーなどの攻撃耐性を強化する環境に適しています。

セキュリティ対策が求められる公開環境にはセキュリティ重視設定が推奨されますが、特定用途であればパフォーマンス重視の設定も検討可能です。