web-dev-qa-db-fra.com

Créez un utilisateur non root et désactivez la racine ssh dans une insible

J'essaie d'écrire un jeu de jeu ansible à bootstrap mes serveurs. Par défaut sur Linode, je ne peux que vous connecter en tant que root avec un mot de passe, donc mon jeu de jeu se connecte en tant que root, crée une non-racine. Utilisateur avec une touche SSH et désactive la racine et le mot de passe SSH.

Ceci est un problème parce que je ne peux plus exécuter que PlayBook puisque la connexion racine est désactivée! J'aimerais que le jeu de jeu soit idempotent et ne pas avoir à ajouter et à supprimer des hôtes après les boots.

10
JonathanR

J'aime le faire de cette façon:

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: Check ansible user
      command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
      delegate_to: 127.0.0.1
      changed_when: false
      failed_when: false
      register: check_ansible_user
    - block:
      - name: Create Ansible user
        user:
          name: ansible
          comment: "Ansible user"
          password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
          Shell: /bin/bash
      - name: Add authorized key
        authorized_key:
          user: ansible
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          exclusive: yes
      - name: Allow Sudo for ansible
        copy:
          content: ansible ALL=(ALL) ALL
          dest: /etc/sudoers.d/ansible
          mode: 0600
      when: check_ansible_user | failed

J'essaie de vous connecter à l'hôte distant avec mon utilisateur ansible. Si cela est impossible (à la première exécution), je me connecte en tant que root et crée l'utilisateur ansible avec son authorized_keys Dossier et Sudo droits.

Sur les exécutions suivantes, la connexion en tant qu'utilisateur ansitaire fonctionne, le bloc de tâches peut être ignoré.

Une fois que l'hôte distant est bootstrapped, je peux continuer avec l'utilisateur ansible et become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...
5
Michael Trojanek

Si vous créez vos serveurs sur Linode avec le module de linode Vous pouvez enregistrer le return value de la tâche linode _ inclut les tâches bootstrap avec une condition vérifiant la sortie de la tâche de linode. Essayez quelque chose comme ça:

- linode:
    api_key: 'longStringFromLinodeApi'
    name: linode-test1
    plan: 1
    datacenter: 2
    distribution: 99
    password: 'superSecureRootPassword'
    private_ip: yes
    ssh_pub_key: 'ssh-rsa qwerty'
    swap: 768
    wait: yes
    wait_timeout: 600
    state: present
  register: linode_node

- include: bootstrap.yml
  when: linode_node.changed

bootstrap.yml serait que contenir toutes les tâches nécessaires pour désactiver la connexion racine SSH et ainsi de suite.

2
Henrik Pingel

Je ferais ce qui suit:

  • créer un rôle (quelque chose comme "base") où vous (entre autres), créez un utilisateur approprié (et sudo) pour une manière à utiliser
  • créez ou adaptez votre rôle pour SSH, pour gérer sshd_config (J'aurais tendance à vous recommander de gérer l'intégralité du fichier, à l'aide d'un template, mais qui est à vous) et désactivez les connexions racines
  • faites que votre rôle SSH dépend du rôle de base, par exemple. en utilisant Meta.

Pour le premier rôle (la base), j'ai tendance à utiliser quelque chose comme:

 name: base | local ansible user | create user
  user:
    name: "{{ local_ansible_user }}"
    group: "{{ local_ansible_group }}"
    home: "/home/{{ local_ansible_user }}"
    state: present
    generate_ssh_key: "{{ local_ansible_generate_key }}"
    ssh_key_bits: 4096
    ssh_key_type: rsa
  tags:
    - ansible
    - local_user

- name: base | local ansible user | provision authorised keys
  authorized_key:
    user: "{{ local_ansible_user }}"
    state: present
    key: "{{ item }}"
  with_items: "{{ local_ansible_authorised_keys }}"
  tags:
    - ansible
    - authorised_keys

Pour la configuration SSH, j'utiliserais:

- name: openssh | server | create configuration
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0640"
    validate: "/usr/sbin/sshd -tf %s"
  notify:
    - openssh | server | restart
  tags:
    - ssh
    - openssh

Les dépendances du rôle de l'Ansible sont documentées ici .

Vous pouvez également utiliser simplement la commande dans votre jeu de jeu pour le faire.

J'ai une partie des choses ansibles sur github (à partir de laquelle ce qui précède est pris), si vous voulez le voir dans son contexte

2
iwaseatenbyagrue