Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux
В một trong những bài viết trước của chúng tôi chúng tôi đã nói về tầm quan trọng của xác thực hai yếu tố trên cổng thông tin doanh nghiệp của các công ty. Lần trước chúng tôi đã trình bày cách thiết lập xác thực an toàn trong máy chủ web IIS.

Trong phần nhận xét, chúng tôi được yêu cầu viết hướng dẫn cho các máy chủ web phổ biến nhất dành cho Linux - nginx và Apache.

Bạn đã hỏi - chúng tôi đã viết.

Bạn cần gì để bắt đầu?

  • Bất kỳ bản phân phối Linux hiện đại nào. Tôi đã thiết lập thử nghiệm trên MX Linux 18.2_x64. Tất nhiên đây không phải là bản phân phối máy chủ, nhưng chắc chắn sẽ không có bất kỳ sự khác biệt nào đối với Debian. Đối với các bản phân phối khác, đường dẫn đến thư viện cấu hình có thể thay đổi một chút.
  • Mã thông báo. Chúng tôi tiếp tục sử dụng mô hình Rutoken EDS PKI, lý tưởng về đặc tính tốc độ để sử dụng cho doanh nghiệp.
  • Để làm việc với mã thông báo trong Linux, bạn cần cài đặt các gói sau:
    libccid libpcsclite1pcscdpcsc-công cụ opensc

Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

Cấp giấy chứng nhận

