Back to Checks
API server pod has --request-timeout configured
apiserver_request_timeout_set
Service: apiserverSeverity: medium
OfficialBuilt-inVerified
Categories:cluster-securityresilience
Resource Type:Pod
Kubernetes API server has a global request timeout configured via --request-timeout.
The presence of that flag on API server containers is assessed.
Risk
Without a defined, appropriate timeout, requests can linger and tie up handlers, reducing availability. Attackers can perform slowloris-style holds or heavy reads to cause resource exhaustion and backlog growth. Overly short timeouts can cut valid calls, disrupting controllers and clients.
Run this check with Prowler
Run in Prowler CloudRun
prowler kubernetes --checks apiserver_request_timeout_setRecommendation
Set --request-timeout to a bounded value aligned to typical non-watch calls; when needed, tune --min-request-timeout for watches. Combine with priority and fairness, rate limiting, and load testing to prevent starvation. Monitor latency and errors to adjust. Apply defense in depth.
Remediation
Other
1SSH to each control-plane node
2Edit /etc/kubernetes/manifests/kube-apiserver.yaml
3In the kube-apiserver container's command list, add:
4```yaml
5- --request-timeout=300s
6```
7Save the file; the kubelet will automatically restart the API server
8Repeat on all control-plane nodes
Check Code
from prowler.lib.check.models import Check, Check_Report_Kubernetes
from prowler.providers.kubernetes.services.apiserver.apiserver_client import (
apiserver_client,
)
class apiserver_request_timeout_set(Check):
def execute(self) -> Check_Report_Kubernetes:
findings = []
for pod in apiserver_client.apiserver_pods:
report = Check_Report_Kubernetes(metadata=self.metadata(), resource=pod)
report.status = "PASS"
report.status_extended = (
f"Request timeout is set appropriately in pod {pod.name}."
)
for container in pod.containers.values():
# Check if "--request-timeout" is set to an appropriate value
if "--request-timeout" not in str(container.command):
# Assuming the value is valid, e.g., '300s' or '1m'
report.status = "FAIL"
report.status_extended = f"Request timeout is not set or not set appropriately in pod {pod.name}."
break
findings.append(report)
return findings