Nơi đặt mật khẩu ansible-vault


24

Chúng tôi đang lên kế hoạch sử dụng kho tiền ansible trong dự án của chúng tôi để ngăn chặn rò rỉ mật khẩu hoặc khóa trong git.

Ý tưởng là đưa tất cả dữ liệu nhạy cảm của chúng tôi vào một tệp đơn giản sau đó mã hóa tệp này bằng ansible-vault bằng mật khẩu trước khi đẩy sang git.

Để giải mã tập tin, chúng ta phải chuyển mật khẩu vault sang ansible, tôi đang nghĩ về 3 khả năng:

  • Lưu trữ nó trong một biến môi trường máy chủ
  • Truyền nó dưới dạng tùy chọn cho lệnh ansible-playbook
  • Lưu nó vào một tập tin không phiên bản.

Có bất kỳ tùy chọn nào khác, đó là cách tốt nhất (và an toàn) để lưu trữ mật khẩu ansible-vault, tài liệu thực hành tốt nhất có thể không nói gì về điều này.


Cuộc nói chuyện rất có liên quan: danielsomerfield.github.io/turtles
Xiong Chiamiov

Có một số câu trả lời hay ở đây: devops.stackexchange.com/questions/3806/NH
Vish

Câu trả lời:


12

Ý tưởng là đưa tất cả dữ liệu nhạy cảm của chúng tôi [...]

Ý nghĩa của "tất cả" trong câu này cần được phân tích rất cẩn thận trước khi thực hiện giải pháp mà bạn dự định.

Ansible vault là một công cụ rất hữu ích, nhưng nó chỉ nên được sử dụng để lưu trữ các bí mật đó là:

  1. Cụ thể cần thiết cho việc triển khai ansible
  2. Dễ dàng làm cho vô dụng đối với các chủ sở hữu nên không biết về họ, nhưng điều đó có thể "nhớ" họ một cách bất hợp pháp (thường là nhân viên nghỉ việc)

Điểm thứ hai là quan trọng.

Nhiều người, và có khả năng là toàn bộ nhóm DevOps, sẽ có quyền truy cập vào mật khẩu kho tiền an toàn và do đó tất cả các bí mật.

Do đó, đối với tất cả các bí mật được lưu trữ trong kho tiền, cần phải có một điều kiện mà một người hoặc máy có quyền truy cập trái phép vào họ sẽ không có khả năng sử dụng chúng nếu muốn.

Nói một cách cụ thể, nếu bạn sử dụng ansible để triển khai cơ sở dữ liệu và người dùng của nó, bạn có thể lưu trữ mật khẩu trong kho tiền, nhưng bạn sẽ phải rất cẩn thận (và rất có thể sẽ xem xét một giải pháp khác) nếu dịch vụ đó sẽ có sẵn từ Internet và không cần bất kỳ xác thực VPN nào!

Người dùng (DevOps) tiếp xúc với bí mật, sẽ không thể sử dụng mật khẩu "đã nhớ" nếu một rào cản bảo mật được áp đặt cho họ (ví dụ: thu hồi quyền truy cập VPN). Ngoài ra, quyền truy cập vào kho lưu trữ mã nguồn (nơi lưu trữ vault) cũng nên được thu hồi trước khi mật khẩu được thay đổi.

Trong những điều kiện này, ansible vault là một công cụ rất hữu ích.

Cố gắng lưu trữ một bí mật có thể được sử dụng bởi bất kỳ người nào hoặc máy trên Internet trong kho tiền sẽ là một sai lầm (ví dụ: thông tin đăng nhập VPN của người dùng).

Có lựa chọn nào khác không, đó là cách tốt nhất (và an toàn) để lưu trữ mật khẩu ansible-vault

Theo các điều kiện từ đoạn trước, tôi nghĩ rằng một thực hành tốt sẽ là:

  1. Lưu trữ mật khẩu vault trong một hầm bảo mật bên ngoài (một cái gì đó như Vault từ HashiCorp hoặc bất kỳ SaaS nào để quản lý thông tin đăng nhập)
  2. Cho phép truy cập vào mục kho tiền bên ngoài vào DevOps (họ sẽ cần mật khẩu để kiểm tra) và hệ thống CI / CD hoặc bộ điều khiển ansible
  3. Giữ một quy ước để sử dụng bí mật ! Bạn sẽ không thể xem xét các thay đổi đối với các bí mật và bạn sẽ không thể grep cho các biến có thể tìm thấy trong các tệp bí mật! Vì vậy, hãy cẩn thận kể từ đầu. Một quy ước tốt là đặt tên cho tất cả các biến được lưu trữ trong hầm ansible với secret_tiền tố. Khi bạn sẽ thấy một cái gì đó như:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    bạn sẽ biết rằng giá trị được lưu trữ trong hầm ansible.


Điểm hay về việc lưu trữ mật khẩu Ansible Vault ở một nơi an toàn hơn (HashiCorp Vault hoặc SaaS vault như AWS Secrets Manager). Tuy nhiên, nó vẫn cần phải được xoay (thay đổi) nếu ai đó rời khỏi đội, vì họ đã có quyền truy cập vào nó ngay cả khi chỉ trong một thời gian ngắn. Điều này có thể được giảm thiểu bằng cách sử dụng các kho riêng biệt (dev, test, sản xuất) tức là các tệp bí mật trong YAML. Ansible 2.4+ cũng cho phép bạn chỉ định các mật khẩu khác nhau cho các tệp đó bằng cách sử dụng 'ID vault' - trang tài liệu
RichVel

Ansible 2.3 đã giới thiệu một tính năng chỉ mã hóa các giá trị trong các tệp YAML, chứ không phải toàn bộ tệp - điều này đơn giản để duy trì hơn so với quy ước cũ hơn mà bạn đề cập ở điểm 3 ở cuối câu trả lời này.
RichVel

6

Chúng tôi đang lên kế hoạch sử dụng kho tiền ansible trong dự án của chúng tôi để ngăn chặn rò rỉ mật khẩu hoặc khóa trong git.

Vì bạn chưa thực hiện bất cứ điều gì, bạn có thể xem xét lại điều này. Sử dụng một hệ thống như Ansible vault có một số nhược điểm bảo mật:

  • không có dấu vết kiểm toán của những người đã truy cập nó
  • Khi một nhân viên rời đi, họ dễ dàng mang theo cửa hàng bí mật với họ
  • khi một nhân viên rời đi, xóa quyền truy cập của họ đồng nghĩa với việc thay đổi mật khẩu và phân phối lại cho những người khác
  • một mật khẩu kho tiền Ansible bị xâm phạm có thể được sử dụng mãi mãi trên một phiên bản cũ của kho tiền, như được lưu trữ trong kiểm soát phiên bản
  • bí mật phải tĩnh

Một hệ thống có khả năng bảo mật cao hơn, mặc dù phức tạp hơn, không có những nhược điểm này là sử dụng Hashicorp Vault để lưu trữ bí mật của bạn. Sau đó, bạn vẫn có thể lấy các giá trị từ nó gần như dễ dàng như từ Ansible vault bằng cách sử dụng https://github.com/jhaals/ansible-vault .

Sau đó, bạn phải quản lý xác thực cho Hashicorp Vault, và đó là câu hỏi rùa . Đối với con người, tôi nghĩ giải pháp tốt nhất là nhắc mật khẩu định kỳ và hết hạn mã thông báo sau một khoảng thời gian ngắn; đối với máy, để sử dụng phụ trợ xác thực AWS hoặc tương tự. Bạn không bao giờ có thể hoàn toàn thoát khỏi nhu cầu xác thực ở đâu đó, nhưng bạn có thể khiến kẻ tấn công gặp khó khăn hơn trong việc truy cập vào nó.

Bây giờ, nếu thiết lập và quản trị một máy chủ bí mật là quá nhiều đối với bạn, thì chắc chắn bạn chỉ có thể sử dụng Ansible vault. Tại sao lưu trữ mật khẩu ở tất cả các máy cá nhân? Để sử dụng tương tác, bạn chỉ cần nhắc mật khẩu và người dùng có thể lưu nó trong trình quản lý mật khẩu mà họ chọn. iTerm trên OS X có trình quản lý mật khẩu tích hợp với Keychain.app giúp việc này trở nên đặc biệt dễ dàng ở đó.


1
Cách tốt nhất để sử dụng kho tiền ansible là không sử dụng nó .. Cảm ơn bạn đã chỉ ra điều đó!
bão

Đối với các tổ chức vừa và nhỏ, tôi khuyên bạn nên xem xét một trình quản lý bí mật dựa trên đám mây như AWS Secrets Manager - công việc này ít hơn nhiều so với việc chạy một cụm khả dụng cao cho HashiCorp Vault, nhưng cải thiện lớn về bảo mật mà bạn có được với Ansible Vault, bao gồm kiểm toán và kiểm soát truy cập chi tiết. Tất nhiên, bạn kết thúc tùy thuộc vào dịch vụ đó nhưng điều đó có thể được gói gọn với một số mã hóa ứng dụng và công việc Ansible. Lợi ích chính là một số bí mật không cần phải được quản lý bởi Ansible, ví dụ mật khẩu DB - chỉ cần để ứng dụng lấy bí mật từ người quản lý bí mật.
RichVel

3

Điều này khá giống với những chính sách nội bộ mà bạn có trong việc xử lý dữ liệu nhạy cảm.

Tôi muốn nói với bạn cách tiếp cận của tôi với điều này và giải thích những gì tôi thấy là ưu và nhược điểm. Tôi giữ mật khẩu Ansible Vault trong một tệp trên máy điều khiển và có một biến môi trường trỏ đến nó:

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

Tôi có cái đó trên máy trạm của mình (vì tôi cần kiểm tra & phát triển playbook), một số đồng nghiệp cũng có nó, và tất nhiên chúng tôi có nó trên máy điều khiển Ansible chính.

Ưu điểm:

  • không phải trong một vị trí / kho lưu trữ được chia sẻ (đó là một tệp không được phiên bản như bạn nói)
  • người ta không cần biết mật khẩu kho tiền Ansible của bạn để chạy một trò chơi (điều này là trong điều kiện bạn có một công cụ CI, ví dụ Jenkins, nơi bạn có thể dễ dàng khởi chạy playbook)

Nhược điểm:

  • không dễ xoay mật khẩu
  • tất cả những người làm việc trên Playbook của bạn cần phải có nó trên máy trạm của anh ấy

Nhược điểm có giảm nhẹ, nhưng một lần nữa, nó phụ thuộc vào các chính sách và quy tắc bạn đã áp dụng trong các hoạt động hàng ngày.


1
Combinaison đẹp .. kiểm tra câu trả lời khác mặc dù nó có thể được bạn quan tâm.
bão

0

Hãy xem dự án này để quản lý mật khẩu mã hóa kho tiền an toàn của bạn https://github.com/Smile-SA/ansible-vault-manager

Nó xử lý nhiều nền tảng lưu trữ khóa với các plugin (hiện tại chỉ có AWS SSM được triển khai). Tích hợp nhiều hơn với một dự án Ansible hiện tại là rất dễ dàng ...


Nó sẽ giúp nếu bạn làm cho cụ thể dễ dàng hơn thay vì thêm một cái gì đó chung chung. Tôi đã đọc README của trang github, nhưng bạn có thể thay đổi câu trả lời để nó chứa một ví dụ rõ ràng không? Tôi muốn thử nó.
030
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.