1833 lines
No EOL
52 KiB
HTML
1833 lines
No EOL
52 KiB
HTML
|
|
|
|
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
|
|
<link rel="canonical" href="https://kubernetes.github.io/ingress-nginx/deploy/hardening-guide/">
|
|
|
|
|
|
<link rel="shortcut icon" href="../../assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-5.5.12">
|
|
|
|
|
|
|
|
<title>Hardening guide - NGINX Ingress Controller</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/main.4dd2dd8d.min.css">
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/palette.6a5ad368.min.css">
|
|
|
|
|
|
|
|
|
|
<meta name="theme-color" content="#009485">
|
|
|
|
|
|
|
|
|
|
|
|
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
|
|
<style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../../extra.css">
|
|
|
|
|
|
|
|
|
|
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-118407822-1","kubernetes.github.io"),ga("set","anonymizeIp",!0),ga("send","pageview"),document.addEventListener("DOMContentLoaded",function(){document.forms.search&&document.forms.search.query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}),document.addEventListener("DOMContentSwitch",function(){ga("send","pageview",document.location.pathname)})</script>
|
|
<script async src="https://www.google-analytics.com/analytics.js"></script>
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="green">
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#hardening-guide" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
<header class="md-header" data-md-component="header">
|
|
<nav class="md-header-nav md-grid" aria-label="Header">
|
|
<a href="https://kubernetes.github.io/ingress-nginx" title="NGINX Ingress Controller" class="md-header-nav__button md-logo" aria-label="NGINX Ingress Controller">
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg>
|
|
|
|
</a>
|
|
<label class="md-header-nav__button md-icon" for="__drawer">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
|
|
</label>
|
|
<div class="md-header-nav__title" data-md-component="header-title">
|
|
|
|
<div class="md-header-nav__ellipsis">
|
|
<span class="md-header-nav__topic md-ellipsis">
|
|
NGINX Ingress Controller
|
|
</span>
|
|
<span class="md-header-nav__topic md-ellipsis">
|
|
|
|
Hardening guide
|
|
|
|
</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<label class="md-header-nav__button md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
</label>
|
|
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</label>
|
|
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
|
|
</button>
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-header-nav__source">
|
|
|
|
<a href="https://github.com/kubernetes/ingress-nginx/" title="Go to repository" class="md-source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
kubernetes/ingress-nginx
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<nav class="md-tabs md-tabs--active" aria-label="Tabs" data-md-component="tabs">
|
|
<div class="md-tabs__inner md-grid">
|
|
<ul class="md-tabs__list">
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
|
|
<a href="../.." class="md-tabs__link">
|
|
Welcome
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
|
|
<a href="../" class="md-tabs__link md-tabs__link--active">
|
|
Deployment
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
|
|
<a href="../../user-guide/nginx-configuration/" class="md-tabs__link">
|
|
User guide
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
|
|
<a href="../../examples/" class="md-tabs__link">
|
|
Examples
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href="https://kubernetes.github.io/ingress-nginx" title="NGINX Ingress Controller" class="md-nav__button md-logo" aria-label="NGINX Ingress Controller">
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"/></svg>
|
|
|
|
</a>
|
|
NGINX Ingress Controller
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
|
|
<a href="https://github.com/kubernetes/ingress-nginx/" title="Go to repository" class="md-source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
kubernetes/ingress-nginx
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-1" type="checkbox" id="nav-1">
|
|
|
|
<label class="md-nav__link" for="nav-1">
|
|
Welcome
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Welcome" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-1">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Welcome
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../.." title="Welcome" class="md-nav__link">
|
|
Welcome
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../how-it-works/" title="How it works" class="md-nav__link">
|
|
How it works
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../troubleshooting/" title="Troubleshooting" class="md-nav__link">
|
|
Troubleshooting
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../kubectl-plugin/" title="kubectl plugin" class="md-nav__link">
|
|
kubectl plugin
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../development/" title="Development" class="md-nav__link">
|
|
Development
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
|
|
|
|
<label class="md-nav__link" for="nav-2">
|
|
Deployment
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Deployment" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-2">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Deployment
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../" title="Installation Guide" class="md-nav__link">
|
|
Installation Guide
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../baremetal/" title="Bare-metal considerations" class="md-nav__link">
|
|
Bare-metal considerations
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../rbac/" title="Role Based Access Control (RBAC)" class="md-nav__link">
|
|
Role Based Access Control (RBAC)
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../upgrade/" title="Upgrade" class="md-nav__link">
|
|
Upgrade
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
Hardening guide
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" title="Hardening guide" class="md-nav__link md-nav__link--active">
|
|
Hardening guide
|
|
</a>
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#overview" class="md-nav__link">
|
|
Overview
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#configuration-guide" class="md-nav__link">
|
|
Configuration Guide
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
|
|
|
|
<label class="md-nav__link" for="nav-3">
|
|
User guide
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="User guide" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-3">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
User guide
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-1" type="checkbox" id="nav-3-1">
|
|
|
|
<label class="md-nav__link" for="nav-3-1">
|
|
NGINX Configuration
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="NGINX Configuration" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-3-1">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
NGINX Configuration
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/nginx-configuration/" title="Introduction" class="md-nav__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/basic-usage/" title="Basic usage" class="md-nav__link">
|
|
Basic usage
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/nginx-configuration/annotations/" title="Annotations" class="md-nav__link">
|
|
Annotations
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/nginx-configuration/configmap/" title="ConfigMap" class="md-nav__link">
|
|
ConfigMap
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/nginx-configuration/custom-template/" title="Custom NGINX template" class="md-nav__link">
|
|
Custom NGINX template
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/nginx-configuration/log-format/" title="Log format" class="md-nav__link">
|
|
Log format
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/cli-arguments/" title="Command line arguments" class="md-nav__link">
|
|
Command line arguments
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/custom-errors/" title="Custom errors" class="md-nav__link">
|
|
Custom errors
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/default-backend/" title="Default backend" class="md-nav__link">
|
|
Default backend
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/exposing-tcp-udp-services/" title="Exposing TCP and UDP services" class="md-nav__link">
|
|
Exposing TCP and UDP services
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/fcgi-services/" title="Exposing FCGI services" class="md-nav__link">
|
|
Exposing FCGI services
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/ingress-path-matching/" title="Regular expressions in paths" class="md-nav__link">
|
|
Regular expressions in paths
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/external-articles/" title="External Articles" class="md-nav__link">
|
|
External Articles
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/miscellaneous/" title="Miscellaneous" class="md-nav__link">
|
|
Miscellaneous
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/monitoring/" title="Prometheus and Grafana installation" class="md-nav__link">
|
|
Prometheus and Grafana installation
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/multiple-ingress/" title="Multiple Ingress controllers" class="md-nav__link">
|
|
Multiple Ingress controllers
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/tls/" title="TLS/HTTPS" class="md-nav__link">
|
|
TLS/HTTPS
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-13" type="checkbox" id="nav-3-13">
|
|
|
|
<label class="md-nav__link" for="nav-3-13">
|
|
Third party addons
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Third party addons" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-3-13">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Third party addons
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/third-party-addons/modsecurity/" title="ModSecurity Web Application Firewall" class="md-nav__link">
|
|
ModSecurity Web Application Firewall
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../user-guide/third-party-addons/opentracing/" title="OpenTracing" class="md-nav__link">
|
|
OpenTracing
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
|
|
|
|
<label class="md-nav__link" for="nav-4">
|
|
Examples
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Examples" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-4">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Examples
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/" title="Introduction" class="md-nav__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/PREREQUISITES/" title="Prerequisites" class="md-nav__link">
|
|
Prerequisites
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/affinity/cookie/" title="Sticky Sessions" class="md-nav__link">
|
|
Sticky Sessions
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4-4" type="checkbox" id="nav-4-4">
|
|
|
|
<label class="md-nav__link" for="nav-4-4">
|
|
Auth
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Auth" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-4-4">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Auth
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/auth/basic/" title="Basic Authentication" class="md-nav__link">
|
|
Basic Authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/auth/client-certs/" title="Client Certificate Authentication" class="md-nav__link">
|
|
Client Certificate Authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/auth/external-auth/" title="External Basic Authentication" class="md-nav__link">
|
|
External Basic Authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/auth/oauth-external-auth/" title="External OAUTH Authentication" class="md-nav__link">
|
|
External OAUTH Authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4-5" type="checkbox" id="nav-4-5">
|
|
|
|
<label class="md-nav__link" for="nav-4-5">
|
|
Customization
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Customization" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-4-5">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Customization
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/configuration-snippets/" title="Configuration Snippets" class="md-nav__link">
|
|
Configuration Snippets
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/custom-configuration/" title="Custom Configuration" class="md-nav__link">
|
|
Custom Configuration
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/custom-errors/" title="Custom Errors" class="md-nav__link">
|
|
Custom Errors
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/custom-headers/" title="Custom Headers" class="md-nav__link">
|
|
Custom Headers
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/external-auth-headers/" title="External authentication" class="md-nav__link">
|
|
External authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/ssl-dh-param/" title="Custom DH parameters for perfect forward secrecy" class="md-nav__link">
|
|
Custom DH parameters for perfect forward secrecy
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/customization/sysctl/" title="Sysctl tuning" class="md-nav__link">
|
|
Sysctl tuning
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/docker-registry/" title="Docker registry" class="md-nav__link">
|
|
Docker registry
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/grpc/" title="gRPC" class="md-nav__link">
|
|
gRPC
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/multi-tls/" title="Multi TLS certificate termination" class="md-nav__link">
|
|
Multi TLS certificate termination
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/rewrite/" title="Rewrite" class="md-nav__link">
|
|
Rewrite
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/static-ip/" title="Static IPs" class="md-nav__link">
|
|
Static IPs
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/tls-termination/" title="TLS termination" class="md-nav__link">
|
|
TLS termination
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../examples/psp/" title="Pod Security Policy (PSP)" class="md-nav__link">
|
|
Pod Security Policy (PSP)
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#overview" class="md-nav__link">
|
|
Overview
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#configuration-guide" class="md-nav__link">
|
|
Configuration Guide
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
<a href="https://github.com/kubernetes/ingress-nginx/edit/master/docs/deploy/hardening-guide.md" title="Edit this page" class="md-content__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
<h1 id="hardening-guide">Hardening Guide<a class="headerlink" href="#hardening-guide" title="Permanent link"> ¶</a></h1>
|
|
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link"> ¶</a></h2>
|
|
<p>There are several ways to do hardening and securing of nginx. In this documentation two guides are used, the guides are
|
|
overlapping in some points:</p>
|
|
<ul>
|
|
<li><a href="https://www.cisecurity.org/benchmark/nginx/">nginx CIS Benchmark</a></li>
|
|
<li><a href="https://cipherlist.eu/">cipherlist.eu</a> (one of many forks of the now dead project cipherli.st)</li>
|
|
</ul>
|
|
<p>This guide describes, what of the different configurations described in those guides is already implemented as default
|
|
in the nginx implementation of kubernetes ingress, what needs to be configured, what is obsolete due to the fact that
|
|
the nginx is running as container (the CIS benchmark relates to a non-containerized installation) and what is difficult
|
|
or not possible.</p>
|
|
<p>Be aware that this is only a guide and you are responsible for your own implementation. Some of the configurations may
|
|
lead to have specific clients unable to reach your site or similar consequences.</p>
|
|
<p>This guide refers to chapters in the CIS Benchmark. For full explanation you should refer to the benchmark document itself</p>
|
|
<h2 id="configuration-guide">Configuration Guide<a class="headerlink" href="#configuration-guide" title="Permanent link"> ¶</a></h2>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th align="left">Chapter in CIS benchmark</th>
|
|
<th align="left">Status</th>
|
|
<th align="left">Default</th>
|
|
<th align="left">Action to do if not default</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td align="left"><strong>1 Initial Setup</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>1.1 Installation</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">1.1.1 Ensure NGINX is installed (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">done through helm charts / following documentation to deploy nginx ingress</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">1.1.2 Ensure NGINX is installed from source (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">done through helm charts / following documentation to deploy nginx ingress</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>1.2 Configure Software Updates</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">1.2.1 Ensure package manager repositories are properly configured (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">done via helm, nginx version could be overwritten, however compability is not ensured then</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">1.2.2 Ensure the latest software package is installed (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">done via helm, nginx version could be overwritten, however compability is not ensured then</td>
|
|
<td align="left">Plan for periodic updates</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2 Basic Configuration</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2.1 Minimize NGINX Modules</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.1.1 Ensure only required modules are installed (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Already only needed modules are installed, however proposals for further reduction are welcome</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.1.2 Ensure HTTP WebDAV module is not installed (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.1.3 Ensure modules with gzip functionality are disabled (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.1.4 Ensure the autoindex module is disabled (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">No autoindex configs so far in ingress defaults</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2.2 Account Security</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.2.1 Ensure that NGINX is run using a non-privileged, dedicated service account (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Pod configured as user www-data: <a href="https://github.com/kubernetes/ingress-nginx/blob/0cbe783f43a9313c9c26136e888324b1ee91a72f/charts/ingress-nginx/values.yaml#L10">See this line in helm chart values</a>. Compiled with user www-data: <a href="https://github.com/kubernetes/ingress-nginx/blob/5d67794f4fbf38ec6575476de46201b068eabf87/images/nginx/rootfs/build.sh#L529">See this line in build script</a></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.2.2 Ensure the NGINX service account is locked (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Docker design ensures this</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.2.3 Ensure the NGINX service account has an invalid shell (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Shell is nologin: <a href="https://github.com/kubernetes/ingress-nginx/blob/5d67794f4fbf38ec6575476de46201b068eabf87/images/nginx/rootfs/build.sh#L613">see this line in build script</a></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2.3 Permissions and Ownership</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.3.1 Ensure NGINX directories and files are owned by root (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Obsolete through docker-design and ingress controller needs to update the configs dynamically</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.3.2 Ensure access to NGINX directories and files is restricted (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.3.3 Ensure the NGINX process ID (PID) file is secured (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">No PID-File due to docker design</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.3.4 Ensure the core dump directory is secured (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">No working_directory configured by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2.4 Network Configuration</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.4.1 Ensure NGINX only listens for network connections on authorized ports (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Ensured by automatic nginx.conf configuration</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.4.2 Ensure requests for unknown host names are rejected (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">They are not rejected but send to the "default backend" delivering approriate errors (mostly 404)</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.4.3 Ensure keepalive_timeout is 10 seconds or less, but not 0 (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Default is 75s</td>
|
|
<td align="left">configure keep-alive to 10 seconds <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#keep-alive">according to this documentation</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.4.4 Ensure send_timeout is set to 10 seconds or less, but not 0 (Scored)</td>
|
|
<td align="left">RISK TO BE ACCEPTED</td>
|
|
<td align="left">Not configured, however the nginx default is 60s</td>
|
|
<td align="left">Not configurable</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>2.5 Information Disclosure</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.5.1 Ensure server_tokens directive is set to <code>off</code> (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">server_tokens is configured to off by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.5.2 Ensure default error and index.html pages do not reference NGINX (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">404 shows no version at all, 503 and 403 show "nginx", which is hardcoded <a href="https://github.com/nginx/nginx/blob/master/src/http/ngx_http_special_response.c#L36">see this line in nginx source code</a></td>
|
|
<td align="left">configure custom error pages at least for 403, 404 and 503 and 500</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.5.3 Ensure hidden file serving is disabled (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">config not set</td>
|
|
<td align="left">configure a config.server-snippet Snippet, but beware of .well-known challenges or similar. Refer to the benchmark here please</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">2.5.4 Ensure the NGINX reverse proxy does not enable information disclosure (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">hide not configured</td>
|
|
<td align="left">configure hide-headers with array of "X-Powered-By" and "Server": <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#hide-headers">according to this documentation</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>3 Logging</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.1 Ensure detailed logging is enabled (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">nginx ingress has a very detailed log format by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.2 Ensure access logging is enabled (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Access log is enabled by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.3 Ensure error logging is enabled and set to the info logging level (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Error log is configured by default. The log level does not matter, because it is all sent to STDOUT anyway</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.4 Ensure log files are rotated (Scored)</td>
|
|
<td align="left">OBSOLETE</td>
|
|
<td align="left">Log file handling is not part of the nginx ingress and should be handled separatly</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.5 Ensure error logs are sent to a remote syslog server (Not Scored)</td>
|
|
<td align="left">OBSOLETE</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.6 Ensure access logs are sent to a remote syslog server (Not Scored)</td>
|
|
<td align="left">OBSOLETE</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">3.7 Ensure proxies pass source IP information (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Headers are set by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>4 Encryption</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>4.1 TLS / SSL Configuration</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.1 Ensure HTTP is redirected to HTTPS (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Redirect to TLS is default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.2 Ensure a trusted certificate and trust chain is installed (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">For installing certs there are enough manuals in the web. A good way is to use lets encrypt through cert-manager</td>
|
|
<td align="left">Install proper certificates or use lets encrypt with cert-manager</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.3 Ensure private key permissions are restricted (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.4 Ensure only modern TLS protocols are used (Scored)</td>
|
|
<td align="left">OK/ACTION NEEDED</td>
|
|
<td align="left">Default is TLS 1.2 + 1.3, while this is okay for CIS Benchmark, cipherlist.eu only recommends 1.3. This may cut off old OS's</td>
|
|
<td align="left">Set controller.config.ssl-protocols to "TLSv1.3"</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.5 Disable weak ciphers (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Default ciphers are already good, but cipherlist.eu recommends even stronger ciphers</td>
|
|
<td align="left">Set controller.config.ssl-ciphers to "EECDH+AESGCM:EDH+AESGCM"</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.6 Ensure custom Diffie-Hellman parameters are used (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">No custom DH parameters are generated</td>
|
|
<td align="left">Generate dh parameters for each ingress deployment you use - <a href="https://kubernetes.github.io/ingress-nginx/examples/customization/ssl-dh-param/">see here for a how to</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.7 Ensure Online Certificate Status Protocol (OCSP) stapling is enabled (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Not enabled</td>
|
|
<td align="left">set via <a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#enable-ocsp">this configuration parameter</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.8 Ensure HTTP Strict Transport Security (HSTS) is enabled (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">HSTS is enabled by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.9 Ensure HTTP Public Key Pinning is enabled (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED / RISK TO BE ACCEPTED</td>
|
|
<td align="left">HKPK not enabled by default</td>
|
|
<td align="left">If lets encrypt is not used, set correct HPKP header. There are several ways to implement this - with the helm charts it works via controller.add-headers. If lets encrypt is used, this is complicated, a solution here is yet unknown</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.10 Ensure upstream server traffic is authenticated with a client certificate (Scored)</td>
|
|
<td align="left">DEPENDS ON BACKEND</td>
|
|
<td align="left">Highly dependend on backends, not every backend allows configuring this, can also be mitigated via a service mesh</td>
|
|
<td align="left">If backend allows it, <a href="https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/">manual is here</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.11 Ensure the upstream traffic server certificate is trusted (Not Scored)</td>
|
|
<td align="left">DEPENDS ON BACKEND</td>
|
|
<td align="left">Highly dependend on backends, not every backend allows configuring this, can also be mitigated via a service mesh</td>
|
|
<td align="left">If backend allows it, <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#backend-certificate-authentication">see configuration here</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.12 Ensure your domain is preloaded (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Preload is not active by default</td>
|
|
<td align="left">Set controller.config.hsts-preload to true</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.13 Ensure session resumption is disabled to enable perfect forward security (Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">Session tickets are disabled by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">4.1.14 Ensure HTTP/2.0 is used (Not Scored)</td>
|
|
<td align="left">OK</td>
|
|
<td align="left">http2 is set by default</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>5 Request Filtering and Restrictions</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>5.1 Access Control</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.1.1 Ensure allow and deny filters limit access to specific IP addresses (Not Scored)</td>
|
|
<td align="left">OK/ACTION NEEDED</td>
|
|
<td align="left">Depends on use case, geo ip module is compiled into nginx ingress controller, there are several ways to use it</td>
|
|
<td align="left">If needed set IP restrictions via annotations or work with config snippets (be careful with lets-encrypt-http-challenge!)</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.1.2 Ensure only whitelisted HTTP methods are allowed (Not Scored)</td>
|
|
<td align="left">OK/ACTION NEEDED</td>
|
|
<td align="left">Depends on use case</td>
|
|
<td align="left">If required it can be set via config snippet</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>5.2 Request Limits</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.2.1 Ensure timeout values for reading the client header and body are set correctly (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Default timeout is 60s</td>
|
|
<td align="left">Set via <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#client-header-timeout">this configuration parameter</a> and respective body aequivalent</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.2.2 Ensure the maximum request body size is set correctly (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Default is 1m</td>
|
|
<td align="left">set via <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#proxy-body-size">this configuration parameter</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.2.3 Ensure the maximum buffer size for URIs is defined (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Default is 4 8k</td>
|
|
<td align="left">Set via <a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#large-client-header-buffers">this configuration parameter</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.2.4 Ensure the number of connections per IP address is limited (Not Scored)</td>
|
|
<td align="left">OK/ACTION NEEDED</td>
|
|
<td align="left">No limit set</td>
|
|
<td align="left">Depends on use case, limit can be set via <a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting">these annotations</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.2.5 Ensure rate limits by IP address are set (Not Scored)</td>
|
|
<td align="left">OK/ACTION NEEDED</td>
|
|
<td align="left">No limit set</td>
|
|
<td align="left">Depends on use case, limit can be set via <a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting">these annotations</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>5.3 Browser Security</strong></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.3.1 Ensure X-Frame-Options header is configured and enabled (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Header not set by default</td>
|
|
<td align="left">Several ways to implement this - with the helm charts it works via controller.add-headers</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.3.2 Ensure X-Content-Type-Options header is configured and enabled (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left">See previous answer</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.3.3 Ensure the X-XSS-Protection Header is enabled and configured properly (Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left">See previous answer</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.3.4 Ensure that Content Security Policy (CSP) is enabled and configured properly (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">See previous answer</td>
|
|
<td align="left">See previous answer</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left">5.3.5 Ensure the Referrer Policy is enabled and configured properly (Not Scored)</td>
|
|
<td align="left">ACTION NEEDED</td>
|
|
<td align="left">Depends on application. It should be handled in the applications webserver itself, not in the load balancing ingress</td>
|
|
<td align="left">check backend webserver</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left"><strong>6 Mandatory Access Control</strong></td>
|
|
<td align="left">n/a</td>
|
|
<td align="left">too high level, depends on backends</td>
|
|
<td align="left"></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<style type="text/css" rel="stylesheet">
|
|
@media only screen and (min-width: 768px) {
|
|
td:nth-child(1){
|
|
white-space:normal !important;
|
|
}
|
|
|
|
.md-typeset table:not([class]) td {
|
|
padding: .2rem .3rem;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-nav">
|
|
<nav class="md-footer-nav__inner md-grid" aria-label="Footer">
|
|
|
|
<a href="../upgrade/" title="Upgrade" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
|
<div class="md-footer-nav__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</div>
|
|
<div class="md-footer-nav__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Previous
|
|
</span>
|
|
Upgrade
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
<a href="../../user-guide/nginx-configuration/" title="Introduction" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
|
|
<div class="md-footer-nav__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Next
|
|
</span>
|
|
Introduction
|
|
</div>
|
|
</div>
|
|
<div class="md-footer-nav__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
|
|
</div>
|
|
</a>
|
|
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-footer-copyright">
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
<script src="../../assets/javascripts/vendor.3636a4ec.min.js"></script>
|
|
<script src="../../assets/javascripts/bundle.e9fe3281.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents"}</script>
|
|
|
|
<script>
|
|
app = initialize({
|
|
base: "../..",
|
|
features: ["tabs", "instant"],
|
|
search: Object.assign({
|
|
worker: "../../assets/javascripts/worker/search.5eca75d3.min.js"
|
|
}, typeof search !== "undefined" && search)
|
|
})
|
|
</script>
|
|
|
|
|
|
</body>
|
|
</html> |