확실한 보안 모범 사례


37

데이터 센터에 Ansible을 소개하고 제어 시스템을 찾을 수있는 위치와 SSH 키를 관리하는 방법에 대한 보안 모범 사례를 찾고 있습니다.

질문 1 : 제어 기계

물론 제어 기계가 필요합니다. 제어 시스템에는 공개 SSH 키가 저장되어 있습니다. 공격자가 제어 시스템에 액세스 할 수있는 경우 전체 데이터 센터 (또는 Ansible에서 관리하는 서버)에 액세스 할 수 있습니다. 그렇다면 데이터 센터 또는 원격 제어 시스템 (데이터 센터에 원격으로 연결된 랩톱과 같은)에 전용 제어 시스템을 설치하는 것이 더 낫습니까?

모범 사례가 내 노트북 ​​(물론 도난 당할 수는 있지만 공개 키를 클라우드에서 온라인으로 안전하게 저장하거나 휴대용 암호화 된 장치에서 오프라인으로 저장할 수 있음)을 사용하는 경우 일부 웹 인터페이스를 사용해야하는 경우 중앙 머신에 데이터 센터로 설치해야하는 Ansible Tower, Semaphore, Rundeck 또는 Foreman과 같은 Ansible? 보안을 유지하고 "단일 공격 지점"이되지 않도록하는 방법은 무엇입니까?

질문 2 : SSH 키

루트로 실행해야하는 일부 작업 (예 : 소프트웨어 패키지 설치 또는 이와 유사한 것)을 만들려면 Ansible을 사용해야한다고 가정합니다. 최선의 방법은 제어 서버에서 루트 사용자를 사용하는 것이 아니라 sudo 권한을 가진 Ansible의 일반 사용자를 추가하는 것입니다. 그러나 Ansible이 거의 모든 작업을 수행해야하는 경우 sudo를 통해 모든 명령에 액세스 할 수 있어야합니다. 따라서 최선의 선택은 무엇입니까?

  • Ansible이 루트 사용자 (공개 키가 저장된 ~/.ssh/authorized_keys
  • sudo 액세스 권한이있는 Ansible 전용의 권한없는 사용자 만들기
  • Ansible 사용자가 암호를 지정하여 sudo를 통해 모든 명령을 실행할 수있게하십시오 (Ansible을 사용하여 해당 서버를 제어하는 ​​모든 sysadmin이 고유해야 함)
  • Ansible 사용자가 비밀번호를 지정하지 않고 sudo를 통해 모든 명령을 실행할 수 있도록합니다.
  • 다른 힌트?

전용 관리 서브넷 (또는 VLAN)이 필요합니다. 제어 가능한 컴퓨터가 해당 서브넷에 있습니다. 제어 컴퓨터와 통신해야하는 경우 해당 서브넷으로 VPN을 연결합니다. ansible를 근절하지 마십시오
Neil McGuigan

1
Ansible 제어 호스트는 내부 LAN에 있으며 외부에서 액세스 할 수 없지만 충분하지 않다고 생각합니다.
Mat

답변:


15

요새 호스트 (Ansible Control Center)는 별도의 서브넷에 속합니다. 외부에서 직접 액세스 할 수 없어야 하고 관리 서버 에서 직접 액세스 할 수 없어야 합니다!

랩탑은 가장 안전하지 않은 장치입니다. 바보 메일 1 개, 어리석은 플래시 취약점 1 개, 어리석은 손님 Wifi 1 개가 숨겨져 있습니다.

서버의 경우 ssh를 통한 루트 액세스를 허용하지 마십시오. 많은 감사가 이것에 비웃습니다.

가능하면 모든 관리자가 각 대상 서버에서 자신의 개인 계정을 사용하고 암호로 sudo를 사용하게하십시오. 이 방법으로 두 사람이 암호를 공유하지 않습니다. 각 서버에서 누가 무엇을했는지 확인할 수 있습니다. 개인 계정으로 비밀번호, ssh 키만 로그인하거나 둘 다를 요구하는 것은 귀하의 몫입니다.

ansible 을 명확히하기 위해 단일 대상 로그인 이름을 사용할 필요는 없습니다 . 각 관리자는 개인 대상 로그인 이름을 가질 수 있고 있어야합니다.

참고 : 암호가있는 단어 (예 : "anible"또는 "admin"또는 "cluster"또는 "management"또는 "operator")와 같은 계정은 만들지 마십시오. 비밀번호가있는 계정의 유일한 이름은 "jkowalski"와 같은 사람의 이름입니다. 오직 사람 만이 계정을 통해 수행 된 행동에 대해 책임을 질 수 있으며 자신의 암호를 부적절하게 보호 할 책임이 있습니다.


감사합니다. 데이터 센터의 별도 서브넷에서 중앙 집중식 요새 호스트를 사용하는 것에 대해 확신했습니다. 또한 모든 sysadmin마다 한 명의 개인 사용자를 사용하는 것이 가장 좋다는 것을 알고 있지만 이제 다른 질문이 있습니다 (별도의 Serverfault 질문에서 더 낫습니다) : NIS, NFS를 사용하지 않고 Linux 호스트에서 사용자 및 SSH 키를 중앙 집중화하는 방법 주식이나 이와 같은 것? Windows 서버용 Active Directory가 이미 있습니다.
Mat

좋아, 내 질문에 대한 더 나은 생각 나는 두 가지 가능한 답변을 가지고 있습니다 : LDAP 키 저장소 사용 또는 사용자 정의 (아래 두 답변 참조). 하지만 ... 정말로 필요합니까? 아니요, 내 사용자를 사용하여 Ansible 자체를 통해 새 사용자 및 키를 배포하는 경우! :-)
Mat

@Mat, 완전히 동의했습니다-아래에서 말했듯이 팀이 커질 때까지 사용자 정의 또는 유사한 도구가 필요하지 않습니다. LDAP는 설치하기가 쉽지 않지만 (pam_ldap 및 nss_ldap 연구), Ansible, Chef, Puppet 등과 몇 초 안에 통합 할 수있는 도구가 내장되어 있습니다. 또한 무료입니다. <20 서버.
Jamieson Becker

16

> 질문 1 : 제어 기계

Userify (전체 공개 : 우리는 실제로 ssh 키를 관리하기위한 소프트웨어를 제공함)에서 가장 큰 SSH 키웨어 하우스도 실행하기 때문에이를 항상 처리합니다. 일반적으로 클라우드를 사용하는 대신 로컬 설치를 권장합니다. 제어 수준을 높이고 노출 영역을 줄이므로 알려진 신뢰할 수있는 네트워크에 고정시킬 수 있습니다.

기억해야 할 중요한 것은 이와 같이 올바르게 구축 된 시스템 에는 공격자에게 유출 될 수있는 중요한 비밀이 없어야한다는 것 입니다. 누군가가 지게차를 데이터 센터로 몰아 넣고 서버와 함께 걸어 가면 해시 된 암호, 아마도 암호화 된 파일 및 공개 키가 개인 키를 제외하고는 많은 것을 얻지 못할 것입니다. 다시 말해, 그렇게 많지는 않습니다.

지적한 바와 같이 여기서 실제 위협 벡터 는 공격자가 해당 시스템을 제어하고 해당 시스템 을 사용하여 자신의 사용자 계정과 (공용) 키를 배포하는 경우에 발생 합니다. 이는 거의 모든 클라우드 플랫폼 (예 : Linode)에 대한 위험입니다. 컨트롤 플레인에 대한 액세스를 방지하는 데 가장 중점을 두어야합니다. 이는 공격 영역을 최소화하고 (몇 개의 포트만 노출하고 가능한 한 해당 포트를 잠그는 것), 권한 상승 및 다양한 공격에 대비하여 강화 된 소프트웨어를 사용하는 것이 좋습니다 ( SQL injection, XSS, CSRF 등) 제어 평면에 대한 2FA / MFA 액세스를 활성화하고 제어 평면 잠금에 최대한 집중하십시오.

그렇다면 데이터 센터 또는 원격 제어 시스템 (데이터 센터에 원격으로 연결된 랩톱과 같은)에 전용 제어 시스템을 설치하는 것이 더 낫습니까?

그것은이다 확실히 더 나은 당신이 그것을 분리하고 / 방지 도난 또는 무단 액세스의 위험을 최소화하기 위해 그것을 잠글 수 있기 때문에, 안전한 데이터 센터에 전용 제어 기기가 있어야합니다.

가장 좋은 방법은 내 노트북을 사용하는 것입니다 (물론, 도난 당할 수,하지만 난 내 공개 키를 안전하게 휴대용 암호화 되 장치의 클라우드 또는 오프라인에서 온라인으로 저장 가질 수), 경우 나 일부 웹 인터페이스를 사용해야 할 경우 무엇 으로 중앙 머신에 데이터 센터로 설치해야하는 Ansible Tower, Semaphore, Rundeck 또는 Foreman과 같은 Ansible?

서버 수에 따라 사용자 수가 많고 권한 수준이 다르기 때문에 관리 문제를 시작할 수있을만큼 커질 때까지 또는 키를 관리하기 위해 웹 인터페이스 또는 보조 제어 평면 을 실행할 필요가 없습니다 (사용자 정의조차도). 키를 업데이트하기 위해 Ansible에 대한 지식이나 액세스 권한이없는 사용자를위한 핸드 홀드. 처음에 사용자 정의는 많은 쉘 스크립트 (오늘날 아마도 어쩌면 가능할 것입니다) 이상이 아니며 추가 관리 제어가 필요하고 사람들이 쉽게 관리 / 회전 할 수있는 방법이 필요할 때까지 전혀 문제가 없습니다. 자신의 키. (물론, 그 시점에 도달하면 Userify를 살펴보십시오!)

보안을 유지하고 "단일 공격 지점"이되지 않도록하는 방법은 무엇입니까?

물론 인터넷상의 모든 리소스를 확인하여 잠금을 해제하지만 가장 중요한 것은 안전한 기초로 시작하는 것입니다.

1. 처음부터 보안을 염두에두고 솔루션을 설계하십시오. 전통적으로 문제가 적은 기술 (예 : 데이터베이스 또는 언어)을 선택한 다음 보안을 염두에두고 코딩하십시오. 신뢰할 수있는 사용자의 모든 수신 데이터를 삭제하십시오. 편집증은 미덕입니다.

2. 결국 모든 것이 망가집니다. 이미 지적했듯이 비밀 자료의 취급을 최소화하십시오.

3. 단순하게 유지하십시오. 확실하고 확실하게 보안을 향상시킬 수 있다고 확신하지 않는 한 최신 이국적인 작업을 수행하지 마십시오. 예를 들어, 우리는 암호화 계층을 위해 AES 대신 X25519 / NaCl (libsodium)을 선택했습니다. (우리는 신뢰할 수있는 사람 (DJB et al)이 설계하고 작성했으며 세계에서 검토 했으므로) Schneier 및 Google 보안 팀과 같은 유명한 연구원. 단순성으로 인해 더 큰 버그를 감추기가 더 어려워 지므로 단순성으로 향하는 것을 사용하십시오.

4. 보안 표준을 충족하십시오. PCI 또는 HIPAA 보안 규칙과 같은 보안 체제에 속하지 않더라도 해당 표준을 읽고 해당 표준을 충족하는 방법 또는 최소한 매우 강력한 보상 통제를 파악하십시오. 이렇게하면 '모범 사례'를 진정으로 충족시킬 수 있습니다.

5. 외부 / 독립 침투 테스트를 실시하고 버그 바운티실행 하여 지속적으로 모범 사례를 따르고 있는지 확인하십시오. 똑똑하고 동기 부여가 많은 사람들이 그것을 습격 할 때까지 모든 것이 멋지게 보입니다. 일단 완료되면 솔루션에 대해 많은 자신감을 갖게됩니다.


질문 2 : SSH 키 최선의 선택 : Ansible이 루트 사용자를 사용하게하십시오 (공개 키가 저장된 ~/.ssh/authorized_keys/ Ansible 사용자가 암호를 지정하여 sudo를 통해 모든 명령을 실행할 수있게하십시오 (모든 sysadmin이 고유하게 알고 있어야 함) Ansible을 사용하여 해당 서버를 제어합니다)

