Erstellen Sie einen Nicht-Root-Benutzer und deaktivieren Sie Root-SSH in Ansible

10

Ich versuche, ein Ansible-Playbook zu schreiben, um meine Server zu booten. Standardmäßig kann ich mich unter Linode nur als root mit einem Kennwort anmelden, daher meldet sich mein Playbook als root an, erstellt einen Nicht-root-Benutzer mit einem SSH-Schlüssel und deaktiviert root und Kennwort SSH.

Dies ist ein Problem, da ich das Playbook jetzt nicht mehr ausführen kann, da die Root-Anmeldung deaktiviert ist! Ich möchte, dass das Playbook idempotent ist und keine Hosts nach dem Bootstrapping hinzugefügt und entfernt werden muss.

JonathanR
quelle
1
Sie können Inspiration finden hier .
Konstantin Suworow

Antworten:

5

Ich mache es gerne so:

- 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

Ich versuche, mit meinem ansiblen Benutzer eine Verbindung zum Remote-Host herzustellen. Wenn dies nicht möglich ist (beim ersten Durchlauf), verbinde ich mich als root und erstelle den ansiblen Benutzer zusammen mit seiner authorized_keysDatei und seinen sudoRechten.

Bei nachfolgenden Läufen funktioniert die Verbindung als ansprechbarer Benutzer, sodass der Aufgabenblock übersprungen werden kann.

Sobald der Remote-Host gebootet ist, kann ich mit dem ansiblen Benutzer fortfahren und become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...
Michael Trojanek
quelle
Ändern Sie das remote_userin Ihrem Playbook nach diesem ersten Lauf manuell ? Das ist nicht idempotent. Ich hoffe mir fehlt etwas.
Deefour
1
Sie tun, ich ändere nichts manuell. Die beiden codesamples repräsentieren zwei verschiedene Spiele (vielleicht hilft es ihnen , sich vorzustellen , wie wird genannt bootstrap.ymlund site.yml, wo site.ymlbeinhaltet bootstrap.ymlvor allem anderen). Wenn die erste Aufgabe von bootstrap.ymlfehlschlägt, werden alle anderen Aufgaben dieses Spiels übersprungen und site.ymlübernehmen.
Michael Trojanek
Kopieren Sie das Code-Snippet, aber ansible überspringt diesen Aufgabenblock : "skip_reason": "Conditional result was False". Wenn Sie das Spiel mit -vvvausführen, wird der SSH-Anruf zurückgegeben"msg": "non-zero return code", "rc": 255,
Rafa,
Ich habe die Änderung der whenBedingung behoben :when: not "OK" in check_ansible_user.stdout
Rafa
2

Ich würde folgendes tun:

  • Erstellen Sie eine Rolle (so etwas wie "Basis"), in der Sie (unter anderem) einen geeigneten Benutzer (und Sudo-Regeln) für die Verwendung erstellen
  • Erstellen oder Anpassen Ihrer Rolle für SSH, zum Verwalten sshd_config(ich würde eher empfehlen, die gesamte Datei mit a zu verwalten template, aber das liegt bei Ihnen) und Deaktivieren von Root-Anmeldungen
  • Stellen Sie sicher, dass Ihre SSH-Rolle von der Basiserolle abhängt, z. B. mithilfe von Meta.

Für die erste Rolle (die Basisrolle) verwende ich eher Folgendes:

 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

Für die SSH-Konfiguration würde ich verwenden:

- 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

Die Rollenabhängigkeiten von Ansible werden dokumentiert hier .

Sie können dazu auch einfach die Bestellung in Ihrem Playbook verwenden.

Ich habe einige ansible Sachen auf Github (aus denen das Obige stammt), wenn Sie es im Kontext sehen wollen

Ich wurde von der Wahrheit gegessen
quelle
2

Wenn Sie Ihren Server auf Linode mit dem erstellen linode Modul können Sie das Register return valueder linodeAufgabe und schließen die die Bootstrap - Aufgaben mit einer Bedingung Überprüfung der outout der linode Aufgabe. Das sollte idempotent sein. Versuchen Sie so etwas:

- 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 würde dann alle Aufgaben enthalten, die zum Deaktivieren der SSH-Root-Anmeldung usw. erforderlich sind.

Henrik Pingel
quelle
-1

Vielleicht könnten Sie das ansible_ssh_userim Inventar einfach ändern, nachdem Sie den Host gebootet haben?

[targets]

other1.example.com ansible_connection=ssh ansible_ssh_user=root # new host
other2.example.com ansible_connection=ssh ansible_ssh_user=user # bootstrapped host
kal3v
quelle