Ansible an toàn thực hành tốt nhất


37

Tôi sẽ giới thiệu Ansible vào trung tâm dữ liệu của mình và tôi đang tìm kiếm một số thực tiễn bảo mật tốt nhất về vị trí đặt máy điều khiển và cách quản lý các khóa SSH.

Câu 1: máy điều khiển

Tất nhiên chúng ta cần một máy điều khiển. Máy điều khiển có các khóa SSH công khai được lưu trên đó. Nếu kẻ tấn công có quyền truy cập vào máy điều khiển, nó có khả năng có quyền truy cập vào toàn bộ trung tâm dữ liệu (hoặc đến các máy chủ do Ansible quản lý). Vì vậy, tốt hơn là có một máy điều khiển chuyên dụng trong trung tâm dữ liệu hoặc máy điều khiển từ xa (như máy tính xách tay của tôi được kết nối từ xa với trung tâm dữ liệu)?

Nếu cách tốt nhất là sử dụng máy tính xách tay của tôi (tất nhiên có thể bị đánh cắp, nhưng tôi có thể lưu các khóa công khai của mình một cách an toàn trực tuyến trên đám mây hoặc ngoại tuyến trên thiết bị được mã hóa di động), nếu tôi cần sử dụng một số giao diện web với Ansible, như Ansible Tower, Semaphore, Rundeck hay Foreman cần được cài đặt trên một máy tập trung vào trung tâm dữ liệu? Làm thế nào để bảo vệ nó và tránh nó trở thành một "điểm tấn công duy nhất"?

Câu hỏi 2: các khóa SSH

Giả sử rằng tôi cần sử dụng Ansible để thực hiện một số tác vụ cần được thực thi bằng root (như cài đặt gói phần mềm hoặc một cái gì đó như thế này). Tôi nghĩ cách tốt nhất không phải là sử dụng người dùng root trên các máy chủ được kiểm soát, mà là thêm một người dùng bình thường cho Ansible với quyền sudo. Nhưng, nếu Ansible cần thực hiện hầu hết mọi tác vụ, nó cần có quyền truy cập vào mọi lệnh thông qua sudo. Vì vậy, sự lựa chọn tốt nhất là gì:

  • hãy để Ansible sử dụng người dùng root (với khóa công khai được lưu trong ~/.ssh/authorized_keys
  • tạo một người dùng không có đặc quyền dành riêng cho Ansible với quyền truy cập sudo
  • hãy để người dùng Ansible chạy mọi lệnh thông qua sudo chỉ định mật khẩu (đây là nhu cầu duy nhất được biết bởi mọi sysadmin sử dụng Ansible để điều khiển máy chủ đó)
  • cho phép người dùng Ansible chạy mọi lệnh thông qua sudo mà không chỉ định bất kỳ mật khẩu nào
  • bất kỳ gợi ý khác?

bạn muốn có một mạng con quản lý chuyên dụng (hoặc Vlan). máy tính điều khiển ansible của bạn là trên mạng con đó. Nếu bạn cần liên lạc với máy tính điều khiển, bạn hãy VPN vào mạng con đó. Đừng để ansible được root
Neil McGuigan

1
Máy chủ điều khiển Ansible sẽ nằm trong mạng LAN nội bộ và sẽ không thể truy cập được từ bên ngoài, nhưng tôi nghĩ điều này là không đủ.
Mat

Câu trả lời:


15

Máy chủ pháo đài (trung tâm điều khiển ansible) thuộc về một mạng con riêng biệt. Không nên truy cập trực tiếp từ bên ngoài, không nên truy cập trực tiếp từ các máy chủ được quản lý!

Máy tính xách tay của bạn là thiết bị kém an toàn nhất trong tất cả. Một thư ngu ngốc, một lỗ hổng flash ngu ngốc, một Wifi khách ngu ngốc và nó bị xóa.

Đối với máy chủ, không cho phép truy cập root thông qua ssh. Nhiều kiểm toán chế giễu điều này.

Đối với ansible, hãy để mọi quản trị viên sử dụng tài khoản cá nhân của riêng họ trên mỗi máy chủ mục tiêu và để họ sudo với mật khẩu. Cách này không có mật khẩu được chia sẻ giữa hai người. Bạn có thể kiểm tra ai đã làm gì trên mỗi máy chủ. Tùy thuộc vào bạn nếu tài khoản cá nhân cho phép đăng nhập bằng mật khẩu, chỉ khóa ssh hoặc yêu cầu cả hai.

Để làm rõ ansible không yêu cầu sử dụng một tên đăng nhập mục tiêu duy nhất . Mỗi quản trị viên có thể và nên có tên đăng nhập mục tiêu cá nhân.

Lưu ý bên lề: Cố gắng không bao giờ tạo tài khoản được gọi là một số từ (như "ansible" hoặc "admin" hoặc "cluster" hoặc "manager" hoặc "toán tử") nếu nó có mật khẩu. Tên tốt duy nhất cho tài khoản có mật khẩu là tên của một con người, như "jkowalski". Chỉ một con người có thể chịu trách nhiệm cho các hành động được thực hiện thông qua tài khoản và chịu trách nhiệm bảo mật không đúng mật khẩu của họ, "ansible" không thể.


Cảm ơn, bạn đã thuyết phục tôi về việc sử dụng máy chủ pháo đài tập trung trong một mạng con riêng trong trung tâm dữ liệu. Tôi cũng nhận thức được rằng tốt nhất là sử dụng một người dùng cá nhân cho mỗi sysadmin, nhưng bây giờ tôi có một câu hỏi khác (có lẽ điều này sẽ tốt hơn cho một câu hỏi Serverfault riêng): cách tập trung người dùng và khóa SSH trên máy chủ Linux mà không sử dụng NIS, NFS cổ phiếu hoặc một cái gì đó như thế này? Xin lưu ý rằng tôi đã có Active Directory cho máy chủ Windows.
Mat

Ok, suy nghĩ tốt hơn cho câu hỏi của tôi Tôi có hai câu trả lời có thể: sử dụng lưu trữ khóa LDAP hoặc Userify (xem hai câu trả lời bên dưới). Nhưng ... tôi có thực sự cần nó không? Không, nếu tôi sử dụng người dùng của riêng mình để triển khai người dùng và khóa mới thông qua chính Ansible! :-)
Mat

