기존 서버 그룹을 관리 하기 위해 ansible 을 사용하고 싶습니다 . ansible_hosts
파일 을 만들고 -K
단일 호스트 만 대상으로하는 명령을 사용하여 옵션 으로 성공적으로 테스트했습니다.
ansible -i ansible_hosts host1 --sudo -K # + commands ...
내 문제는 각 호스트의 사용자 비밀번호가 다르지만 Ansible에서이를 처리하는 방법을 찾을 수 없다는 것입니다.
을 사용하면 -K
단일 sudo 비밀번호를 입력하라는 메시지가 표시되며 프롬프트가 표시되지 않는 모든 후속 호스트에 대해 시도되는 것 같습니다.
host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password
지금까지 조사 :
-
하나의 오답 ( “use “)과 저자가 “암호없는 sudo가 필요하다는 것을 알았습니다”라는 응답이 있는 StackOverflow 질문
-K
-
“암호가없는 sudo를 사용하면 작업을보다 쉽게 자동화 할 수 있지만 필수는 아닙니다 .” 라는 Ansible docs (강조 광산)
-
이 보안 StackExchange 질문
NOPASSWD
은 필요한 것으로 읽습니다. -
“확장 가능하고 이해하기 쉬운 프로비저닝 …” 기사 :
“sudo를 실행하려면 암호를 입력해야 할 수 있습니다. 이는 Ansible을 영원히 차단하는 확실한 방법입니다. 간단한 수정은 대상 호스트에서 visudo를 실행하고 사용자가 Ansible에서 로그인 할 때 암호를 입력 할 필요가 없도록하는 것입니다.”
-
기사 “기본 Ansible 플레이 북” 말한다,
“Ansible은 루트로 대상 서버에 로그인하여 sudo를 필요로하지 않거나, asible 사용자가 암호없이 sudo를 갖도록 할 수 있지만, 그렇게하는 생각은 내 비장이 협곡을 도약하고 내 관을 막을 수있는 위협이됩니다. 하지마 “
내 생각은 정확하지만 단일 서버 이상으로 확장하는 방법은 무엇입니까?
-
ansible issue # 1227 , “Ansible은 Playbook의 모든 사용자에게 sudo 암호를 요청해야합니다.”는 1 년 전에 mpdehaan에 의해 “이것에 대한 많은 수요를 보지 못했지만 대부분의 사람들이 하나에서 sudoing하고 있다고 생각합니다. 사용자 계정 또는 대부분의 키 사용 “
그렇다면 … 이런 상황에서 사람들은 Ansible을 어떻게 사용하고 있습니까? 에서 설정 NOPASSWD
하고 /etc/sudoers
호스트에서 비밀번호를 재사용하거나 루트 SSH 로그인을 사용하면 보안이 크게 저하되는 것처럼 보입니다.
답변
당신은 확실히 연구를 완료했습니다 …
당신이 달성하고자하는 것을 할 수있는 것에 대한 나의 모든 경험에서 지원되지 않습니다. 당신이 언급했듯이, ansible은 암호가없는 sudo가 필요하지 않다고 말하고 정확합니다. 그러나 당연히 여러 구성을 실행하지 않고도 여러 sudo 암호를 사용할 수있는 방법을 아직 보지 못했습니다.
그래서, 당신이 찾고있는 정확한 솔루션을 제공 할 수는 없지만 요청했습니다 …
“그래서 … 이런 상황에서 사람들이 Ansible을 어떻게 사용하고 있습니까? / etc / sudoers에서 NOPASSWD를 설정하고, 호스트에서 암호를 재사용하거나 루트 SSH 로그인을 활성화하면 보안이 크게 저하되는 것 같습니다.”
나는 그것에 대해 하나의 견해를 줄 수 있습니다. 유스 케이스는 글로벌 SaaS 회사를 지원하는 여러 데이터 센터의 1k 노드로, 비즈니스 특성으로 인해 엄청나게 엄격한 보안 제어를 설계 / 구현해야합니다. 보안은 항상 균형을 유지하고, 사용 편의성은 보안 성을 떨어 뜨립니다. 10 대의 서버 또는 1,000 또는 100,000을 실행하는 경우이 프로세스는 다르지 않습니다.
비밀번호 또는 ssh 키를 통해 루트 로그인을 사용하지 않는 것이 절대적으로 정확합니다. 실제로 서버에 네트워크 케이블이 연결되어 있으면 루트 로그인을 완전히 비활성화해야합니다.
대기업에서 암호 재사용에 대해 이야기 할 수 있도록 sysadmins에게 각 노드마다 다른 암호를 요구하도록 요청하는 것이 합리적입니까? 아마도 두 노드에 대해서는 1000 노드에서 다른 암호를 가져야한다면 관리자 / 엔지니어는 음소거 할 것입니다. 거의 불가능한 구현도 각 사용자는 스프레드 시트가 아닌 키 패스 (keypass)가있는 곳에 암호를 저장해야합니다. 암호를 일반 텍스트로 가져올 수있는 위치에 암호를 넣을 때마다 보안이 크게 저하되었습니다. 기계에 로그인하거나 sudo를 호출해야 할 때마다 키 패스 파일을 참조해야하는 것보다 하나 또는 두 개의 정말로 강력한 암호를 알고 있습니다.
따라서 암호 재사용 및 표준화는 안전한 환경에서도 완벽하게 수용 가능하고 표준적인 것입니다. 그렇지 않으면 ldap, keystone 및 기타 디렉토리 서비스가 필요하지 않습니다.
자동화 된 사용자로 옮길 때, ssh 키는 사용자를 참여시키는 데 효과적이지만 여전히 sudo를 거쳐야합니다. 선택은 자동화 된 사용자를위한 표준화 된 비밀번호 (대부분의 경우 허용) 또는 지적한대로 NOPASSWD를 활성화하는 것입니다. 대부분의 자동화 된 사용자는 몇 가지 명령 만 실행하므로 NOPASSWD를 활성화하는 것이 가능하지만 사전 승인 된 명령에 대해서만 가능합니다. 암호가없는 명령 목록을 쉽게 업데이트 할 수 있도록 구성 관리 (이 경우 사용 가능)를 사용하여 sudoers 파일을 관리하는 것이 좋습니다.
이제 위험을 더욱 격리시키기 위해 확장을 시작하면 취할 수있는 몇 가지 단계가 있습니다. 우리는 1000 개 정도의 노드를 가지고 있지만 모든 서버가 ‘생산’서버는 아니며 일부는 테스트 환경 등입니다. 모든 관리자가 프로덕션 서버에 액세스 할 수있는 것은 아니며 다른 서버와 동일한 SSO 사용자 / 패스 | 키를 사용할 수있는 서버 . 그러나 자동화 된 사용자는 좀 더 안전합니다. 예를 들어 비 프로덕션 관리자가 액세스 할 수있는 자동화 된 도구에는 프로덕션에서 사용할 수없는 사용자 및 자격 증명이 있습니다. 모든 노드에서 asible을 시작하려면 프로덕션이 아닌 경우와 프로덕션의 경우 두 개의 배치로 실행해야합니다.
또한 꼭두각시는 강제적 인 구성 관리 도구이기 때문에 모든 환경에 대한 대부분의 변경 사항이 적용되기 때문에 꼭두각시를 사용합니다.
인용 한 기능 요청이 다시 열리거나 완료되면 원하는 것을 완전히 지원할 수 있습니다. 그럼에도 불구하고 보안은 위험 평가 및 타협의 프로세스입니다. 포스트잇 메모를 사용하지 않고 암호를 기억할 수있는 노드가 몇 개만있는 경우 별도의 암호가 약간 더 안전합니다. 그러나 우리 대부분에게는 실현 가능한 옵션이 아닙니다.
답변
Ansible 1.5부터 host_vars 및 기타 변수에 암호화 된 볼트 를 사용할 수 있습니다 . 이렇게하면 최소한 호스트 별 (또는 그룹 별) ansible_sudo_pass
변수를 안전하게 저장할 수 있습니다 . 불행하게도, --ask-vault-pass
호출 할 수있을 때마다 단일 저장소 암호 만 프롬프트하므로 함께 사용할 모든 호스트에 대해 단일 저장소 암호로 제한됩니다.
그럼에도 불구하고 암호화 된 host_vars에 액세스 할 수없는 공격자가 여전히 공격하는 모든 컴퓨터 (또는 컴퓨터 그룹)에 대해 별도의 sudo 암호를 필요로하기 때문에 일부 용도의 경우 여러 호스트에서 단일 sudo 암호를 사용하는 것보다 개선 된 것일 수 있습니다.
답변
Ansible 1.5에서는 다음을 사용하여 ansible_sudo_pass 변수 를 설정할 수 있습니다 lookup('password', …)
.
ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}"
host_vars/
여러 가지 이유로 파일을 사용하는 것보다 이것이 더 편리하다는 것을 알았습니다 .
-
실제로
with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt"
는 배포 원격 사용자 의 암호를 프로비저닝하는 데 사용하므로 sudo에 필요 하므로 이미 파일에 존재합니다 (해당 값을 생성하면 이러한 일반 텍스트 조회를 수행하면 파일에 저장된 솔트 값이 손실되지만) . -
이렇게
ansible_sudo_pass:
하면 암호화 보안이 엡실론 증가하기 위해 파일에 암호 만 ( 알려진 일반 텍스트는 아님) 유지됩니다. 더 중요한 것은 다른 모든 호스트 관련 변수를 암호화하지 않으므로 볼트 암호없이 읽을 수 있다는 의미입니다. -
비밀번호를 별도의 디렉토리에 저장하면 파일을 소스 제어에서 벗어나거나 git-crypt 와 같은 도구를 사용하여 암호화 된 형태로 저장할 수 있습니다 (볼트 기능이없는 초기 Ansible과 함께 사용할 수 있음). 나는 git-crypt를 사용하고 암호화 된 파일 시스템에서 해독 된 형태로 저장소를 체크 아웃하기 때문에 볼트를 신경 쓰지 않으므로 볼트 암호를 입력 할 필요가 없습니다. (둘 다 사용하는 것이 더 안전합니다.)
조회 기능을 ansible_ssh_pass 와 함께 사용할 수도 있습니다 . ansible_sudo_pass 가없는 이전 버전의 Ansible에서도 가능합니다 .
답변
pass를 사용 하는 것은 sudo 암호를 제공하는 간단한 방법입니다. pass는 파일 당 하나의 암호를 저장하므로 git 또는 다른 방법을 통해 암호를 쉽게 공유 할 수 있습니다. 또한 안전합니다 (GnuPG 사용). gpg-agent를 사용하는 경우 각 사용시 암호를 입력하지 않고도 사용할 수 있습니다.
servers/foo
서버용 foo
으로 저장된 비밀번호를 제공하려면 다음과 같이 인벤토리 파일에서 비밀번호를 사용하십시오.
[servers]
foo ansible_sudo=True \
ansible_sudo_pass="{{ lookup('pipe', 'pass servers/foo') }}"
이전에 gpg-agent의 키를 잠금 해제 한 경우 암호를 입력 할 필요없이 사용할 수 있습니다.
답변
그럼에도 불구하고 이것은 매우 오래된 스레드입니다.
- 우리는 두 가지 인증 시스템을 사내에서 사용하며 시스템 관리는 팀의 로컬 워크 스테이션에서 수행됩니다.
- 나는 여러 인증 시스템을 차별화
vars_plugin
하는 Ansible ( https://gist.github.com/mfriedenhagen/e488235d732b7becda81 에서 다소 완전한 구현을 찾을 수 있음 )을 작성했습니다. - 인증 시스템의 이름은 그룹별로 다릅니다.
- 사용 된 로그인 / 스도 사용자는 그룹 및 관리자별로 다릅니다.
- 그래서 암호 환경에서 python-keyring 라이브러리를 통해 관리자 환경에서 해당 암호를 가져옵니다 (Mac OS X의 키 체인을 사용하지만 설명서 kwallet Gnome 및 _win_crypto도 지원됨).
- 명령 줄 프로그램 보안이 호스트가 사용하는 모든 인증 시스템의 암호에 대한 액세스를 요청한다는 사실을 알리기 위해 Mac OS X 키 체인의 암호에 대한 권한을 설정했습니다. 따라서 “anible -s all -m ping” 스페이스 바를 누르면 암호를 선택하는 두 개의 프롬프트 (각 인증 시스템마다 하나씩)가 표시됩니다.
답변
이를 수행하는 한 가지 방법은 환경 변수를 사용하는 것입니다.
예 :
pass1=foo pass2=bar ansible-playbook -i production servers.xml
그런 다음 연극에서 다음을 사용하여 sudo 비밀번호를 찾을 수 있습니다.
lookup('env', 'pass1')
lookup('env', 'pass2')