RHEL 7 (CentOS 7) segurança / ssh / sshd_config aviso solicitado

2

Eu não sou um administrador de sistemas e tento criar um servidor da Web mais ou menos seguro (baseado em LAMP CentOS 7 ).
Eu li vários tutoriais sobre como configurar um droplet inicial do CentOS 7 e fazer tudo correr bem.

No entanto, estou lutando para entender alguns conceitos básicos que leio nos artigos que leio e preciso de algumas sugestões de pessoas mais qualificadas, simplesmente porque não tenho certeza sobre os efeitos colaterais.

Sua opinião é muito apreciada.

Cenário:
Estou usando cloud-init (User Data) no Digital Ocean para criar & provisionar uma nova gota. Até onde eu entendi, o cloud-init roda como system / root, criando as configurações abaixo, específicas para ssh_config para root:

  • para criar um novo usuário (vamos chamá-lo de administrador para este cenário) na linha com uma chave ssh para esse usuário (ssh-authorized-keys) a
  • adicionando esse usuário aos grupos roda e defina sudo: ['ALL = (ALL) NOPASSWD: ALL']
  • desabilite o login root em / etc / ssh / sshd_config
  • Administrador do AllowUsers em / etc / ssh / sshd_config
  • defina PasswordAuthentication no em / etc / ssh / sshd_config
  • define o PubkeyAuthentication yes & RSAAuthentication sim em / etc / ssh / sshd_config
  • configurando o firewalld e executando algumas outras tarefas