@Mat, đã đồng ý hoàn toàn - như tôi đã nói dưới đây, bạn thực sự không cần Userify hoặc bất kỳ công cụ tương tự nào cho đến khi nhóm của bạn lớn hơn. . <20 máy chủ.
Jamieson Becker

16

> Câu hỏi 1: máy điều khiển

Tại Userify (công bố đầy đủ: chúng tôi thực sự cung cấp phần mềm để quản lý khóa ssh), chúng tôi luôn xử lý vấn đề này vì chúng tôi cũng chạy kho khóa SSH lớn nhất. Chúng tôi thường khuyên bạn nên cài đặt cục bộ thay vì sử dụng đám mây, vì bạn đã tăng quyền kiểm soát, giảm diện tích bề mặt của bạn, bạn thực sự có thể khóa nó xuống các mạng đáng tin cậy đã biết.

Điều quan trọng cần nhớ là, trong một hệ thống được xây dựng đúng cách như thế này, thực sự không nên có bất kỳ bí mật quan trọng nào có thể bị rò rỉ cho kẻ tấn công. Nếu ai đó lái xe nâng vào trung tâm dữ liệu của bạn và bỏ đi với máy chủ của bạn, họ sẽ không nhận được rất nhiều ngoại trừ một số mật khẩu bị băm nặng, có thể là một số tệp được mã hóa mạnh và một số khóa công khai không có khóa riêng tương ứng. Nói cách khác, không nhiều lắm.

Như bạn chỉ ra, các vectơ đe dọa thực sự ở đây là những gì xảy ra nếu kẻ tấn công giành quyền kiểm soát máy đó và sử dụng nó để triển khai tài khoản người dùng và khóa (công khai) của riêng chúng. Đây là một rủi ro cho hầu hết mọi nền tảng đám mây (ví dụ: Linode). Bạn nên tập trung mạnh mẽ nhất vào việc ngăn chặn truy cập vào mặt phẳng điều khiển, điều đó có nghĩa là giảm thiểu bề mặt tấn công (chỉ để lộ một vài cổng và khóa các cổng đó càng nhiều càng tốt) và tốt nhất là sử dụng phần mềm được tăng cường chống lại sự leo thang đặc quyền và các cuộc tấn công khác nhau ( SQL tiêm, XSS, CSRF, v.v.) Cho phép truy cập 2FA / MFA vào mặt phẳng điều khiển và tập trung vào việc khóa mặt phẳng điều khiển đó càng nhiều càng tốt.

Vì vậy, tốt hơn là có một máy điều khiển chuyên dụng trong trung tâm dữ liệu hoặc máy điều khiển từ xa (như máy tính xách tay của tôi được kết nối từ xa với trung tâm dữ liệu)?

Đó là chắc chắn tốt hơn để có một máy điều khiển chuyên dụng trong một trung tâm dữ liệu an toàn, bởi vì bạn có thể cô lập nó và khóa nó xuống để ngăn chặn / hạn chế tối đa nguy cơ bị trộm cắp hoặc truy cập trái phép.

