> 질문 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의 첫 번째 점 성). 궁극적으로 어떤 방향을 추구하든 대화를 나눌 수있어서 기쁩니다. 행운을 빕니다!