✔️ 관리 노드 접속
✔️ SSH 접속 방법
- 패스워드 인증
- 키 쌍 인증
✔️ 권한 상승(Privilege Escalation)
운영체제에 패키지를 설치, 제거 할 때는 관리자 권한이 필요하다.
서비스를 start, stop, enable, disable 하기위해서도 관리자 권한이 필요하다.
그렇다면 서비스의 목록을 볼 때, 패키지의 목록을 볼 때 관리자 권한이 필요할까? 필요하지 않다.
리눅스 시스템에서 root 사용자의 권한은 최소한으로 사용해야 한다.
root 사용자는 시스템의 모든 권한을 가지고 있기 때문이다.
즉 root는 막강한 권한을 가지므로 root 사용자는 주의해서 사용해야 하며
어떤 가상 인스턴스도 마찬가지로 root 사용자로 바로 접속하는 것은 없다.
리눅스 시스템에서 root 권한을 얻는 방식은 두가지가 있다.
- su (X) → 가능하면 절대 사용하면 안된다.
- sudo
a라는 사용자가 root로 전환을 하려고 할 때 su, sudo를 사용할 수 있다.
su를 사용하려고 하면 su는 패스워드를 물어보려고 한다. 누구의 패스워드를 물어보려고 하는 것인가 ?
a가 root로 전환하려고 할 때 물어보는 패스워드는 이 패스워드는 root의 패스워드이다.
다시 말하면 a, b, c 가 모두 관리자 권한을 취득하려고 su를 사용할 때 모두 root의 계정을 공유해야 한다.
쉽게 말하면 네이버 계정을 하나 만들어서 10명이 같이 사용하는 거랑 같은 상황이다.
이 상황은 정보 보안의 책임 추적성(Accountability) 원칙을 위반한다.
책임 추적성(Accountability)이란?
시스템 내의 각 개인은 유일하게 식별되어야 한다는 정보 보호 원칙
이 원칙에 의해 정보 처리 시스템은 정보 보호 규칙을 위반한 개인을 추적할 수 있고,
각 개인은 자신의 행위에 대해서 책임을 진다.
의도를 가지고 했던 아니던 root는 막강한 권한을 가지고 있기 때문에 사용자 중에 누군가가 잘못했을 때 책임을 추적하는 것이 매우 어려워진다.
따라서 우리가 사용하는 인스턴스 이미지는 root 패스워드가 아예 세팅이 되어 있지 않아 su 자체를 사용할 수 없다.
그렇다면 su를 대신할 수 있는 명령어는 없을까? 그것이 바로 sudo이다.
sudo는 root로 전환한다는 개념은 같으나 root의 패스워드가 아닌 a, b, c 각각의 패스워드를 사용하여 접근하는 것이다.
sudo를 사용할 수 있는 사용자를 설정할 수 있는 파일은 /etc/sudoers
이다.
/etc/sudoers
%wheel ALL=(ALL) ALL
- $whell : whell 그룹
- ALL : 모든 시스템에서 (원격에서 접속하는 상황까지 고려한 것)
- (ALL) : 모든 사용자로
- ALL : 모든 명령어
vagrant 192.168.56.100=(root) /usr/bin/ls
vagrant 그룹에 속하는 사용자가 ip의 root로 접근할 수 있고 /usr/bin/ls 파일에 있는 명령어를 사용할 수 있다는 뜻이다.
/etc/sudoers.d/vagrant
%vagrant ALL=(ALL) NOPASSWD: ALL
NOPASSWD : 패스워드를 묻지 않음 (passwordless sudo)
✔️ ansible 옵션
✔️ SSH 접속 옵션
- -u REMOTE_USER, --user REMOTE_USER : SSH 접속 계정(기본: 현재 사용자)
- -k, --ask-pass : 옵션 사용 SSH 패스워드 인증
- 옵션 사용하지 않으면 --> SSH 키 인증
ansible의 기본 인증 방법: SSH 키 인증
✔️ 권한 상승 옵션
- -b, --become : 권한 상승
- 옵션 사용하지 않으면 → 권한상승 하지 않음
- --become-method <sudo|su>
- sudo: 기본값
- su
- --become-user : 어떤 사용자?
- root: 기본값
- -K, --ask-become-pass : sudo 패스워드 묻기
- 옵션 사용하지 않으면 → Passwordless sudo
✔️ ansible 구성 파일
설정파일 위치 (우선 순위 순서)
1. ANSIBLE_CONFIG (environment variable if set)
touch /tmp/ans.cfg
export ANSIBLE_CONFIG=/tmp/ans.cfg
ansible --version
unset ANSIBLE_CONFIG
ansible --version
2. ansible.cfg (현재 작업 디렉토리) → 가장 많이 사용
3. ~/.ansible.cfg (홈 디렉토리)
4. /etc/ansible/ansible.cfg : 기본 설정 파일
각 파일에 다른 ssh 접속 내용을 다르게 설정해도 상위 우선 순위를 갖는 파일의 설정 내용대로 실행된다.
1, 4번 파일은 일반적인 것
3번은 해당되는 사용자에게만 부여되고
2번은 해당되는 디렉토리의 해당되는 작업에만 부여된다.
자주 쓰는 내용은 3번
해당되는 작업에 대한 것은 2번에
사용자에 따른 설정은 home 디렉토리의 .ansible.cfg 파일을 사용한다.
ansible.cfg에는 크게 2가지 섹션이 있다.
- [defaults] : ansible 작업의 기본 환경설정 값을 구성
ventory = ./inventory | 사용할 인벤토리 파일의 경로 - 정적 인벤토리 파일 또는 여러개의 정적 인벤토리 파일이 있는 디렉토리를 명시 - 동적 인벤토리 스크립트를 포함하는 디렉토리 명시 |
remote_user = user | 관리 호스트에 연결할 사용자의 이름. 관리 호스트에서 사용하므로 관리 호스트에 해당 유저가 존재해야 한다. 이 구문을 따로 명시하지 않으면 ansible은 ansible 명령을 실행하는 로컬 사용자명을 사용하여 관리 호스트에 연결한다. 따라서 다른 원격 사용자를 지정하려면 여기에 해당 유저명을 넣는다. 또한 여기서 명시된 유저를 사용하여 [privilege_escalation]을 적용한다. (물론 명시하지 않으면 ansible 명령을 실행하는 로컬 사용자 이름을 사용한다.) |
ask_pass = false | ssh 암호를 요청하는 메시지 표시 여부를 결정 제어노드에서 관리 호스트에 연결할 사용자에 대해 인증할 수 있는 키가 구성된 경우 따로 비밀번호를 물어보지 않고 자동으로 로그인된다. 이런 경우에는 ssh 암호를 요청할 필요가 없으므로 false로 설정한다. default는 false 이다. 위 경우가 아닌, 비밀번호를 입력해야 하도록 설정된경우, true로 설정하여 로컬 사용자에게 원격 사용자가 사용하는 암호를 요청하는 메시지가 표시하도록 해야 한다. 만약 비밀번호를 써야하는데 false로 되어있으면, 아예 비밀번호를 입력할 기회 자체가 없어진다. |
host_key_checking = true | ssh 접속시 관리 노드의 공개키 지문과 비교하는 질문 표시 여부를 결정 |
- [privilige_escalation] : 관리 호스트에서 ansible이 권한 상승을 수행하는 방법을 구성
ecome = true | remote_user로 연결한 유저를 sudo 또는 su를 사용하여 특정 상급 유저로 전환할지 여부 사용하는 모듈에 따라 원래 유저의 권한만으로 충분할 수도 있고, 상급유저(root)의 권한이 필요할 수도 있다. 이에 따라 true/false가 달라질 것이다. 상급 유저로 전환하려면, true를 설정한다. default 값은 false이다. 다만, 이렇게 설정해도 ansible 명령 또는 ansible-playbook 실행 시 다양한 방법으로 이를 재정의할 수 있다. 예를 들어 특정 ansible-playbook은 권한 상승이 필요없는 경우 false로 재정의할 수 있다. |
become_method = sudo | 상급 유저로 전환하는 방법을 명시한다. default는 sudo이고, su는 옵션이다. 일반적으로 sudo 그대로 사용한다. |
become_user = root | 상급 유저로 전환할 때, 어떤 유저로 전환할지 명시한다. default는 root 이다. |
become_ask_pass = false | become_method의 암호를 요청하는 메시지 표시 여부 default는 false 이다. 상급 유저로 전환할 때 sudoers 설정을 따로 하지 않아 상급유저의 암호를 입력해야 한다면, 이 값을 true로 해야 한다. 위 [inventory] 항목에서 remote_user 로 설정한 유저가 sudo 권한이 있다면 이 값은 false로 하면 된다. |
become_flags | 작업 또는 역할에 대한 특정 플래그의 사용을 허용 |
[defaults]
remote_user=<SSH_USER>
ask_pass=<True|False>
host_key_checking=<True|False>
[privilege_escalation]
become=<True|False>
become_ask_pass=<True|False>
become_method=<sudo|su>
become_user=<SUDO_USER>
각 변수의 기본값
- ask_pass 기본값: false
- host_key_checking 기본값: true
- become 기본값: false
- become_ask_pass 기본값: false
- become_method 기본값: sudo
- become_user 기본값: root
예시 파일
[defaults]
remote_user = jason
inventory = /home/jason/ansible/inventory
roles_path = /home/jason/ansible/roles:/usr/share/ansible/roles
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
1. 제어노드에서 jason라는 유저명으로 관리호스트에 ssh 접속을 수행한다.
2. 키가 설정되어있다면, 비밀번호를 입력하지 않고 바로 로그인되고, 키가 설정되어 있지 않다면 비밀번호를 물어본다. (비밀번호 입력 부분)
3. 로그인을 완료했으면, ansible에서 명시한 task를 실행할 때 root 권한의 sudo를 사용하여 실행한다.
4. 관리호스트의 sudoers에서 jason 유저에 대해 비번 없이 sudo를 사용할 수 있도록 설정했다면 바로 task 가 실행된다.
5. 따로 sudoers의 설정을 하지 않았다면, sudo 실행시 jason의 비밀번호를 물어본다. (비밀번호 입력 부분)
✔️ ansible-config 명령
- ansible-config list : 설정 가능한 모든 항목 표시
- ansible-config dump : 모든 설정의 기본 값 및 변경 값 표시
- ansible-config view : 현재 적용되는 설정 파일의 내용 표시
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] module, ad-hoc, playbook, yaml 포맷 (0) | 2022.04.15 |
---|---|
[Ansible] 정적 인벤토리 (0) | 2022.04.15 |
[Ansible] Ansible의 기본 개념과 구성 요소 (0) | 2022.04.14 |
Ansible을 이용해 AWS ec2 인스턴스에 Apache 설치하기 (0) | 2022.04.13 |
Ansible 기본 사용법 (0) | 2022.04.13 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!