Nếu cách tốt nhất là sử dụng máy tính xách tay của tôi (tất nhiên có thể bị đánh cắp, nhưng tôi có thể lưu các khóa công khai của mình một cách an toàn trực tuyến trên đám mây hoặc ngoại tuyến trên thiết bị được mã hóa di động), nếu tôi cần sử dụng một số giao diện web với Ansible, như Ansible Tower, Semaphore, Rundeck hay Foreman cần được cài đặt trên một máy tập trung vào trung tâm dữ liệu?

Bạn không cần chạy BẤT K interface giao diện web hoặc mặt phẳng điều khiển phụ nào để quản lý các khóa của mình (thậm chí là Userify) cho đến khi bạn đủ lớn để bắt đầu gặp sự cố quản lý do số lượng người dùng lớn hơn và các cấp ủy quyền khác nhau trên các máy chủ hoặc cần thêm cầm tay cho người dùng của bạn, những người có thể không có kiến ​​thức hoặc quyền truy cập vào Ansible để cập nhật khóa. Ban đầu sử dụng không nhiều hơn một loạt các tập lệnh shell (ngày nay chúng có thể là Ansible, có lẽ vậy!) Và không có gì sai với điều đó, cho đến khi bạn bắt đầu cần kiểm soát quản lý bổ sung và cách dễ dàng để mọi người quản lý / xoay vòng chìa khóa riêng. (Tất nhiên, vui lòng xem Userify nếu bạn đến điểm đó!)

Làm thế nào để bảo vệ nó và tránh nó trở thành một "điểm tấn công duy nhất"?

Chà, tất nhiên hãy kiểm tra tất cả các tài nguyên trên mạng để khóa mọi thứ, nhưng quan trọng nhất là bắt đầu với một nền tảng an toàn:

1. Kiến trúc sư giải pháp của bạn với sự an toàn trong tâm trí ngay từ đầu. Chọn công nghệ (nghĩa là cơ sở dữ liệu hoặc ngôn ngữ) theo truyền thống có ít vấn đề hơn và sau đó mã hóa với bảo mật ngay từ đầu. Vệ sinh tất cả dữ liệu đến, ngay cả từ người dùng đáng tin cậy. Chứng hoang tưởng là một đức tính.

2. Cuối cùng, mọi thứ đều bị phá vỡ. Giảm thiểu thiệt hại khi điều đó xảy ra: như bạn đã chỉ ra, cố gắng giảm thiểu việc xử lý tài liệu bí mật.

3. Giữ cho nó đơn giản. Đừng làm những thứ kỳ lạ mới nhất trừ khi bạn chắc chắn nó sẽ tăng cường bảo mật và chắc chắn. Ví dụ: chúng tôi đã chọn X25519 / NaCl (libsodium) trên AES cho lớp mã hóa của chúng tôi (chúng tôi mã hóa mọi thứ, khi nghỉ ngơi và chuyển động), vì nó ban đầu được thiết kế và viết bởi một người mà chúng tôi tin tưởng (DJB et al) và đã được thế giới xem xét các nhà nghiên cứu nổi tiếng như Schneier và nhóm bảo mật của Google. Sử dụng những thứ có xu hướng đơn giản nếu chúng mới hơn, vì sự đơn giản làm cho việc che giấu các lỗi sâu khó khăn hơn.

4. Đáp ứng các tiêu chuẩn bảo mật. Ngay cả khi bạn không rơi vào chế độ bảo mật như PCI hoặc Quy tắc bảo mật HIPAA, hãy đọc qua các tiêu chuẩn đó và tìm ra cách đáp ứng chúng hoặc ít nhất là các biện pháp kiểm soát bù rất mạnh. Điều này sẽ giúp đảm bảo rằng bạn đang thực sự đáp ứng 'các thực tiễn tốt nhất'.

5. Đưa vào thử nghiệm thâm nhập bên ngoài / độc lập và chạy tiền thưởng lỗi để đảm bảo bạn đang theo dõi các thực tiễn tốt nhất đó trên cơ sở đang diễn ra. Mọi thứ đều tuyệt vời cho đến khi bạn có được một số người thông minh và có động lực cao đập vào nó ... một khi kết thúc, bạn sẽ có niềm tin rất lớn vào giải pháp của mình.


