IT/LINUX

[Ansible] 원격지 계정 추가 및 sudo 권한 등록

송시 2020. 6. 8. 21:29
728x90

Ansible node 계정 추가 사용 권한 등록

사실 앞선 글에서 # 를 사용하다가 $로 넘어가는 부분있는데 ansible 을 root 로 실행하지 않고 일반 계정으로 실행하기 위해 계정을 추가 했었다.

[root@control ansible]# useradd ansibleuser

[root@control ansible]# echo 'ansibleuser' | passwd --stdin ansibleuser

Changing password for user ansibleuser.

passwd: all authentication tokens updated successfully.

[root@control ansible]# su - ansibleuser

[ansibleuser@control ~]$ ssh-keygen -N '' -f ~/.ssh/id_rsa

Generating public/private rsa key pair.

Created directory '/home/ansibleuser/.ssh'.

Your identification has been saved in /home/ansibleuser/.ssh/id_rsa.

Your public key has been saved in /home/ansibleuser/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:6dMFZ180evhyT3PPUVGKYLoTKVfDsJDUPhSWDCn+3WY ansibleuser@control

The key's randomart image is:

+---[RSA 3072]----+

|     .+*+==    o+|

|    . oo=*.o .ooo|

|   . ..o* . +o..o|

|    .  oo+ + .o..|

|     . .So  ...=o|

|      ...oE.  oo*|

|        oo.     +|

|         .       |

|                 |

+----[SHA256]-----+

[ansibleuser@control ~]$ cat /home/ansibleuser/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDrzMgsmSpAZ1Pro3RhGnjJlpjlKcdafd1xX0auPX5xO6VCGBklCBW+GgMN0apqUbvSVjIMGG87i7CiPyDEbSJ9nE9ny7ogrpspuxBe2bfoxnqlQCWMKjMubYLSS0YaluKpUa7pf3g5ldsNzO0i4GUKHQOFj3FQzipAjro/Qq9v2fG8T2Xyn5+CgHtU7n8+wl+BNUaR6kGMKz1lKIwL+4mrB71ZTIxQZDfP7cQ9pTIguiyB2hxAB3hOkEsKKLh1HCNOdt2nfGvIcDMbJ3pReD4dbK85uiiILe5cN/eEj6HZHSlRgbUBOmnjT2AIDrZTMFZB7ChbU5EUo8D8t9J84kxvikP/b5XN0RbepMiutjeOZTPJiuvYv82/BaODwi9iOgPUEqvQIFCrL53AQHg9cYG0FsbGuV9anzs4N1eYhMHk6jNsUanLhGYUaAHLuAeXNGjIEmDWe/ghBnCCKyEWkwaNc2ooc2sGGT5JeN8n0vzTqaxKmIRPn8pbLSLbm/qJqzk= ansibleuser@control

이것은 control node 에서 사용할 ansibleuser 인 것이고, 원격지에 접근할 계정이 필요하다

앞서 말했던 것 처럼 ssh key base 로 비밀번호 없이 작동하는 자동화 툴이기에 pub key 와 private key 를 등록해야한다. 

여기서 간단히 ssh key exchage 에 대해서 설명한다면

A서버가 B서버에 접근 할때 어떤 계정의 비밀번호를 묻지 않고 접속하고 싶다면

B서버의 ssh-keygen 으로 만든 id_rsa.pub 정보를 A서버의 authorized_keys 에 등록해주면 된다.

(**더 자세한 내용은 구글을 통해 검색해본다)

 

여기서는 컨트롤 노드의 ansibleuser 계정의 id_rsa.pub 를 원격지 노드(여기서는 centos8-1 즉 ansible inventory group 의 [ap] 인 서버에 authorized_keys 로 등록하는 작업이 필요하다.

 

 

우선 원격 노드에 계정 생성을 해보자

 

기존에 ansible 이 구성이 되어있다면 상관없겠지만 전혀 구성이 안되어 있는 상태에서는 root 권한으로 비밀번호를 묻는 과정을 통해 원격지에 명령어를 실행할 수 있다.

원격지 계정을 root  하고 -k  통해 비밀번호를 입력하도록 한다. -m  모듈을 불러오는 것이고

user 모듈에 대한 자세한 정보는ansible-doc user  통해 공부해보자

[ansibleuser@control ~]$ ansible -u root -k ap -m user -a "name=ansibleuser"

[ansibleuser@control ~]$ ansible -u root -k ap -m command -a 'id ansibleuser'

SSH password:

centos8-1 | CHANGED | rc=0 >>

uid=1001(ansibleuser) gid=1001(ansibleuser) groups=1001(ansibleuser)

[ansibleuser@control ~]$ ansible ap -u root -k -m authorized_key -a "user=ansibleuser state=present key='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABg...GGT5JeN8n0vzTqaxKmIRPn8pbLSLbm/qJqzk= ansibleuser@control'"

SSH password:

centos8-1 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/libexec/platform-python"

    },

    "changed": true,

    "comment": null,

    "exclusive": false,

    "follow": false,

    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABg...GGT5JeN8n0vzTqaxKmIRPn8pbLSLbm/qJqzk= ansibleuser@control",

    "key_options": null,

    "keyfile": "/home/ansibleuser/.ssh/authorized_keys",

    "manage_dir": true,

    "path": null,

    "state": "present",

    "user": "ansibleuser",

    "validate_certs": true

}

