Những bảo mật cần thiết cho DirectAdmin

    Bạn đã “lỡ dại” đầu tư VPS hoặc Server, lỡ xài DirectAdmin(DA) thì xem như bạn đang gánh cho mình thêm một số vai trò mới trong đó có vai trò đảm bảo cho website hoạt động ổn định và tránh những cuộc tấn công không cần thiết từ bên ngoài. Những mẹo cơ bản dưới đây có thể giúp cho hệ thống của bạn an toàn hơn. Tuy nhiên nó không phải tất cả những việc bạn phải làm. Lưu ý rằng việc đảm bảo một hệ thống ổn định đòi hỏi người quản trị cần phải học hỏi và cập nhật thông tin bảo mật liên tục.

    1.

    Dễ dàng nhất là khi cài đặt bạn hãy gắn phân vùng /tmp với các cấu hình noexec,nosuid và phân vùng /home với nosuid. Phần này bạn có thể cấu hình trong tập tin /etc/fstab và đưa vào các đường dẫn đến phân vùng, không phải thư mục gốc /. Nếu bạn không chắc chắn bạn có thể sử dụng lệnh:

    mount

    Lệnh này sẽ trả về cho bạn danh sách các phân vùng (partition) và các tùy chọn về quyền hạn đi kèm với nó. Bạn có thể sử dụng Google để biết thêm thông tin về các quyền của hệ thống cũng như xử lý chúng như thế nào. Hãy cẩn thận khi chỉnh sửa /etc/fstab. Tất cả các lỗi trong file này đều có thể khiến cho hệ thống của bạn không thể vận hành trơn tru thậm chí bạn phải cài lại máy chủ.

    Lưu ý rằng bạn không cần nosuid,noexec cho phân vùng / cũng như /usr cũng như các phân vùng đã có suid nhị phân như thông thường như su, passwd, etc…

    2.

    Sau khi cài đặt hệ thống, một việc tiếp theo nên làm đó là thêm danh sách các hàm (function) nguy hiểm hoặc bạn không muốn người dùng sử dụng vào danh sách disable_functions. Việc này ngăn không cho các script PHP chạy những mã lệnh nguy hiểm có thể làm ảnh hưởng hệ thống của bạn. Lưu ý rằng một vài script PHP hợp pháp có thể cần một vài hàm liên quan đến hệ thống để chạy. Do đó nếu script của bạn không chạy sau khi bạn kích hoạt hàm này, hãy mở bộ soạn thảo để sửa lại file php.ini của bạn và bỏ đi các hàm đó. Để thêm disable_function với custombuild, gõ lệnh sau sau đó restart Apache:

    cd /usr/local/directadmin/custombuild./build update./build secure_php

    3.

    Thường xuyên cập nhật hệ thống, các dịch vụ hệ thống và thư viện, các script có liên quan. Điều này cực kì quan trọng, đặt biệt là khi hệ thống của bạn được cài đặt lại. Đây là trách nhiệm của người quản lý máy chủ. Có một số công cụ và lựa chọn có thể giúp bạn thực hiện được điều này. Đối với hệ thống thư viện như openssl hoặc các thành phần hệ thống cấp thấp khác rất dễ thực hiện. Bạn chỉ cần cập nhật các gói như yum hoặc apt-get là có thể làm điều bạn muốn. Đối với các dịch vụ và script được DA cài đặt, bạn có thể sử dụng custombuild. Một lệnh cập nhật với custombuild được thự hiện như sau:

    cd /usr/local/directadmin/custombuild./build update./build all d

    Lưu ý rằng thư mục custombuild là một tập tin tên options.conf, bên trong bao gồm các tùy chọn liên quan đến những gì custombuild sẽ thực hiện. Bạn phải đảm bảo rằng clean_old_webapps=yes. Tùy chọn này sẽ loại bỏ toàn bộ những source code bạn đang có trong /var/www/html sau khi bạn cập nhật.

    options.conf cũng có những tùy chọn giúp bạn tự động cập nhật hàng đêm. Tôi khuyên bạn cũng nên kích hoạt tùy chọn này và đảm bảo rằng bạn luôn nhận được thông tin cập nhật hệ thống mới nhất qua email mỗi đêm. Cách kích hoạt chế độ tự cập nhật như sau;

    #Cron settingscron=yesemail=email@domain.comnotifications=yesupdates=nowebapps_updates=yes

    Sau đó bạn gõ

    ./build cron

    Đoạn mã trên sẽ giúp bạn nhận được thông báo cập nhật phiên bản mới qua email chứ không hề cập nhật hệ thống cho bạn. Sau khi nhận được thông báo, bạn chạy đoạn lệnh sau từ thư mục custombuild:

    ./build update_versions

    Để update bạn cần chọn các phần cần câp nhật và tiến hành cập nhật. Một lưu ý cho bạn là lệnh “./build all d” có thể là khá đơn giản. Nhưng nó sẽ mất rất nhiều thời gian để thực hiện.

    Nếu bạn muốn ./build update_versions chạy tự động, bạn cần thay thế updates=no thành updates=yes. Tùy chọn webapps_updates chỉ áp dụng được khi updates=no. Nó vẫn cho phép cập nhật các script trong mục /var/www/html nhưng không ảnh hưởng đến các dịch vụ biên dịch. Cấu hình webapps_updates=yes nếu updates=no và bạn sẽ có các script được cập nhật tự động định kỳ. Nếu updates=yes thì giá trị của webapps_updates sẽ không còn quan trọng.

    4.

    Nếu bạn đang chạy PHP ở chế độ CLI, kích hoạt SafeModeopen_basedir là một lựa chọn khôn ngoan. Safemode là một internal form của disable_functions và chỉ cho phép kiểm tra nhiều hơn một chút. Bạn nên xem thêm về SafeMode để hiểu rõ hơn về nó. Open_basedir được enable theo mặc định cho PHP để không cho phép các script truy xuất các tập tinh bên ngoài các tập tin được liệt kê trong danh sách path cho phép.

    Để điều khiển SafeModeOpen_Basedir trong hệ thống PHP CLI, chúng ta di chuyển đến phần sau trong DA:

    Admin Level – Php Safemode Config

    5.

    suPHP là một lựa chọn được nhiều quản trị yêu thích, một số khác lại không như vậy. Những gì suPhp (php CGI) làm là chạy các kịch bản như một tài khoản người dùng chứ không phải chạy dưới tên tài khoản là apache. Điều này cho phép giải quyết vấn đề permission/ownership khi một PHP Script tải lên một file nào đó. Nó cũng cho phép người quản trị hệ thống theo dõi một script lừa đảo một cách dễ dàng hơn vì nó không chạy chung một người dùng (apache) mà chạy riêng biệt từng tài khoản. Một lợi ích khác mà suPHP mang lại là bạn có thể CHMOD tệp tin PHP về 700 thay vì 755. Việc này làm cho chúng an toàn hơn trong trường hợp bạn đang lưu trữ mật khẩu trong file.

    Một hạn chế nhỏ của suPHP đó là làm cho hệ thống của bạn phải xử lý thêm đôi chút vì có thêm vài lần chuyển tài khoản người dùng thay vì chỉ sử dụng apache như xưa. Ngoài ra, một số thành phần đã được nhắc đến trong điểm 4. có thể không hiệu lực do suPhp ngừng theo dõi cờ VirtualHost. Tất cả các cấu hình cần được thực hiện trong php.ini. Lưu ý rằng bạn có thể cấu hình từng php.ini riêng cho từng người dùng của mình. Xem thêm hướng dẫn tại đây.

    Để kích hoạt suPHP, xem hướng dẫn tại đây.

    6.

    Nếu bạn không có kế hoạch thực hiện bất kỳ một truy xuất MySQL nào từ xa, hãy cấu hình để MySQL chỉ truy xuất từ IP 127.0.0.1. Bạn phải ghi nhớ điều này nếu như một user hỏi bạn tại sao họ không thể truy xuất MySQL từ một máy chủ khác. Nếu bạn muốn thực hiện điều này, hãy thêm dòng sau vào /etc/my.cnf và sau đó restart lại mysql.

    bind-address = 127.0.0.1

    7.

    Một lựa chọn hay cho Apache đó là cài đặt mod_security – đây là một lựa chọn của tôi. mod_security sẽ xây dựng một bộ lọc cho Apache và đảm bảo rằng các truy vấn HTTP Request được gửi đến từ client phải hợp lệ. Lưu ý rằng chúng phải được cấu hình đúng, nếu không nó sẽ phá vỡ cấu trúc layout ở frontend và các script khác thường có URL dài. Kiểm tra, thử nghiệm và thiết lập lại là việc làm cần thiết.

    8.

    Một firewall là ý tưởng tốt để bảo vệ hệ thống của bạn, nhiều người sử dụng iptables hoặc apf, CSF… Bạn có thể tìm hiểu thêm ở đây.

    9.

    Bạn có thể thiết lập thư mục tên miền của user để ngăn chặn những user khác có thể thấy chúng. Xem thêm hướng dẫn tại đây.

    10.

    Thiết lập named.conf để ngăn chặn đệ qui. Theo mặc định nó đã được thiết lập nhưng bạn cũng nên kiểm tra kĩ lại theo hướng dẫn này.

    11.

    Ngăn chặn người dùng đặt những mật khẩu yếu bằng cách kích hoạt difficult password enforcement.

    12.

    Ngăn chặn người dùng tạo tên miền phụ thuộc người sử dụng khác bằng cách cấu hình lại trong directadmin.conf như sau:

    check_subdomain_owner=1

    13.

    Sử dụng SSL để kết nối với DirectAdmin – đây là một ý tưởng tốt để buộc tất cả các kết nối với DA phải thực thi SSLv3 thay vì phương thức cũ.

    14.

    Sử dụng thêm một lớp bảo mật với các qui định của perl binary. Sử dụng thủ thuật này tương tự như mục 9 với các mã lệnh sau:

    chgrp apache /usr/bin/perl /usr/bin/wget /usr/local/bin/wget /usr/local/bin/curl /usr/bin/curl /usr/bin/pythonchmod 705 /usr/bin/perl /usr/bin/wget /usr/local/bin/wget /usr/local/bin/curl /usr/bin/curl /usr/bin/python

    Điều mà mã lệnh sau sẽ làm đó là không cho phép các user trong nhóm Apache không được phép thực thi /usr/bin/perl. Nếu bạn đã thực hiện mục 9, bạn có thể sử dụng access thay vì apache cho giá trị chgrp. Thay đổi này ngăn cản cả những tài khoản khác trong hệ thống chạy nó; nhưng mục đích chính của chúng ta chỉ là Apache. Kĩ thuật này có thể áp dụng cho các ứng dụng khác như widget, fetch…Hãy nhớ rằng suPhp phủ định vấn đề này kể từ khi người dùng thay thế PHP script.

    Hãy nhớ rằng đây chỉ là một lớp bảo mật khác, nên nó sẽ không gây ra bất kì điều gì trong trường hợp việc khai thác Apache độc lập với PHP.

    15.

    Brute Force Login Attempts rất phổ biến, vì vậy không cần thiết phải có những đăng nhập SSH thông qua tài khoản root và admin nếu không thực sự cần thiết. Hãy vô hiệu hóa bất kì tài khoản nào không cần thiết đăng nhập SSH trực tiếp (root, admin…) bằng cách chỉnh sửa /etc/ssh/sshd_config.Bạn nên cẩn thận và kiểm tra kĩ trước khi thoát ra, nếu không chính bạn sẽ tự khóa tài khoản của bạn.

    Ngoài ra, DirectAdmin có hệ thống phát hiện và ngăn chặn Brute Force attack cũng như ngăn chặn IP đó. Xem thêm tại đây.

    16.

    Sử dụng kết nối an toàn khi đăng nhập Email. Xem thêm tại đây.

    Tổng hợp từ Internet

    Bạn đã “lỡ dại” đầu tư VPS hoặc Server, lỡ xài DirectAdmin(DA) thì xem như bạn đang gánh cho mình thêm một số vai trò mới trong đó có vai trò đảm bảo cho website hoạt động ổn định và tránh những cuộc tấn công không cần thiết từ bên ngoài. Những mẹo cơ bản dưới đây có thể giúp cho hệ thống của bạn an toàn hơn. Tuy nhiên nó không phải tất cả những việc bạn phải làm. Lưu ý rằng việc đảm bảo một hệ thống ổn định đòi hỏi người quản trị cần phải học hỏi và cập nhật thông tin bảo mật liên tục.

    1.

    Dễ dàng nhất là khi cài đặt bạn hãy gắn phân vùng /tmp với các cấu hình noexec,nosuid và phân vùng /home với nosuid. Phần này bạn có thể cấu hình trong tập tin /etc/fstab và đưa vào các đường dẫn đến phân vùng, không phải thư mục gốc /. Nếu bạn không chắc chắn bạn có thể sử dụng lệnh:

    mount

    Lệnh này sẽ trả về cho bạn danh sách các phân vùng (partition) và các tùy chọn về quyền hạn đi kèm với nó. Bạn có thể sử dụng Google để biết thêm thông tin về các quyền của hệ thống cũng như xử lý chúng như thế nào. Hãy cẩn thận khi chỉnh sửa /etc/fstab. Tất cả các lỗi trong file này đều có thể khiến cho hệ thống của bạn không thể vận hành trơn tru thậm chí bạn phải cài lại máy chủ.

    Lưu ý rằng bạn không cần nosuid,noexec cho phân vùng / cũng như /usr cũng như các phân vùng đã có suid nhị phân như thông thường như su, passwd, etc…

    2.

    Sau khi cài đặt hệ thống, một việc tiếp theo nên làm đó là thêm danh sách các hàm (function) nguy hiểm hoặc bạn không muốn người dùng sử dụng vào danh sách disable_functions. Việc này ngăn không cho các script PHP chạy những mã lệnh nguy hiểm có thể làm ảnh hưởng hệ thống của bạn. Lưu ý rằng một vài script PHP hợp pháp có thể cần một vài hàm liên quan đến hệ thống để chạy. Do đó nếu script của bạn không chạy sau khi bạn kích hoạt hàm này, hãy mở bộ soạn thảo để sửa lại file php.ini của bạn và bỏ đi các hàm đó. Để thêm disable_function với custombuild, gõ lệnh sau sau đó restart Apache:

    cd /usr/local/directadmin/custombuild./build update./build secure_php

    3.

    Thường xuyên cập nhật hệ thống, các dịch vụ hệ thống và thư viện, các script có liên quan. Điều này cực kì quan trọng, đặt biệt là khi hệ thống của bạn được cài đặt lại. Đây là trách nhiệm của người quản lý máy chủ. Có một số công cụ và lựa chọn có thể giúp bạn thực hiện được điều này. Đối với hệ thống thư viện như openssl hoặc các thành phần hệ thống cấp thấp khác rất dễ thực hiện. Bạn chỉ cần cập nhật các gói như yum hoặc apt-get là có thể làm điều bạn muốn. Đối với các dịch vụ và script được DA cài đặt, bạn có thể sử dụng custombuild. Một lệnh cập nhật với custombuild được thự hiện như sau:

    cd /usr/local/directadmin/custombuild./build update./build all d

    Lưu ý rằng thư mục custombuild là một tập tin tên options.conf, bên trong bao gồm các tùy chọn liên quan đến những gì custombuild sẽ thực hiện. Bạn phải đảm bảo rằng clean_old_webapps=yes. Tùy chọn này sẽ loại bỏ toàn bộ những source code bạn đang có trong /var/www/html sau khi bạn cập nhật.

    options.conf cũng có những tùy chọn giúp bạn tự động cập nhật hàng đêm. Tôi khuyên bạn cũng nên kích hoạt tùy chọn này và đảm bảo rằng bạn luôn nhận được thông tin cập nhật hệ thống mới nhất qua email mỗi đêm. Cách kích hoạt chế độ tự cập nhật như sau;

    #Cron settingscron=yesemail=email@domain.comnotifications=yesupdates=nowebapps_updates=yes

    Sau đó bạn gõ

    ./build cron

    Đoạn mã trên sẽ giúp bạn nhận được thông báo cập nhật phiên bản mới qua email chứ không hề cập nhật hệ thống cho bạn. Sau khi nhận được thông báo, bạn chạy đoạn lệnh sau từ thư mục custombuild:

    ./build update_versions

    Để update bạn cần chọn các phần cần câp nhật và tiến hành cập nhật. Một lưu ý cho bạn là lệnh “./build all d” có thể là khá đơn giản. Nhưng nó sẽ mất rất nhiều thời gian để thực hiện.

    Nếu bạn muốn ./build update_versions chạy tự động, bạn cần thay thế updates=no thành updates=yes. Tùy chọn webapps_updates chỉ áp dụng được khi updates=no. Nó vẫn cho phép cập nhật các script trong mục /var/www/html nhưng không ảnh hưởng đến các dịch vụ biên dịch. Cấu hình webapps_updates=yes nếu updates=no và bạn sẽ có các script được cập nhật tự động định kỳ. Nếu updates=yes thì giá trị của webapps_updates sẽ không còn quan trọng.

    4.

    Nếu bạn đang chạy PHP ở chế độ CLI, kích hoạt SafeModeopen_basedir là một lựa chọn khôn ngoan. Safemode là một internal form của disable_functions và chỉ cho phép kiểm tra nhiều hơn một chút. Bạn nên xem thêm về SafeMode để hiểu rõ hơn về nó. Open_basedir được enable theo mặc định cho PHP để không cho phép các script truy xuất các tập tinh bên ngoài các tập tin được liệt kê trong danh sách path cho phép.

    Để điều khiển SafeModeOpen_Basedir trong hệ thống PHP CLI, chúng ta di chuyển đến phần sau trong DA:

    Admin Level – Php Safemode Config

    5.

    suPHP là một lựa chọn được nhiều quản trị yêu thích, một số khác lại không như vậy. Những gì suPhp (php CGI) làm là chạy các kịch bản như một tài khoản người dùng chứ không phải chạy dưới tên tài khoản là apache. Điều này cho phép giải quyết vấn đề permission/ownership khi một PHP Script tải lên một file nào đó. Nó cũng cho phép người quản trị hệ thống theo dõi một script lừa đảo một cách dễ dàng hơn vì nó không chạy chung một người dùng (apache) mà chạy riêng biệt từng tài khoản. Một lợi ích khác mà suPHP mang lại là bạn có thể CHMOD tệp tin PHP về 700 thay vì 755. Việc này làm cho chúng an toàn hơn trong trường hợp bạn đang lưu trữ mật khẩu trong file.

    Một hạn chế nhỏ của suPHP đó là làm cho hệ thống của bạn phải xử lý thêm đôi chút vì có thêm vài lần chuyển tài khoản người dùng thay vì chỉ sử dụng apache như xưa. Ngoài ra, một số thành phần đã được nhắc đến trong điểm 4. có thể không hiệu lực do suPhp ngừng theo dõi cờ VirtualHost. Tất cả các cấu hình cần được thực hiện trong php.ini. Lưu ý rằng bạn có thể cấu hình từng php.ini riêng cho từng người dùng của mình. Xem thêm hướng dẫn tại đây.

    Để kích hoạt suPHP, xem hướng dẫn tại đây.

    6.

    Nếu bạn không có kế hoạch thực hiện bất kỳ một truy xuất MySQL nào từ xa, hãy cấu hình để MySQL chỉ truy xuất từ IP 127.0.0.1. Bạn phải ghi nhớ điều này nếu như một user hỏi bạn tại sao họ không thể truy xuất MySQL từ một máy chủ khác. Nếu bạn muốn thực hiện điều này, hãy thêm dòng sau vào /etc/my.cnf và sau đó restart lại mysql.

    bind-address = 127.0.0.1

    7.

    Một lựa chọn hay cho Apache đó là cài đặt mod_security – đây là một lựa chọn của tôi. mod_security sẽ xây dựng một bộ lọc cho Apache và đảm bảo rằng các truy vấn HTTP Request được gửi đến từ client phải hợp lệ. Lưu ý rằng chúng phải được cấu hình đúng, nếu không nó sẽ phá vỡ cấu trúc layout ở frontend và các script khác thường có URL dài. Kiểm tra, thử nghiệm và thiết lập lại là việc làm cần thiết.

    8.

    Một firewall là ý tưởng tốt để bảo vệ hệ thống của bạn, nhiều người sử dụng iptables hoặc apf, CSF… Bạn có thể tìm hiểu thêm ở đây.

    9.

    Bạn có thể thiết lập thư mục tên miền của user để ngăn chặn những user khác có thể thấy chúng. Xem thêm hướng dẫn tại đây.

    10.

    Thiết lập named.conf để ngăn chặn đệ qui. Theo mặc định nó đã được thiết lập nhưng bạn cũng nên kiểm tra kĩ lại theo hướng dẫn này.

    11.

    Ngăn chặn người dùng đặt những mật khẩu yếu bằng cách kích hoạt difficult password enforcement.

    12.

    Ngăn chặn người dùng tạo tên miền phụ thuộc người sử dụng khác bằng cách cấu hình lại trong directadmin.conf như sau:

    check_subdomain_owner=1

    13.

    Sử dụng SSL để kết nối với DirectAdmin – đây là một ý tưởng tốt để buộc tất cả các kết nối với DA phải thực thi SSLv3 thay vì phương thức cũ.

    14.

    Sử dụng thêm một lớp bảo mật với các qui định của perl binary. Sử dụng thủ thuật này tương tự như mục 9 với các mã lệnh sau:

    chgrp apache /usr/bin/perl /usr/bin/wget /usr/local/bin/wget /usr/local/bin/curl /usr/bin/curl /usr/bin/pythonchmod 705 /usr/bin/perl /usr/bin/wget /usr/local/bin/wget /usr/local/bin/curl /usr/bin/curl /usr/bin/python

    Điều mà mã lệnh sau sẽ làm đó là không cho phép các user trong nhóm Apache không được phép thực thi /usr/bin/perl. Nếu bạn đã thực hiện mục 9, bạn có thể sử dụng access thay vì apache cho giá trị chgrp. Thay đổi này ngăn cản cả những tài khoản khác trong hệ thống chạy nó; nhưng mục đích chính của chúng ta chỉ là Apache. Kĩ thuật này có thể áp dụng cho các ứng dụng khác như widget, fetch…Hãy nhớ rằng suPhp phủ định vấn đề này kể từ khi người dùng thay thế PHP script.

    Hãy nhớ rằng đây chỉ là một lớp bảo mật khác, nên nó sẽ không gây ra bất kì điều gì trong trường hợp việc khai thác Apache độc lập với PHP.

    15.

    Brute Force Login Attempts rất phổ biến, vì vậy không cần thiết phải có những đăng nhập SSH thông qua tài khoản root và admin nếu không thực sự cần thiết. Hãy vô hiệu hóa bất kì tài khoản nào không cần thiết đăng nhập SSH trực tiếp (root, admin…) bằng cách chỉnh sửa /etc/ssh/sshd_config.Bạn nên cẩn thận và kiểm tra kĩ trước khi thoát ra, nếu không chính bạn sẽ tự khóa tài khoản của bạn.

    Ngoài ra, DirectAdmin có hệ thống phát hiện và ngăn chặn Brute Force attack cũng như ngăn chặn IP đó. Xem thêm tại đây.

    16.

    Sử dụng kết nối an toàn khi đăng nhập Email. Xem thêm tại đây.

    Tổng hợp từ Internet