Perguntas:

  1. Após conectar meu droplet através do ssh como user admin, o sshd_config relacionado está vazio. Suponho que isso se deva ao fato de o cloud-init ser executado como system / root quando o droplet é criado e o cloudconfig é executado.

    1.1 Preciso definir as mesmas configurações aqui como na criação de droplets para o usuário root? 1.2 Se sim, qual é o sentido de vários arquivos ssh_config?

  2. Olhando para o arquivo de log cloud-init, descobri que um par de chaves rss pública / privada para raiz foi criado.
    A senha relacionada é enviada para mim porque decidi não fornecer uma chave ssh inicial para o usuário raiz (apenas para fins de teste). No entanto, a execução de ls -a em / etc/ssh do administrador do usuário recém-criado é exibida:

    . moduli sshd_config ssh_host_dsa_key.pub ssh_host_ecdsa_key.pub ssh_host_rsa_key.pub .. ssh_config ssh_host_dsa_key ssh_host_ecdsa_key ssh_host_rsa_key

    Olhando para ssh_host_rsa_key, por exemplo, ele contém a mesma chave ssh que foi criada para o usuário root.

    2.1 Por que e com que propósito o usuário recém-criado que eu chamei de admin (não root) possui as mesmas chaves que root em sua pasta ssh?

    2.2 É porque eu adicionei ele à roda de grupos e ao sudo: ['ALL = (ALL) NOPASSWD: ALL ‘]? Isso é recomendado?

    2.3 Qual é a sensação de não permitir root ao login remoto através de ssh se outra conta de usuário pode ser comprometida e também possui todas as chaves necessárias para tornar um hacker uma pessoa de muita sorte? O propósito é apenas ter um usuário cujo nome é mais difícil de adivinhar?

  3. Eu entendi que algumas ações ainda exigem privilégios sudo / root. Se logado como admin eu posso mudar para root usando su root.

    3.1 Como eu desabilitei o login root em / etc / ssh / sshd_config (isto é, somente para ssh, certo?) mas o novo usuário criado (admin) tem os mesmos direitos e pode facilmente mudar para Estou me perguntando o que pode ser feito para proteger melhor essa senha ou se há algo como Two Factor Auth que adiciona um nível de segurança?

    3.2. Por outro lado, não entendo como esse pode ser um nível melhor de segurança se um hacker que obteve o controle da conta de administrador pode ler facilmente as chaves ssh para root ( ver o tópico anterior acima) e ignorar qualquer camada de segurança?

Em suma: Eu gostei muito do que eu estava lendo, mas olhando para o filesyste, em específico, depois de encontrar as chaves ssh (privado e público) na pasta ssh dos usuários que eu criei usando cloud-init, estou um pouco preocupado que eu entendi mal alguma coisa .

A propósito: este é o meu script cloud-init:

#cloud-config

# log all cloud-init process output (info & errors) to a logfile
output: {all: ">> /var/log/cloud-init-output.log"}

# final_message written to log when cloud-init processes are finished
final_message: "System boot (via cloud-init) is COMPLETE, after $UPTIME seconds. Finished at $TIMESTAMP"

package_upgrade: true

users:
  - name: admin
    groups: wheel
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    shell: /bin/bash
    ssh-authorized-keys:
      - ssh-dss AAAABBBBBCCCCDDDD...
runcmd:
  - sed -i -e 's/#Protocol 2/Protocol 2/g' /etc/ssh/sshd_config
  - sed -i -e 's/#LoginGraceTime 2m/LoginGraceTime 2m/g' /etc/ssh/sshd_config
  - sed -i -e 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
  - sed -i -e 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
  - sed -i -e 's/#RSAAuthentication yes/RSAAuthentication yes/g' /etc/ssh/sshd_config
  - sed -i -e 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
  - sed -i -e '$aAllowUsers admin' /etc/ssh/sshd_config
  - service sshd restart

  #firewall
  - systemctl start firewalld
  - firewall-cmd --permanent --add-service=ssh
  - firewall-cmd --reload
  - systemctl enable firewalld
    
por frank 10.01.2015 / 12:47

2 respostas

1

Não é uma resposta para a maioria das suas perguntas, mas é muito longa para um comentário:

  1. a razão para ter um usuário separado (seja "admin" ou qualquer outra coisa) é exatamente colocar mais uma camada de autenticação / autorização (logar como usuário com uma chave / senha e depois digitar outra senha para se tornar root) na foto. A menos que o usuário tenha o mesmo UID como root, ele não tem os mesmos direitos que o root, embora possa ter privilégios maiores que o usuário "regular".

    Também permite que se dê acesso à mesma conta a diferentes usuários - uma conta pode ser autenticada por meio de chaves diferentes. Isso torna as coisas mais fáceis quando você tem vários usuários (e várias máquinas) - revogar permissões para um usuário em particular sem interromper outras é apenas uma questão de remover uma entrada do arquivo AuthorizedKeys (geralmente ~ / .ssh / authorized_keys '. O mesmo obviamente vale para o acesso root direto, mas sem o nível adicional de autenticação / autorização.)

    Quanto à disponibilidade das chaves para o invasor: somente as partes públicas das chaves são mantidas no servidor. Durante a fase de autenticação, o cliente usa sua chave privada, mas não a deixa em nenhum lugar no servidor. Assim, quem ganha privilégios de root no servidor ainda não obtém a capacidade de fazer o login remotamente como um usuário comum (que não mantém suas chaves privadas na máquina mencionada).

    Para outras coisas, o que é mais comum é: P: "Como você chama alguém que ganha privilégios de root no seu sistema?"
    A: "Sim, senhor".

  2. Permitir que qualquer usuário execute qualquer comando com privilégios de root simplesmente adicionando "sudo" à linha de comando é um uso indevido de sudo . Enquanto algumas pessoas acham que é uma ótima idéia, em termos de segurança, é uma das coisas mais idiotas a se fazer, já que ela realmente torna todo mundo um administrador de sistema. A única vantagem é que não é executado acidentalmente rm -Rf / com privilégios elevados (como se faria ao efetuar login como root diretamente). Mas então a memória muscular assume e as pessoas apenas começam a usar sudo em todos os lugares e a única vantagem que resta é que os comandos podem ser registrados. Também anula a finalidade das contas secundárias, como você observou corretamente.

    Resumindo: ALL=(ALL) NOPASSWD:ALL é uma idéia ruim TM , duplamente em um servidor. Por favor, não faça isso.

    Quando você se livrar disso, a parte 1, de repente, começa a fazer mais sentido.

por 10.01.2015 / 16:21
1

Fortalecimento da segurança do CentOS 7 O documento que acabei de postar pode ajudá-lo, é baseado em OpenSCAP.

    
por 29.03.2015 / 00:56