Repository: kubernetes
Issue: API Server supports insecure TLS ciphersuites 
Labels: area/security,kind/cleanup,priority/awaiting-more-evidence,sig/api-machinery,sig/auth,help wanted,wg/security-audit,sig/security,triage/accepted

<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!

If the matter is security related, please disclose it privately via https://kubernetes.io/security/
-->
**Description**
API Server allows administrators to configure TLS connections to use a variety of insecure cipher suites. In particular it supports the use of RC4 and 3DES in its symmetric suites. RC4 has known bias in its output and should never be used, while 3DES is an extremely deprecated 64-bit block cipher which is both slow and unneeded. Additionally, non-forward secure key exchange is supported (TLS_RSA_*). This, along with SHA-based cipher suites, should be deprecated and replaced.

**Recommendation**
Remove support for any cipher suite that uses RC4 or 3DES as well as non-forward secure key exchange suites (TLS_RSA_*). Deprecate all but the following cipher suite options for TLS versions up through 1.2:

```
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
```

**How to reproduce it**:

1. Start the api-server with weak/insecure cipher suites using `--tls-cipher-suites`:

```
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
```
Note: that `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` is not currently classified as weak or insecure, however it is required for the API Server running with HTTP2 enabled (default).

2. Using a modified `kubectl` that _only supports_ weak/insecure ciphers, a user can disable HTTP2 and establish a insecure connection with the API Server:
```
$ DISABLE_HTTP2=true kubectl_weak get pods --all-namespaces
I0514 09:03:11.918628   16970 http.go:122] HTTP2 has been explicitly disabled
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   kube-dns-c74654849-jqv9t   2/3     Running   0          45s
```

**Anything else we need to know?:**
This issue is derived from #81145, which focused on the kubelet.

To view the original finding, begin on page 89 of the [Kubernetes Security Review Report](https://github.com/kubernetes/community/blob/master/wg-security-audit/findings/Kubernetes%20Final%20Report.pdf).

See #81146 for current status of all issues created from these findings.

The vendor considers the original issue of Informational Severity.


**Environment**:
- Kubernetes version: `1.18.3`


/area security
/sig auth
/sig api-machinery
/wg security-audit

[DisableHTTP2]:https://github.com/kubernetes/kubernetes/blob/3b024339bd67b80e79a161bc295f6fe609eff076/staging/src/k8s.io/apiserver/pkg/server/config.go#L267