Cấu hình nginx cơ bản - Phần 3
Last updated
Last updated
Trong phần này, tôi sẽ tập trung viết về cách phân quyền thư mục web của nginx, cách xác thực cơ bản khi truy cập website và cách lọc truy cập đến website theo source IP.
Về cơ bản để website hoạt động được, tôi chỉ cần gán quyền owner đúng và gán permission là read cho owner đó là website hoạt động được. Việc gán quyền tối thiểu như vậy sẽ loại bỏ rất nhiều rủi ro không đáng có như việc up shell vẫn có thể xảy ra do code filter không đủ, bộ lọc bị lỗi logic nào đó chưa test hết... nhưng tuy nằm trên thư mục web của site mà shell đó không có quyền execute thì đâu có thể gây nguy hại cho website được.
Trước hết, quyền owner đúng là thế nào ? Trong hai phần trước, tôi đã thực hiện cấu hình vhost dùng nginx và vhost này cũng hỗ trợ chạy php nhờ vào một service php-fpm. Ở đây nginx service chạy dưới quyền của user nginx và php-fpm service chạy dưới quyền của user apache (mặc định là vậy, tôi có thể sửa lại trong config). Các file php bắt buộc cần có quyền read cho user apache để chạy được còn các file tĩnh khác như html, text/plain thì cần có quyền read cho user nginx để chạy được. Vậy tôi chỉ cần lọc ra các file php gán owner apache:apache và permission 440, các file còn lại owner nginx:nginx và permission 440 là được. Riêng với thư mục thì owner là nginx:nginx và permission là 550 (vì user nginx cần quyền execute để change dir)
Tất cả các website đang sử dụng chung owner hết. Website nào trên webserver cũng dùng apache và nginx user làm owner. Nếu user này bị nhân nhượng thì sao ? Các zero day vulnerability có thể xuất hiện bất cứ lúc nào trong các sản phẩm của nginx hay php-fpm và mức độ nguy hại sẽ bao trùm tất cả các website.
Tôi tạo ra cho mỗi website một user riêng. Ví dụ với site vhost.example.com thì tôi tạo ra user vhost_example_com
Sau đó gán quyền owner và permission cho website như sau:
owner cho toàn bộ site
File nên gán permission 644
Directory nên gán permission 755
Như vậy, khi cần thiết tôi vẫn có thể dùng user vhost_example_com để sửa code của website và vẫn chỉ cho phép user nginx hay apache chỉ có quyền chỉ đọc trên site. Việc gán owner và permission cũng đơn giản hơn.
Nếu giờ client cần upload file lên website thì sao ? Thư mục upload thường là điểm yếu của website.
Cái này hơi khó. Tôi không chắc cách làm này tốt nhất nhưng hiện thời tôi đang gán như sau cho thư mục upload:
Bảo mật trong thư mục upload tôi tham khảo trong: http://software-security.sans.org/blog/2009/12/28/8-basic-rules-to-implement-secure-file-uploads/
Hầu hết các hướng bảo mật trong tài liệu cần sự can thiệp của developer ở tầng application. Một trong các hướng bảo mật trong tài liệu là đặt authentication trên thư mục upload do vậy có thể khoanh vùng được ai là người upload các file khả nghi. Nếu thư mục upload này được dùng bởi client thì không thể giới hạn như vậy được.
Việc đầu tiên là tạo file htpasswd. Một cơ sở dữ liệu nhỏ để thực hiện xác thực. Tốt nhất file này không nên đặt trong thư mục chứa web hay thư mục cài đặt của nginx.
Một file ẩn /usr/local/etc/.vhost.example.com.htpasswd được tạo ra. Passwd của user test1 được mã hóa. Nếu cần thêm một user, tôi dùng lệnh sau:
Nếu cần xóa một user, tôi dùng lệnh sau:
Danh sách các user trong htpasswd có thể xem trực tiếp bằng cách cat chính file htpasswd.
Tiếp đến, tôi chỉ cần thêm hai dòng vào server block trong
/usr/local/nginx/conf.d/vhost.example.com.conf
auth_basic "private site";
auth_basic_user_file /usr/local/etc/.vhost.example.com.htpasswd;
Lúc này /usr/local/nginx/conf.d/vhost.example.com.conf như sau:
Sau khi reload lại nginx service
service nginx reload
Chú ý: Nên reload service nginx để đảm bảo các connection hiện tại đến nginx không bị ngắt đột ngột.
Tôi truy cập vào http://vhost.example.com/test.php