> 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!