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 ~]$
'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 |