非ルートユーザーを作成し、AnsibleでルートSSHを無効にする


9

サーバーをブートストラップするためのAnsibleプレイブックを作成しようとしています。Linodeのデフォルトでは、パスワードを使用してrootとしてのみログインできるため、プレイブックはrootとしてログインし、SSHキーを使用して非rootユーザーを作成し、rootとパスワードSSHを無効にします。

rootログインが無効になっているため、このプレイブックを再度実行できないため、これは問題です!プレイブックをべき等にして、ホストをブートストラップした後にホストを追加および削除する必要がないようにしたいと思います。


1
ここからインスピレーションを得られるかもしれません。
Konstantin Suvorov

回答:


5

私はそれをこのようにするのが好きです:

- 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

ansibleユーザーを使用してリモートホストに接続しようとしています。これが不可能な場合(最初の実行時)、rootとして接続し、authorized_keysファイルとsudo権限と共にansibleユーザーを作成します。

以降の実行では、Ansibleユーザーとしての接続が機能するため、タスクのブロックをスキップできます。

リモートホストがブートストラップされると、ansibleユーザーとbecome次の手順に進むことができます。

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...

remote_user最初の実行後にプレイブックのを手動で変更していますか?それはべき等ではありません。何か不足しているといいのですが。
ディーフォー2018

1
そうです、私は何も手動で変更しません。2つのコードサンプルは2つの異なる再生を表します(おそらく、それらがbootstrap.ymlandと呼ばれ、何よりもsite.yml先にがsite.yml含まれていると想像するのに役立ちbootstrap.ymlます)。の最初のタスクがbootstrap.yml失敗した場合、このプレイの他のすべてのタスクはスキップされ、site.yml引き継がれます。
Michael Trojanek 2018

コードスニペットをコピーして貼り付けましたが、ansibleはそのタスクブロックをスキップします"skip_reason": "Conditional result was False"。でプレイを実行すると-vvv、sshコールが返される"msg": "non-zero return code", "rc": 255,
Rafa

when状態の変更を修正しました:when: not "OK" in check_ansible_user.stdout
Rafa

2

私は次のようにします:

  • あなたが(他のものの中で)あなたがどこかで使用するための適切なユーザー(とsudoルール)を作成するロール(「ベース」のようなもの)を作成します
  • SSHの役割を作成または調整して管理しsshd_config(ファイル全体をを使用して管理することをお勧めしますtemplateが、それはあなた次第です)、rootログインを無効にします
  • SSHの役割をメタなどの基本の役割に依存させる。

最初の役割(基本の役割)では、次のようなものを使用する傾向があります。

 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

SSH構成では、次のようにします。

- 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

Ansibleの役割の依存関係はここに記載されています

プレイブック内の順序付けを使用してこれを行うこともできます。

あなたが文脈でそれを見たいのであれば、私はgithubにいくつかのansibleなものがあります(そこから上記が取られます)


2

linodeモジュールを使用してLinodeにサーバーを作成する場合return valuelinodeタスクのを登録し、ブートストラップタスクにlinodeタスクのアウトアウトをチェックする条件を含めることができます。それはべき等であるべきです。このようなものを試してください:

- 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 次に、ssh rootログインを無効にするために必要なすべてのタスクなどが含まれます。


-1

ホストをブートストラップした後ansible_ssh_userインベントリでを変更するだけかもしれませんか?

[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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.