{{announcement.body}}
{{announcement.title}}

Kubernetes Security: Don’t Forget These Best Practices

DZone 's Guide to

Kubernetes Security: Don’t Forget These Best Practices

Is your Kubernetes infrastructure secure? If you don't know, here are five best practices to ensure that Kubernetes is versatile and resilient.

· Cloud Zone ·
Free Resource

Orchestration tools like Kubernetes bring about exceptional levels of versatility and resiliency to software deployment as well as management. They provide many controls that help to improve your application security a big deal. Especially, in security-centric industries, such as finance and healthcare, Development and Operations (DevOps) teams should strike the balance between usability, security, and functionality. If implemented properly, Kubernetes can be an answer here. 

But, when you deploy Kubernetes, your security efforts should focus on preventing Denial-of-Service (DoS) attacks, internal, and external threats. Follow these five best Kubernetes security practices and guarantee your success with the technology, now and in the future.

1. Be Cautious with Access

The complexity of a system that runs on multiple devices, with several interconnected microservices managed by hundreds of individuals and utilities, is a logistical challenge. Use role-based access control (RBAC) method to set access permissions for your clusters. No user should have more permissions than they require to effectively accomplish their jobs. For instance, if an application just needs to view logs, limit its access in a way that it doesn’t end up mining bitcoin, deleting resources, or viewing secrets.

Remember Kubernetes is all about automation, wherein RBAC uses an API group to drive authorization decisions via the Kubernetes API. All applications within a single Kubernetes cluster can access everything else within it. You should thus write a network policy that restricts communications between parts of the cluster with no business of talking to one another.

2. Protect Your Network Policy

You should impose the TLS security protocol on each level of the application deployment pipeline. Secure the individual elements that constitute the cluster and the elements that control access to it. As pods accept traffic from any source by default, network policies enable you to set specific rules on how pods communicate within a cluster and with external resources. Never run pods with mixed security levels on the same node, as this may affect the guaranteed security boundaries between pods. 

Besides, the network policy helps to manage cluster ingress and egress. Internal-only applications should ideally accept traffic from IP addresses inside your firewall. Partner IP-addresses also need to be whitelisted. It is also a good practice to whitelist allowed domains for outgoing traffic. 

Configuring an ingress policy that limits how much traffic a user can consume before shutting off can lead to avoiding Distributed Denial-of-Service (DDoS) attacks.

3. Maintain the Secrecy of Your Secret

A secret refers to a small object that comprises of sensitive data, like a token or password. Though a pod can’t access the secrets of another pod, you need to keep the secret separate from a pod or image, as otherwise, anyone with access to the image will have access to the secret too. But how to keep your secrets a secret? 

Assign processes to varied containers. Each container within the pod should request the secret volume. If you divide processes into distinct containers, you can minimize the risk of secrets being exposed. Use a front-end container that can’t see the private key. Complement that container with a signer container to whom the private key is visible. It can thus respond to simple signing requests from the front-end. 

Administrators should use strong credentials from the API servers to their etcd server. Mutual authentication via TLS client certificates can separate the etcd servers behind a firewall only accessible by API servers.

4. Increase Pod Security

Containers share the same kernel, and this makes it crucial to use additional tools for better container isolation. AppArmor and SELinux confine user programs and system services and are used to deny access to files as well as limit network resources.

Securing a system without SELinux depends on the proper configuration of privileged applications and the kernel itself. The entire system may have to be compromised, in case there is a misconfiguration in these areas. The security of a system based on an SELinux kernel rests on the correctness of the kernel and its security-policy configuration. Individual user programs and system daemons won’t necessarily risk the security of the entire system. 

5. Keep Yourself Updated

Do you remember when was the last time you updated your Kubernetes version? You should be running the latest available version of Kubernetes. Rolling updates and node pool migrations allow you to finish update with downtime and disruption to the minimum. Each new update assures you of critical security fixes and increased functionality. When you stay up to date on bug fixes and new releases, while testing the updates as you go, ensure your security and functionality are at the top. Kubernetes has robust built-in security features and offers your organization with a single platform for all cloud computing. To realize the maximum benefits of Kubernetes, security needs to be prioritized first.

Kubernetes brings you a myriad of options to create a secured deployment. As no one-size-fits-all solution can be used everywhere, you must be familiar with these practices and understand how they enhance the security of your applications. Also, you should use Kubernetes flexible configuration capabilities to integrate security processes into the continuous integration (CI) pipeline, while automating the entire process with security “baked-in” seamlessly.

Topics:
cloud, cloud native and kubernetes, cloud security, kubernetes, kubernetes security, security

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}