Buat pengguna non-root dan nonaktifkan SSH root di Ansible

9

Saya mencoba menulis buku pedoman yang memungkinkan untuk bootstrap server saya. Secara default di Linode saya hanya bisa login sebagai root dengan kata sandi, jadi playbook saya login sebagai root, membuat pengguna non-root dengan kunci SSH, dan menonaktifkan SSH root dan kata sandi.

Ini masalah karena saya sekarang tidak bisa menjalankan buku pedoman itu lagi karena login root dinonaktifkan! Saya ingin playbook idempoten dan tidak perlu menambah dan menghapus host setelah bootstrap.

JonathanR
sumber
1
Anda dapat menemukan beberapa inspirasi di sini .
Konstantin Suvorov

Jawaban:

5

Saya suka melakukannya dengan cara ini:

- 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

Saya mencoba untuk terhubung ke host jarak jauh dengan pengguna saya yang mungkin. Jika ini tidak mungkin (pada jalankan pertama), saya terhubung sebagai root dan membuat pengguna yang memungkinkan bersama dengan authorized_keysfile dan sudohaknya.

Pada menjalankan selanjutnya, menghubungkan sebagai pengguna yang mungkin bekerja, sehingga blok tugas dapat dilewati.

Setelah host jarak jauh di-bootstrap, saya bisa melanjutkan dengan pengguna yang mungkin dan become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...
Michael Trojanek
sumber
Apakah Anda mengubah secara manual remote_userdi buku pedoman Anda setelah menjalankan pertama kali? Itu bukan idempoten. Saya harap saya kehilangan sesuatu.
Deefour
1
Anda lakukan, saya tidak mengubah apa pun secara manual. Kedua kode contoh mewakili dua permainan yang berbeda (mungkin membantu membayangkannya disebut bootstrap.ymldan site.yml, di mana site.ymltermasuk bootstrap.ymlsebelum yang lainnya). Jika tugas pertama bootstrap.ymlgagal, semua tugas lain dari permainan ini dilewati dan site.ymldiambil alih.
Michael Trojanek
copy-paste potongan kode, tapi melompat ansible blok tugas: "skip_reason": "Conditional result was False". Menjalankan permainan dengan -vvvmenunjukkan panggilan ssh kembali"msg": "non-zero return code", "rc": 255,
Rafa
Saya tetap mengubah whenkondisi:when: not "OK" in check_ansible_user.stdout
Rafa
2

Saya akan melakukan hal berikut:

  • buat peran (sesuatu seperti 'pangkalan') tempat Anda (di antara hal-hal lain), buat pengguna yang sesuai (dan aturan sudo) agar dapat digunakan
  • buat atau sesuaikan peran Anda untuk SSH, untuk dikelola sshd_config(saya akan cenderung menyarankan Anda mengelola seluruh file, menggunakan template, tetapi itu terserah Anda), dan menonaktifkan login root
  • buat peran SSH Anda bergantung pada peran dasar, misalnya menggunakan meta.

Untuk peran pertama (yang dasar), saya cenderung menggunakan sesuatu seperti:

 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

Untuk konfigurasi SSH, saya akan menggunakan:

- 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

Ketergantungan peran Ansible didokumentasikan di sini .

Anda juga bisa menggunakan pemesanan dalam buku pedoman Anda untuk melakukan ini.

Saya memiliki beberapa hal yang mungkin pada github (dari mana diambil di atas), jika Anda ingin melihatnya dalam konteks

iwaseatenbyagram
sumber
2

Jika Anda membuat server Anda pada Linode dengan modul linode Anda bisa mendaftarkan return valuedari linodetugas dan termasuk tugas-tugas bootstrap dengan kondisi memeriksa outout dari tugas linode. Itu harus idempoten. Coba sesuatu seperti ini:

- 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 akan berisi semua tugas yang diperlukan untuk menonaktifkan login ssh root dan sebagainya.

Henrik Pingel
sumber
-1

Mungkin Anda bisa memodifikasi ansible_ssh_userdalam persediaan setelah Anda dinyalakan tuan rumah?

[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
sumber