Câu hỏi 2: các khóa SSH Lựa chọn tốt nhất là gì: hãy để Ansible sử dụng người dùng root (với khóa công khai được lưu trong ~/.ssh/authorized_keys/ để người dùng Ansible chạy mọi lệnh thông qua sudo chỉ định mật khẩu (mỗi sysadmin cần biết duy nhất trong đó sử dụng Ansible để kiểm soát các máy chủ đó)

Cố gắng tránh sử dụng mật khẩu trên các máy chủ, ngay cả đối với sudo. Đó là xử lý các bí mật và cuối cùng sẽ làm suy yếu bảo mật của bạn (bạn thực sự không thể thay đổi mật khẩu sudo giữa các máy rất dễ dàng, bạn phải lưu trữ nó ở đâu đó, mật khẩu có nghĩa là bạn thực sự không thể tự động hóa máy chủ đến máy chủ Ngoài ra, nếu bạn để SSH ở chế độ mặc định, các mật khẩu đó có thể bị ép buộc, điều này làm cho các khóa trở nên vô nghĩa. Ngoài ra, hãy tránh sử dụng người dùng root cho bất kỳ mục đích nào và đặc biệt là đăng nhập từ xa.

Tạo người dùng không có đặc quyền dành riêng cho Ansible với quyền truy cập sudo / để người dùng Ansible chạy mọi lệnh thông qua sudo mà không chỉ định bất kỳ mật khẩu nào

Chính xác. Một người dùng không có đặc quyền mà bạn có thể kiểm toán lại thành vô hình, với các vai trò sudo. Lý tưởng nhất là tạo một người dùng tiêu chuẩn dành riêng cho giao tiếp giữa máy chủ với máy chủ / ansible với quyền truy cập sudo (không có mật khẩu).

... NB, nếu bạn đang sử dụng Userify, cách tôi khuyên bạn nên làm là tạo một người dùng Userify cho ansible (bạn cũng có thể phá vỡ điều này theo dự án hoặc thậm chí nhóm máy chủ nếu bạn có nhiều máy điều khiển ansible), tạo một khóa SSH trên máy chủ điều khiển và cung cấp khóa chung của nó trong trang hồ sơ Userify của nó. (Hộp văn bản này về cơ bản trở thành /home/ansible/.ssh/authorized_keys). Bạn nên tách tài khoản hệ thống ansible tách biệt với các tài khoản hệ thống từ máy chủ đến máy chủ khác như tài khoản sao lưu từ xa, quản lý bí mật, v.v. Sau đó mời con người của bạn và họ cũng có thể tạo và quản lý khóa riêng của họ và mọi thứ vẫn tách biệt. Nhưng, giống như với việc khóa máy chủ điều khiển Ansible, hãy thử khóa máy chủ Userify của bạn (hoặc bất kỳ giải pháp nào bạn triển khai) theo cùng một cách.

bất kỳ gợi ý khác?

Tôi nghĩ rằng bạn chắc chắn sẽ đi đúng hướng và hỏi đúng câu hỏi. Nếu bạn muốn thảo luận về vấn đề này, hãy gửi email cho tôi (dấu chấm tên cuối cùng tại userify) và tôi rất vui khi được trò chuyện cho dù cuối cùng bạn theo đuổi hướng nào. Chúc may mắn!


5

Trả lời 1: máy điều khiển

Một chút của cả hai, bạn có thể sử dụng máy tính xách tay của mình để kết nối với máy chủ VIA một máy chủ pháo đài. cái gì đó như:

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

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Thêm thông tin về máy chủ pháo đài

Nơi bạn có một khóa cho máy chủ pháo đài, và sau đó là một khóa riêng cho máy chủ đằng sau nó. (cá nhân tôi sẽ sử dụng gpg-agent / ssh-agent)

Trả lời 2: Xác thực

Tôi không chắc các thực tiễn tốt nhất cụ thể "ansible" khác với các thực tiễn tốt nhất về kết nối ssh khác như thế nào Nhưng không, bạn muốn chạy ansible như chính mình, không phải tài khoản dịch vụ và không phải tài khoản root.

Kết hợp các xác thực sau:

Những suy nghĩ khác:

  • Luôn lưu trữ bí mật / thông tin cá nhân trong kho tiền.
  • Ansible không yêu cầu SUDO / Root để chạy, trừ khi những gì bạn đang làm yêu cầu sudo / root.
  • Ansible có thể nâng cao quyền theo nhiều cách khác nhau

Cuối cùng, bạn không đề cập gì về windows. Vì vậy, tôi chỉ có thể giả sử bạn không sử dụng này. Tuy nhiên, trong trường hợp này, tôi sẽ sử dụng tùy chọn đại biểu để máy tính xách tay của bạn sử dụng máy chủ pháo đài (Boulevardate_to bastion.hostname.fqdn:) và kerberos / winrm https với vé kerberos.

Trong trường hợp bạn bỏ lỡ nó, thực hành tốt nhất cho máy tính, không bao giờ làm bất cứ điều gì như root, luôn luôn sử dụng các tài khoản được đặt tên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.