Trong các bài viết trước, chúng tôi đã dựa vào thực tế là các chứng chỉ máy chủ và máy khách sẽ được cấp bằng Microsoft CA. Nhưng vì chúng tôi đang thiết lập mọi thứ trong Linux nên chúng tôi cũng sẽ cho bạn biết về một cách khác để cấp các chứng chỉ này - mà không cần rời khỏi Linux.
Chúng tôi sẽ sử dụng XCA làm CA (https://hohnstaedt.de/xca/), có sẵn trên mọi bản phân phối Linux hiện đại. Tất cả các hành động mà chúng tôi sẽ thực hiện trong XCA có thể được thực hiện ở chế độ dòng lệnh bằng cách sử dụng các tiện ích công cụ OpenSSL và pkcs11, nhưng để đơn giản và rõ ràng hơn, chúng tôi sẽ không trình bày chúng trong bài viết này.

Bắt đầu

  1. Cài đặt:
    $ apt-get install xca
  2. Và chúng tôi chạy:
    $ xca
  3. Chúng tôi tạo cơ sở dữ liệu cho CA - /root/CA.xdb
    Chúng tôi khuyên bạn nên lưu trữ cơ sở dữ liệu của Tổ chức phát hành chứng chỉ trong thư mục mà chỉ quản trị viên mới có quyền truy cập. Điều này rất quan trọng để bảo vệ khóa riêng của chứng chỉ gốc, được sử dụng để ký tất cả các chứng chỉ khác.

Tạo khóa và chứng chỉ CA gốc

Cơ sở hạ tầng khóa công khai (PKI) dựa trên hệ thống phân cấp. Điều chính trong hệ thống này là cơ quan chứng nhận gốc hoặc CA gốc. Chứng chỉ của nó phải được tạo trước tiên.

  1. Chúng tôi tạo khóa riêng RSA-2048 cho CA. Để thực hiện việc này, trên tab Khóa riêngMới chính và chọn loại thích hợp.
  2. Đặt tên cho cặp khóa mới. Tôi gọi nó là CA Key.
  3. Chúng tôi tự cấp chứng chỉ CA bằng cách sử dụng cặp khóa đã tạo. Để thực hiện việc này, hãy chuyển đến tab Giấy chứng nhận và đẩy Giấy chứng nhận mới.
  4. Hãy chắc chắn để lựa chọn SHA-256, vì việc sử dụng SHA-1 không còn được coi là an toàn nữa.
  5. Hãy chắc chắn để chọn làm mẫu [mặc định]CA. Đừng quên bấm vào Áp dụng tất cả, nếu không thì mẫu sẽ không được áp dụng.
  6. Trong tab Tiêu Đề chọn cặp khóa của chúng tôi. Ở đó bạn có thể điền vào tất cả các trường chính của chứng chỉ.

Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

Tạo khóa và chứng chỉ máy chủ https

  1. Theo cách tương tự, chúng tôi tạo khóa riêng RSA-2048 cho máy chủ, tôi gọi nó là Khóa máy chủ.
  2. Khi tạo chứng chỉ, chúng tôi chọn chứng chỉ máy chủ phải được ký bằng chứng chỉ CA.
  3. Đừng quên chọn SHA-256.
  4. Chúng tôi chọn làm mẫu [mặc định] HTTPS_server. Bấm vào Áp dụng tất cả.
  5. Sau đó trên tab Tiêu Đề chọn khóa của chúng tôi và điền vào các trường bắt buộc.

Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

Tạo khóa và chứng chỉ cho người dùng

  1. Khóa riêng của người dùng sẽ được lưu trữ trên mã thông báo của chúng tôi. Để làm việc với nó, bạn cần cài đặt thư viện PKCS#11 từ trang web của chúng tôi. Đối với các bản phân phối phổ biến, chúng tôi phân phối các gói làm sẵn, có tại đây - https://www.rutoken.ru/support/download/pkcs/. Chúng tôi cũng có các tập hợp cho arm64, armv7el, armv7hf, e2k, mipso32el, có thể tải xuống từ SDK của chúng tôi - https://www.rutoken.ru/developers/sdk/. Ngoài các tập hợp dành cho Linux, còn có các tập hợp dành cho macOS, freebsd và android.
  2. Thêm Nhà cung cấp PKCS#11 mới vào XCA. Để thực hiện việc này, hãy vào menu Các lựa chọn đến tab Nhà cung cấp PKCS#11.
  3. Chúng tôi nhấn Thêm và chọn đường dẫn đến thư viện PKCS#11. Trong trường hợp của tôi, đó là usrliblibrtpkcs11ecp.so.
  4. Chúng tôi sẽ cần mã thông báo Rutoken EDS PKI được định dạng. Tải tiện ích rtAdmin - https://dev.rutoken.ru/pages/viewpage.action?pageId=7995615
  5. Chúng tôi thực hiện
    $ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u <PIN-код пользователя>
  6. Chúng tôi chọn khóa RSA-2048 cho Rutoken EDS PKI làm loại khóa. Tôi gọi khóa này là Khóa khách hàng.

    Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

  7. Nhập mã PIN. Và chúng ta chờ đợi quá trình tạo phần cứng của cặp khóa hoàn tất

    Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

  8. Chúng tôi tạo chứng chỉ cho người dùng bằng cách tương tự với chứng chỉ máy chủ. Lần này chúng tôi chọn một mẫu [mặc định] HTTPS_client và đừng quên nhấp vào Áp dụng tất cả.
  9. Trong tab Tiêu Đề nhập thông tin về người dùng. Chúng tôi trả lời khẳng định yêu cầu lưu chứng chỉ cho mã thông báo.

Kết quả là, trên tab Giấy chứng nhận trong XCA bạn sẽ nhận được thứ gì đó như thế này.

Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux
Bộ khóa và chứng chỉ tối thiểu này đủ để bắt đầu tự thiết lập máy chủ.

Để định cấu hình, chúng ta cần xuất chứng chỉ CA, chứng chỉ máy chủ và khóa riêng của máy chủ.

Để thực hiện việc này, hãy chọn mục nhập mong muốn trên tab tương ứng trong XCA và nhấp vào Xuất khẩu.

Nginx

Tôi sẽ không viết về cách cài đặt và chạy máy chủ nginx - có đủ bài viết về chủ đề này trên Internet, chưa kể tài liệu chính thức. Hãy bắt tay ngay vào việc thiết lập HTTPS và xác thực hai yếu tố bằng mã thông báo.

Thêm các dòng sau vào phần máy chủ trong nginx.conf:

server {
	listen 443 ssl;
	ssl_verify_depth 1;
	ssl_certificate /etc/nginx/Server.crt;
	ssl_certificate_key /etc/nginx/ServerKey.pem;
	ssl_client_certificate /etc/nginx/CA.crt;
	ssl_verify_client on;
}

Bạn có thể tìm thấy mô tả chi tiết về tất cả các tham số liên quan đến định cấu hình ssl trong nginx tại đây - https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate

Tôi sẽ chỉ mô tả ngắn gọn những điều mà tôi đã tự hỏi:

  • ssl_verify_client - chỉ định rằng chuỗi tin cậy cho chứng chỉ cần được xác minh.
  • ssl_verify_deep - Xác định độ sâu tìm kiếm cho chứng chỉ gốc đáng tin cậy trong chuỗi. Vì chứng chỉ ứng dụng khách của chúng tôi được ký ngay trên chứng chỉ gốc nên độ sâu được đặt thành 1. Nếu chứng chỉ người dùng được ký trên CA trung gian thì 2 phải được chỉ định trong tham số này, v.v.
  • ssl_client_certificate - chỉ định đường dẫn đến chứng chỉ gốc đáng tin cậy, được sử dụng khi kiểm tra độ tin cậy đối với chứng chỉ của người dùng.
  • ssl_certificate/ssl_certificate_key - chỉ ra đường dẫn đến chứng chỉ máy chủ/khóa riêng.

Đừng quên chạy nginx -t để kiểm tra xem không có lỗi chính tả nào trong cấu hình và tất cả các tệp đều ở đúng vị trí, v.v.

Và đó là tất cả! Như bạn có thể thấy, việc thiết lập rất đơn giản.

Kiểm tra xem nó có hoạt động trong Firefox không

Vì chúng tôi thực hiện mọi thứ hoàn toàn trong Linux nên chúng tôi sẽ giả định rằng người dùng của chúng tôi cũng làm việc trong Linux (nếu họ có Windows thì xem hướng dẫn thiết lập trình duyệt ở bài viết trước.

  1. Hãy khởi chạy Firefox.
  2. Trước tiên hãy thử đăng nhập mà không cần mã thông báo. Chúng tôi nhận được hình ảnh này:

    Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

  3. Chúng ta tiếp tục về: sở thích # riêng tư, và chúng ta đi tới Thiết bị an ninh…
  4. Chúng tôi nhấn Phụ tảiđể thêm Trình điều khiển thiết bị PKCS#11 mới và chỉ định đường dẫn đến librtpkcs11ecp.so của chúng tôi.
  5. Để kiểm tra xem chứng chỉ có hiển thị hay không, bạn có thể truy cập Giấy chứng nhận quản lý. Bạn sẽ được nhắc nhập mã PIN của mình. Sau khi nhập đúng, bạn có thể kiểm tra nội dung trên tab Giấy chứng nhận của bạn chứng chỉ của chúng tôi từ mã thông báo đã xuất hiện.
  6. Bây giờ chúng ta hãy đi với mã thông báo. Firefox nhắc bạn chọn chứng chỉ sẽ được chọn cho máy chủ. Chọn chứng chỉ của chúng tôi.

    Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

  7. LỢI NHUẬN!

    Xác thực hai yếu tố trên trang web bằng mã thông báo USB. Bây giờ cũng dành cho Linux

Quá trình thiết lập được thực hiện một lần và như bạn có thể thấy trong cửa sổ yêu cầu chứng chỉ, chúng tôi có thể lưu lựa chọn của mình. Sau này, mỗi lần đăng nhập vào cổng, chúng tôi sẽ chỉ cần chèn mã thông báo và nhập mã PIN người dùng đã được chỉ định trong quá trình định dạng. Sau khi xác thực như vậy, máy chủ đã biết người dùng nào đã đăng nhập và bạn không thể tạo bất kỳ cửa sổ bổ sung nào để xác minh mà ngay lập tức cho phép người dùng vào tài khoản cá nhân của mình.

Apache

Cũng giống như với nginx, không ai sẽ gặp bất kỳ vấn đề gì khi cài đặt Apache. Nếu bạn không biết cách cài đặt máy chủ web này, chỉ cần sử dụng tài liệu chính thức.

Và chúng tôi bắt đầu thiết lập HTTPS và xác thực hai yếu tố:

  1. Đầu tiên bạn cần kích hoạt mod_ssl:
    $ a2enmod ssl
  2. Và sau đó kích hoạt cài đặt HTTPS mặc định của trang web:
    $ a2ensite default-ssl
  3. Bây giờ chúng ta chỉnh sửa tệp cấu hình: /etc/apache2/sites-enabled/default-ssl.conf:
        SSLEngine on
        SSLProtocol all -SSLv2
    
        SSLCertificateFile	/etc/apache2/sites-enabled/Server.crt
        SSLCertificateKeyFile /etc/apache2/sites-enabled/ServerKey.pem
    
        SSLCACertificateFile /etc/apache2/sites-enabled/CA.crt
    
        SSLVerifyClient require
        SSLVerifyDepth  10

    Như bạn có thể thấy, tên của các tham số thực tế trùng với tên của các tham số trong nginx, vì vậy tôi sẽ không giải thích chúng. Một lần nữa, bất kỳ ai quan tâm đến chi tiết đều có thể xem tài liệu.
    Bây giờ chúng tôi khởi động lại máy chủ của mình:

    $ service apache2 reload
    $ service apache2 restart

  4. Như bạn có thể thấy, việc thiết lập xác thực hai yếu tố trên bất kỳ máy chủ web nào, dù trên Windows hay Linux, đều mất tối đa một giờ. Và việc thiết lập trình duyệt mất khoảng 5 phút. Nhiều người cho rằng việc thiết lập và làm việc với xác thực XNUMX yếu tố rất khó khăn và không rõ ràng. Tôi hy vọng bài viết của chúng tôi sẽ vạch trần huyền thoại này, ít nhất một chút.

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn có cần hướng dẫn thiết lập TLS với chứng chỉ theo GOST 34.10-2012 không:

  • Có, TLS-GOST rất cần thiết

  • Không, điều chỉnh bằng thuật toán GOST không thú vị

44 người dùng bình chọn. 9 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét