CentOS上Python安全配置要点
通过Python内置的venv
模块创建虚拟环境,将项目依赖与系统全局Python环境隔离,避免依赖冲突和全局污染。创建并激活虚拟环境的命令如下:
python3 -m venv myenv # 创建虚拟环境
source myenv/bin/activate # 激活虚拟环境(CentOS默认使用bash)
激活后,所有pip install
操作仅在当前虚拟环境中生效,卸载时直接删除虚拟环境文件夹即可。
避免以root
用户身份运行Python脚本或服务,创建专用低权限用户(如pythonapp
)并分配至特定组,通过chown
命令设置项目文件权限(如750
),限制不必要的访问。例如:
useradd -m pythonapp # 创建用户
passwd pythonapp # 设置强密码
chown -R pythonapp:pythonapp /path/to/project # 修改项目所有权
chmod -R 750 /path/to/project # 设置目录权限
运行服务时使用sudo -u pythonapp
切换用户。
使用firewalld
(CentOS默认防火墙工具)限制对Python应用的访问,仅开放必要端口(如8000、8080)。操作步骤:
sudo yum install firewalld -y # 安装firewalld
sudo systemctl start firewalld # 启动服务
sudo systemctl enable firewalld # 设置开机自启
sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp # 开放端口
sudo firewall-cmd --reload # 重新加载规则
若需更严格的规则,可限制访问IP(如仅允许公司IP访问)。
SELinux(Security-Enhanced Linux)通过强制访问控制(MAC)限制进程权限,降低攻击影响范围。启用步骤:
sudo yum install selinux-policy-targeted -y # 安装SELinux策略包
sudo systemctl enable selinux # 启用服务
sudo systemctl start selinux # 启动服务
若需自定义策略,可使用audit2allow
工具分析日志生成策略模块(如允许Python访问特定目录):
sudo cat /var/log/audit/audit.log | grep python | audit2allow -M my_python_policy # 生成策略
sudo semodule -i my_python_policy.pp # 加载策略
注意:调试时可临时设置为Permissive
模式(仅记录不阻止),确认无误后再切换至Enforcing
模式。
定期执行系统和Python包更新,修补已知安全漏洞。命令如下:
sudo yum update -y # 更新系统
pip install --upgrade pip # 升级pip本身
pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U # 更新所有过时包
建议设置定时任务(如每周日凌晨2点)自动执行更新。
生产环境中,通过Nginx或Apache配置HTTPS,确保Python应用与客户端之间的数据传输加密。以Nginx为例:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/certificate.crt; # 证书路径
ssl_certificate_key /path/to/private.key; # 私钥路径
location / {
proxy_pass http://localhost:8000; # 转发至Python应用
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
测试配置无误后重启Nginx:sudo systemctl restart nginx
。
对所有用户输入进行严格校验,防止SQL注入、XSS等攻击。避免使用eval()
、exec()
等危险函数,使用参数化查询(如SQLAlchemy)处理数据库操作。例如:
from flask import request, abort
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
if not username or not password: # 检查输入是否存在
abort(400, 'Invalid input')
if len(username) > 50 or len(password) > 50: # 检查长度
abort(400, 'Input too long')
# 进一步校验(如正则表达式匹配邮箱格式)
if not re.match(r'^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$', username):
abort(400, 'Invalid email format')
# 安全查询(使用ORM或参数化查询)
user = User.query.filter_by(username=username).first()
if not user or not user.check_password(password):
abort(401, 'Invalid credentials')
return 'Login successful'
避免将敏感信息(如数据库密码、API密钥)硬编码在代码中,使用.env
文件存储并通过python-dotenv
库读取。
使用.env
文件存储敏感信息(如API_KEY=your_api_key_here
),通过python-dotenv
库在代码中读取:
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件
api_key = os.getenv('API_KEY') # 读取环境变量
将.env
文件添加至.gitignore
,避免提交至代码仓库。
使用Python内置的logging
模块记录应用运行日志(如请求、错误),并配置日志轮转(如按天分割),避免日志文件过大。示例配置:
import logging
from logging.handlers import RotatingFileHandler
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
RotatingFileHandler('/var/log/python_app.log', maxBytes=1024*1024, backupCount=5), # 1MB per file, keep 5 backups
logging.StreamHandler() # 输出至控制台
]
)
logger = logging.getLogger(__name__)
logger.info('Application started')
结合监控工具(如Prometheus+Grafana)实时跟踪应用状态,及时发现异常(如高CPU占用、频繁错误)。