Ansible: sshd_config에 사용자 추가

Ansible: sshd_config에 사용자 추가

새로운 직원이 합류했는데 테스트 서버에 대한 액세스를 허용해야 합니다. 보통 저는 템플릿을 사용하고 환경 유형에 따라 이 템플릿을 서버에 업로드합니다. 하지만 이번에는 다른 접근 방식을 사용하고 싶습니다. 사용자가 사용할 수 없는 경우에만 sshd_config새 사용자를 추가하고 싶습니다.AllowUsers

모듈을 시도했지만 lineinfile지금까지 성공하지 못했습니다.

답변1

필터 사용커뮤니티.일반.jc분석하다/etc/ssh/sshd_config

변수 선언

  sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"

그리고 파일을 읽어보세요

    - command: cat /etc/ssh/sshd_config
      register: sshd_out

구성된 목록 가져오기사용자 허용

  sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

다른 모듈을 사용하여 파일을 읽을 수도 있습니다(slurp, fetch 등). 필터를 사용하려면 설치해야 합니다.제시컨트롤러에서. 설치할 수 없거나 설치하고 싶지 않은 경우 구성을 직접 해결하세요. 명령 사용

    - command: sshd -T
      register: sshd_out

그리고 변수 선언

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('split')|map('last') }}"

목록을 추가하고 연결할 사용자 목록을 선언합니다.

  sshd_allow_users_add: [alice, bob]
  sshd_conf_update:
    AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"

예를 들어, 주어진 파일

shell> grep AllowUsers /etc/ssh/sshd_config
AllowUsers cloe

업데이트해

    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"

양보--확인--차이점모델

TASK [lineinfile] ********************************************************************
--- before: /etc/ssh/sshd_config (content)
+++ after: /etc/ssh/sshd_config (content)
@@ -127,4 +127,4 @@
 #  AllowTcpForwarding no
 #  PermitTTY no
 #  ForceCommand cvs server
-AllowUsers cloe
+AllowUsers alice bob cloe

changed: [localhost] => (item={'key': 'AllowUsers', 'value': ['alice', 'bob', 'cloe']})

테스트를 위한 완전한 플레이북 예시

- hosts: all
  become: true

  vars:

    sshd_allow_users_add: [alice, bob]
    sshd_conf_update:
      AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"

    sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"
    sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

  tasks:

    - command: cat /etc/ssh/sshd_config
      register: sshd_out
      check_mode: false
      changed_when: false

    - debug:
        msg: |
          sshd_conf:
           {{ sshd_conf|to_yaml|indent(2) }}
          sshd_allow_users_add: {{ sshd_allow_users_add }}
          sshd_conf_update:
            {{ sshd_conf_update|to_yaml|indent(2) }}
      when: debug|d(false)|bool
 
    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"

묻다:'분할'이라는 필터가 없습니다.

답: 필터나뉘다2.11부터 이용 가능합니다. 이 필터를 사용할 수 없는 경우 이 방법을 사용하세요.나뉘다()첫 번째 경우

  sshd_allow_users: "{{ (sshd_conf.allowusers|d('')).split() }}"

그리고 필터를 사용하세요정규식_교체두 번째 경우

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('regex_replace', '^(.*) (.*)$', '\\2') }}"

답변2

솔직히 그런 느낌이에요XY 문제-- 문제에 대한 특정 솔루션을 구현하는 방법을 문의했지만 그 솔루션은... 기껏해야 차선책입니다.

포장을 풀어보자. 테스트 서버에 연결할 권한이 있는 신규 직원이 SSH를 통해 연결할 수 있는지 확인하고 싶고 파일 AllowUsers에 목록을 유지하여 이를 수행 하려고 합니다 sshd_config. 이 작업을 수행하면 Ansible을 통해 임의의 구성 파일을 수정하는 것이 까다로울 수 있으며 lineinfile우연히 문제가 발생할 수 있다는 문제에 직면하게 됩니다.

이 특정 방법을 얼마나 좋아하는지에 따라 몇 가지 가능한 옵션이 있습니다.

하나는 Sotto Voce가 이미 지적했듯이 파일에 사용자를 명시적으로 지정하는 것이 아니라 시스템 수준 그룹을 생성하고 해당 사용자를 모듈의 ansible을 통해 sshd_config일반적인 방법으로 그룹에 추가하고 다음과 일치하는 항목이 있는지 확인하는 것입니다. 그룹.ssh_allowedansible.builtin.usersshd_configAllowGroup ssh_allowed

두 가지 최신 버전의 sshd가 이 Include설명을 지원합니다. 귀하의 경우 수동으로 확인해야 할 수도 있습니다. 그러면 더 간단한 해결책이 있습니다.

먼저 라인을 추가하세요.

Include /etc/ssh/sshd_config.d/*.conf

기본 sshd_config구성 파일의 경우 기본 제공 템플릿에서 생성할 수 있는 파일을 생성합니다. /etc/ssh/sshd_config.d/01-authusers.conf이는 나머지 서버 수준 sshd 구성과 완전히 독립적이기 때문입니다.

답변3

(원래 댓글이었는데 답변으로 옮겼습니다)

AllowGroups비슷한 작업을 수행할 때 파일의 한 줄에 정적 그룹 목록을 사용 sshd_config하고 일반 Unix/Linux 그룹 멤버십을 통해 액세스를 관리했습니다. 그룹 멤버십을 관리하기 위한 Ansible(또는 기타 구성 관리 제품군)의 도구는 sshd_config 파일의 중간을 편집하는 것보다 훨씬 쉽습니다. 사용자 이름과 일치하는 기본 그룹으로 사용자를 생성하는 일반적인 관행을 따르면 다음을 AllowGroups허용할 수 있습니다 . 개인 사용자는 물론 그룹도 마찬가지입니다.

AllowGroups/ 는 AllowUsers대부분의 사람들이 기대하지 않는 방식으로 작동합니다. / line AllowGroups에 그룹/사용자가 있는 경우AllowUsers회선에서는 그룹/사용자만 허용SSH를 통해 로그인하세요. 다른 모든 그룹/사용자는 거부됩니다. IMO의 이름을 지정 AllowOnlyTheseGroups하고 AllowOnlyTheseUsers작동 방식을 더 정확하게 설명합니다.

AllowGroups여러 줄 이나 파일의 줄을 구성하려고 할 때는 AllowUsers주의하십시오 sshd_config. 이 두 매개변수는 대부분의 다른 SSH 구성 매개변수와 유사합니다. 즉, 구성 파일에 나타나는 첫 번째 매개변수가 우선합니다. 두 번째, 세 번째 등의 발생은 무시됩니다. 에 등장하더라도 Include.

관련 정보