Piotr Swat / Shutterstock.com

O NGINX Ingress é um controlador de entrada popular do Kubernetes para rotear o tráfego para o seu cluster. Um recurso Ingress padrão permite mapear solicitações HTTP para seus serviços Kubernetes. Veja como proteger suas rotas com autenticação básica HTTP.

Criação de um arquivo HTPasswd

Certifique-se de ter um htpasswd disponível antes de você lidar com a configuração do Kubernetes. Você pode criar um novo usuário único htpasswd em seu terminal:

Publicidade
apt install apache2-utils
htpasswd -c auth example-user

Você será solicitado a inserir a senha. Um novo arquivo chamado auth será criado em seu diretório de trabalho.

Em seguida, você precisa codificar em base64 sua string de credenciais para que possa ser usada como um valor em uma chave secreta do Kubernetes:

cat auth | base64

Copie a string codificada em base64 para a área de transferência. Vamos usá-lo na próxima seção para criar um segredo do Kubernetes contendo suas credenciais.

Publicidade

Adicionar um segredo do Kubernetes

Referências de entrada NGINX htpasswd arquivos como segredos do Kubernetes. O conteúdo do arquivo deve ser armazenado no auth chave de um Opaque segredo. O Kubernetes também tem um integrado basic-auth tipo secreto, mas isso não é adequado para NGINX Ingress.

Crie um novo manifesto secreto e aplique-o ao seu cluster com Kubectl:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: htpasswd
data:
  auth: <base64-encoded htpasswd file>

Adicione seu codificado em base64 htpasswd arquivo como o valor do auth chave.

Modificando sua entrada

O NGINX Ingress oferece suporte a várias anotações personalizadas que permitem que você anexe um comportamento extra aos seus recursos do Ingress. Para usar a autenticação básica HTTP, você precisa definir o auth-type anotação e fornecer uma referência ao seu segredo.

Publicidade
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: htpasswd
    nginx.ingress.kubernetes.io/auth-realm: "Enter your credentials"
spec:
  rules:
    - host: example.com
      http:
        paths:
         - path: /
           backend:
            serviceName: example-service
            servicePort: 80

As três anotações configuram o NGINX para exigir autenticação em cada solicitação que corresponda ao seu recurso Ingress. o basic tipo de autenticação é usado com as credenciais do htpasswd segredo criado anteriormente. o auth-realm anotação define a mensagem exibida aos usuários quando eles são solicitados a inserir suas credenciais.

Publicidade

As solicitações correspondentes a este Ingress agora exigirão que o usuário faça login antes de continuar. O desafio de autenticação é exibido como uma caixa de diálogo pop-up na maioria dos navegadores da web. Digite o nome de usuário e a senha fornecidos ao htpasswd comando para se autenticar.

Formulário Secreto Alternativo

O segredo mostrado acima usa o auth-file formato. Isso significa que tem um auth campo contendo saída codificada em base64 do htpasswd comando.

O NGINX Ingress também oferece suporte a outra forma denominada auth-map. Nesta variação, o auth O campo é substituído por um conjunto de chaves em que cada uma fornece a senha para um usuário individual.

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: htpasswd
data:
  user1: <base64-encoded password hash from htpasswd>
  user2: <base64-encoded password hash from htpasswd>

Adicione seus nomes de usuário ao arquivo e use htpasswd para gerar credenciais com hash. Inspecione o htpasswd saída; terá o seguinte formato:

username:<hashed password>

Pegue a parte da senha, codifique-a com o base64 comando e, em seguida, adicione o resultado ao seu segredo do Kubernetes.

Publicidade

O NGINX aceitará logins de qualquer combinação válida de nome de usuário e senha definida no segredo. Essa abordagem pode facilitar a configuração de várias contas de usuário e ajuda você a ver exatamente quem tem acesso.

Autenticação Mais Avançada

O NGINX Ingress pode ser integrado a provedores de autenticação externos se você precisar de mais controle, mas quiser uma experiência de configuração direta e semelhante. Usar um provedor de autenticação externo redirecionará os usuários a esse site antes que eles possam acessar o serviço por trás de seu Ingress. Isso permite que você aplique uma rotina de autenticação completa sem mexer no código de back-end.

o nginx.ingress.kubernetes.io/auth-url anotação define a URL de um serviço de autenticação externo a ser usado. O Kubernetes encaminhará cada solicitação recebida para o serviço. O acesso só será concedido ao usuário quando o serviço retornar um 200 OK código de status. O fluxo normal continua com a solicitação em seu serviço Kubernetes.

Quando o serviço de autenticação indicar um erro, os usuários serão redirecionados para a página indicada pelo nginx.ingress.kubernetes.io/auth-signin URL Isso receberá o URL original para redirecionar de volta após uma tentativa de autenticação bem-sucedida como um parâmetro de URL definido com o auth-signin-redirect-param anotação.

Diversos outras anotações permitem ajustar o comportamento do NGINX ao se comunicar com a plataforma de autenticação. Você pode alterar o método HTTP usado para fazer solicitações de autenticação, adicionar cabeçalhos adicionais e configurar o cache para respostas de autenticação. Este último garante que você não acesse continuamente a plataforma externa se um usuário fizer várias solicitações ao seu serviço em um curto período de tempo.

Publicidade

Resumo

A autenticação básica HTTP é a maneira mais simples de proteger um site. É ideal para sistemas internos e sites de teste onde você está trabalhando com uma pequena lista de usuários e não precisa de gerenciamento centralizado de credenciais.

Use a autenticação básica com o Ingress NGINX fornecendo credenciais em um segredo do Kubernetes e definindo anotações nos recursos do Ingress. Em um caso de uso real, você não deve codificar credenciais em seus manifestos do Kubernetes. Use o Helm ou um sistema CI / CD para fornecer valores com segurança no momento em que você aplica os recursos ao cluster.