sudo에도 서버에서 비밀번호를 사용하지 마십시오. 그것은 비밀을 다루고 궁극적으로 보안을 약화시킬 것입니다 (기계간에 sudo 암호를 매우 쉽게 바꿀 수는 없으며 어딘가에 저장해야합니다. 암호는 서버 대 서버 자동화를 실제로 수행 할 수 없음을 의미합니다 또한 SSH를 기본값으로두면 암호가 무차별 적으로 적용되어 키가 다소 의미가 없게 될 수 있으며 루트 사용자가 어떤 목적 으로든 특히 원격 로그인에 사용하지 않도록하십시오.

sudo 액세스 권한이있는 Ansible 전용 권한이없는 사용자를 작성하십시오. Ansible 사용자는 비밀번호를 지정하지 않고 sudo를 통해 모든 명령을 실행할 수 있습니다.

정확하게. sudo 역할을 사용하여 권한을 다시 감사 할 수있는 권한이없는 사용자입니다. 이상적으로는 sudo 액세스 (비밀번호없이)를 통한 서버 간 통신 및 전용 통신 전용 표준 사용자를 작성하십시오.

... NB, Userify를 사용하는 경우, 제안 할 수있는 방법은 Userify 사용자를 만들 수있는 것입니다 (여러 개의 제어 가능한 시스템이있는 경우 프로젝트 또는 서버 그룹별로 분류 할 수 있음). 제어 서버에서 SSH 키를 사용하고 Userify 프로파일 페이지에서 공개 키를 제공하십시오. 이 텍스트 상자는 기본적으로가됩니다 /home/ansible/.ssh/authorized_keys. 원격 백업 계정, 비밀 관리 등과 같은 다른 서버 간 시스템 계정과 분리 가능한 시스템 계정을 유지해야합니다. 그런 다음 사람을 초대하면 자신의 키를 만들고 관리 할 수 ​​있으며 모든 것이 분리 된 상태로 유지됩니다. 그러나 Ansible 제어 서버를 잠그는 것과 마찬가지로 Userify 서버 (또는 배포 한 솔루션)를 같은 방식으로 잠그십시오.

다른 힌트?

나는 당신이 분명히 올바른 길을 가고 올바른 질문을하고 있다고 생각합니다. 이런 종류의 일에 대해 논의하고 싶다면, 나에게 이메일을 보내십시오 (userify의 첫 번째 점 성). 궁극적으로 어떤 방향을 추구하든 대화를 나눌 수있어서 기쁩니다. 행운을 빕니다!


5

답변 1 : 제어 기계

둘 다, 랩톱을 사용하여 요새 호스트 VIA 서버에 연결할 수 있습니다. 같은 :

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

요새 호스트에 대한 추가 정보

요새 서버의 키가 있고 그 뒤에 호스트의 별도 키가있는 경우 (개인적으로 gpg-agent / ssh-agent를 사용합니다)

답변 2 : 인증

"사용 가능한"특정 모범 사례가 다른 ssh 연결 모범 사례와 어떻게 다른지 잘 모르겠습니다. 그러나 서비스 계정이 아니라 루트 계정이 아닌 자신만으로 실행 가능합니다.

다음 인증의 조합 :

다른 생각들:

  • 비밀 / 개인 정보는 항상 안전한 볼트에 저장하십시오.
  • Andoible은 실행중인 작업에 sudo / root가 필요하지 않으면 SUDO / Root를 실행할 필요가 없습니다.
  • Ansible은 다양한 방법으로 권한을 상승시킬 수 있습니다

마지막으로, 창문에 대해서는 언급하지 않았습니다. 그래서 나는 당신이 이것을 사용하지 않는다고 가정 할 수 있습니다. 그러나이 경우 위임 옵션을 사용하여 랩톱에서 요새 호스트 (delegate_to bastion.hostname.fqdn:) 및 kerberos / winrm https를 kerberos 티켓과 함께 사용하도록합니다.

당신이 그것을 놓친 경우, 컴퓨팅을위한 모범 사례, 루트로 아무것도하지 말고 항상 명명 된 계정을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.