Nginx配置禁止访问某个目录或文件的方法和示例

在Nginx中,有多种方法可以禁止访问特定的目录或文件。以下是详细的配置方法和实用示例:

图片[1]_Nginx配置禁止访问某个目录或文件的方法和示例_知途无界

一、使用location指令禁止访问

1. 禁止访问特定目录

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 方法1:使用deny all禁止访问整个目录
    location /private/ {
        deny all;
        return 403;
    }

    # 方法2:返回404而不是403(隐藏目录存在的事实)
    location /secret/ {
        deny all;
        return 404;
    }

    # 方法3:使用alias指向空目录或无效路径
    location /restricted/ {
        alias /dev/null;
    }
}

2. 禁止访问特定文件类型

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 禁止访问所有.log文件
    location ~* \.log$ {
        deny all;
        return 403;
    }

    # 禁止访问所有.sql文件
    location ~* \.sql$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 禁止访问配置文件
    location ~* \.(conf|config|ini)$ {
        deny all;
        return 403;
    }
}

3. 禁止访问特定文件

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 禁止访问特定文件
    location = /config.php {
        deny all;
        return 403;
    }

    location = /wp-config.php {
        deny all;
        return 404;
    }

    # 禁止访问多个特定文件
    location ~ ^/(config\.php|settings\.json|database\.yml)$ {
        deny all;
        return 403;
    }
}

二、使用if指令进行条件判断

1. 基于文件存在的访问控制

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 如果文件存在,则拒绝访问
    if (-f $request_filename) {
        set $deny_access 1;
    }

    if ($deny_access = 1) {
        return 403;
    }

    # 针对特定目录的文件
    location /uploads/ {
        if ($request_filename ~* \.(php|jsp|asp)$) {
            return 403;
        }
    }
}

2. 基于请求方法的访问控制

server {
    listen 80;
    server_name example.com;

    # 禁止POST请求到特定目录
    location /admin/ {
        limit_except GET HEAD {
            deny all;
        }
    }

    # 只允许GET和HEAD方法
    location /api/ {
        if ($request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
    }
}

三、使用auth_basic进行密码保护

1. 为敏感目录设置密码保护

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 密码保护目录
    location /admin/ {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;
        
        # 额外的IP限制
        allow 192.168.1.0/24;
        allow 127.0.0.1;
        deny all;
    }

    # 创建密码文件
    # htpasswd -c /etc/nginx/.htpasswd username
}

四、基于IP地址的访问控制

1. 允许特定IP访问,拒绝其他

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # 只允许特定IP访问管理目录
    location /admin/ {
        allow 192.168.1.100;
        allow 10.0.0.0/24;
        allow 127.0.0.1;
        deny all;
    }

    # 拒绝特定IP访问
    location /private/ {
        deny 203.0.113.5;
        deny 198.51.100.0/24;
        allow all;
    }
}

五、完整的安全配置示例

1. 综合安全配置

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php index.html index.htm;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;

    # 禁止访问敏感文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~* ^.*(\.svn|\.git|\.env) {
        deny all;
        return 410;
    }

    # 禁止访问日志和备份文件
    location ~* \.(log|logs|bak|backup|bk)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 禁止访问配置文件
    location ~* \.(conf|config|ini|cfg|dist)$ {
        deny all;
        return 403;
    }

    # 禁止访问PHP文件在某些目录
    location ~* /(uploads|images)/.*\.php$ {
        deny all;
        return 403;
    }

    # 保护上传目录
    location /uploads/ {
        # 禁止执行PHP
        location ~ \.php$ {
            deny all;
            return 403;
        }
        
        # 限制上传文件大小
        client_max_body_size 10M;
        
        # 允许访问其他文件类型
        try_files $uri $uri/ =404;
    }

    # 管理后台保护
    location /admin/ {
        # IP白名单
        allow 192.168.1.0/24;
        allow 127.0.0.1;
        deny all;
        
        # 密码保护
        auth_basic "Admin Area";
        auth_basic_user_file /etc/nginx/.admin_htpasswd;
        
        # PHP处理
        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

    # 常规PHP处理
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        
        # 安全限制
        fastcgi_hide_header X-Powered-By;
    }

    # 默认处理
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

六、高级配置技巧

1. 使用map指令进行复杂控制

http {
    # 定义不允许访问的文件扩展名
    map $request_uri $deny_file_type {
        default 0;
        ~*\.(log|sql|conf|config|ini)$ 1;
        ~*\.(env|sh|bat|exe)$ 1;
    }

    # 定义不允许访问的目录
    map $request_uri $deny_directory {
        default 0;
        ~^/(\.git|node_modules|vendor)/ 1;
        ~^/(backup|tmp|temp)/ 1;
    }

    server {
        listen 80;
        server_name example.com;
        root /var/www/html;

        # 基于map的访问控制
        if ($deny_file_type = 1) {
            return 403 "File type not allowed";
        }

        if ($deny_directory = 1) {
            return 403 "Directory access denied";
        }
    }
}

2. 使用geo模块进行地理位置控制

http {
    # 定义IP地理位置
    geo $block_country {
        default 0;
        1.0.0.0/24 1;  # 示例:阻止特定国家/地区
        2.0.0.0/24 1;
    }

    server {
        listen 80;
        server_name example.com;

        # 基于地理位置的访问控制
        if ($block_country = 1) {
            return 444;  # 直接关闭连接
        }

        # 结合目录访问控制
        location /sensitive/ {
            if ($block_country = 1) {
                return 403 "Access denied from your location";
            }
            deny all;
        }
    }
}

七、测试和验证配置

1. 测试Nginx配置

# 检查配置文件语法
sudo nginx -t

# 重载配置
sudo nginx -s reload

# 重启Nginx
sudo systemctl restart nginx

2. 验证访问控制

# 测试被禁止的目录访问
curl -I http://example.com/private/
# 应该返回 403 Forbidden

# 测试被保护的文件
curl -I http://example.com/config.php
# 应该返回 403 Forbidden

# 测试密码保护
curl -I http://example.com/admin/
# 应该返回 401 Unauthorized

八、最佳实践和建议

  1. 多层防护​:结合多种方法(IP限制、密码保护、文件类型限制)
  2. 最小权限原则​:只开放必要的访问权限
  3. 定期审查​:定期检查访问日志,发现异常访问模式
  4. 隐藏敏感信息​:使用404而不是403可以避免暴露目录存在
  5. 性能考虑​:复杂的访问控制可能影响性能,需要权衡安全性和性能
  6. 备份配置​:修改配置前做好备份
  7. 监控和日志​:确保访问被拒绝的请求被正确记录

通过以上配置方法,可以有效地保护Nginx服务器上的敏感目录和文件,提高整体安全性。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞32 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容