authorized_key module을 사용하여 원격지에 만든 계정 ansibleuser 의 ~/.ssh/authorized_keys 에 컨트롤 노드의 id_rsa.pub 가 등록되었다.

이 말은 centos8-1 에 ansibleuser 라는 계정에 ssh 로 접속 할때 컨트롤 노드의 ansibleuser 라는 계정은 비밀번호 없이 접속이 가능한 상태라는 것을 의미한다. 아래의 명령어를 통해 확인해본다.

[ansibleuser@control ~]$ ssh ansibleuser@centos8-1

Last failed login: Mon Jun  8 19:09:59 KST 2020 from 192.168.21.16 on ssh:notty

There were 9 failed login attempts since the last successful login.

 

이제 컨트롤 노드의 ansibleuser 계정은 원격지 서버([ap]) 의 ansibleuser 계정으로 ansible 명령어를 비밀번호 없이 실행 할 수 있는 단계에 왔다.

 그럼 ansible 명령어를 실행해 보자.

[ansibleuser@control ~]$ ansible all -m ping

centos8-1 | FAILED! => {

    "msg": "Missing sudo password"

}

failed 이 뜬다. sudo 의 password 가 없다는 이유다.

일반 계정에서 sudo 를 사용하기 위해서는 자기 계정의 비밀번호를 sudo 명령어 이후 사용하도록 되어 있다.

하지만 sudoers 파일에 NOPASSWD 기능을 넣으면 sudo 명령어를 사용할때 비밀번호를 묻지 않게 된다.

이를 원격지서버([ap])에 등록하도록 하자

sudo 에서 명령어를 비밀번호 입력 없이 사용하기 위해 추가 한다.

[ansibleuser@control ~]$ ansible ap -u root -k -m lineinfile -a "path='/etc/sudoers' line='ansibleuser ALL=(ALL) NOPASSWD: ALL'"

SSH password:

centos8-1 | CHANGED => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/libexec/platform-python"

    },

    "backup": "",

    "changed": true,

    "msg": "line added"

}

 

그럼 원격지의 자동화를 위해 가장 필요한 2가지를 모두 끝냈다

1. ssh key exchange

2. sudo NOPASSWD 

 

이게 모두 잘되었다면 root 의 권한이 아닌 ansibleuser 라는 일반 계정에서 ansible을 사용 할 수 있게 된다.

이런 것을 왜 할까???

그것은 해당 컨트롤 노드에 ansible 을 관리하는 관리자의 계정만 존재한다면 그리 큰 문제가 안되지만,

해당 서버에 ansible을 관리하지 않는 다른 계정의 관리자들이 ansible 을 사용하는 것을 막음으로써 보안을 강화하는데 목적이 있다.

아래의 명령어로 확인해보자.

[ansibleuser@control ~]$ ansible all -m ping

centos8-1 | SUCCESS => {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/libexec/platform-python"

    },

    "changed": false,

    "ping": "pong"

}

 

[ansibleuser@control ~]$ ansible ap -m command -a 'ls /root'

centos8-1 | CHANGED | rc=0 >>

anaconda-ks.cfg

위의 명령어에서 이상한 것을 혹시 찾는다면 당신은 센스있는 어드민일 것이다.

 

ansibleuser 는 일반 계정이기에 /root 에 디렉토리에 대한 접근 권한이 없다. 하지만 위의 명령어를 통해 ls /root 가 정상 실행되는 것을 알 수 있다.

그것은 현재 cfg 를 확인함으로써 알수있다.

앞서 cfg 를 그대로 잘 사용했다면

[ansibleuser@control ~]$ ansible --version

ansible 2.9.9

  config file = /home/ansibleuser/ansible.cfg

  configured module search path = ['/home/ansibleuser/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']

  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible

  executable location = /usr/local/bin/ansible

  python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)]

[ansibleuser@control ~]$ cat /home/ansibleuser/ansible.cfg

[defaults]

inventory       = ~/inven

remote_user = ansibleuser

host_key_checking = false

 

[privilege_escalation]

become = True

become_method = sudo

become_user = root

become_ask_pass = False

 

의 정보가 될텐데, become = false 로 둔다면 더 이상 ansibeuser 는 sudo를 통한 root 권한을 얻지 못하고 ansibleuser 계정의 권한만으로 원격지 명령어를 사용해야한다.

 

[ansibleuser@control ~]$ cat /home/ansibleuser/ansible.cfg

[defaults]

inventory       = ~/inven

remote_user = ansibleuser

host_key_checking = false

 

[privilege_escalation]

become = false

become_method = sudo

become_user = root

become_ask_pass = False

[ansibleuser@control ~]$ ansible ap -m command -a 'ls /root'

centos8-1 | FAILED | rc=2 >>

ls: cannot open directory '/root': Permission deniednon-zero return code

[ansibleuser@control ~]$

 

728x90

'IT > LINUX' 카테고리의 다른 글

[Ansible] Inventory - host pattern  (0) 2020.06.12
[Ansible] ad hoc  (0) 2020.06.12
[Ansible]Control node 의 configuration  (0) 2020.06.08
[Ansible] 설치(control node)  (0) 2020.06.06
[Ansible]Centos8 에서 sshpass 설치하기  (0) 2020.06.06