在开始搭建之前,我们需要准备基础运行环境。本指南基于Linux环境(推荐Ubuntu 20.04或CentOS 7+),确保系统已更新至最新状态。为了实现快速部署和隔离,我们使用容器化技术。
1. 安装Docker及Docker Compose
执行以下命令一键安装Docker:
curl -fsSL https://get.docker.com | bash
systemctl start docker
systemctl enable docker
接着安装Docker Compose,用于编排服务:
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
验证安装是否成功:
docker --version
docker-compose --version
涉密档案的核心在于存储安全与数据主权。MinIO是一个高性能的分布式对象存储服务,完全兼容AWS S3接口,非常适合作为档案系统的底层存储。
1. 创建工作目录
mkdir -p /data/secure-archive/minio-data
cd /data/secure-archive
2. 编写Docker Compose配置文件
创建docker-compose.yml文件,内容如下。请注意,MINIO_ROOT_USER和MINIO_ROOT_PASSWORD请务必修改为高强度密码,这是系统的第一道防线。
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: secure-minio
ports:
- "9000:9000"
- "9001:9001"
environment:
- MINIO_ROOT_USER=admin_sec_2024
- MINIO_ROOT_PASSWORD=ChangeMeToStrongPassword123!@
volumes:
- ./minio-data:/data
command: server /data --console-address ":9001"
restart: always
3. 启动MinIO服务
执行以下命令启动服务:
docker-compose up -d
服务启动后,通过浏览器访问 http://服务器IP:9001,使用配置文件中的账号密码登录。登录后,点击左侧菜单“Buckets”,点击“Create Bucket”创建一个名为 secret-archives 的桶。在创建后的桶设置中,将“Public Access”设置为 Private,确保所有访问必须经过鉴权。
为了防止存储介质被盗导致数据泄露,我们必须在应用层对文件进行AES-256加密。这里我们使用Python Flask框架编写核心逻辑。
1. 安装Python依赖
确保服务器已安装Python3,创建虚拟环境并安装依赖:
cd /data/secure-archive
python3 -m venv venv
source venv/bin/activate
pip install flask minio cryptography
2. 生成加密密钥

创建一个脚本generate_key.py来生成Fernet密钥:
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
运行脚本并保存输出的密钥,后续配置会用到:
python generate_key.py
3. 编写核心应用代码
创建app.py,实现文件流式加密上传和解密下载。代码中包含完整的MinIO连接、加密处理及API接口定义。
import os
from flask import Flask, request, send_file, Response, render_template
from minio import Minio
from minio.error import S3Error
from cryptography.fernet import Fernet
app = Flask(__name__)
配置项 - 请根据实际情况修改
MINIO_ENDPOINT = 'localhost:9000'
MINIO_ACCESS_KEY = 'admin_sec_2024'
MINIO_SECRET_KEY = 'ChangeMeToStrongPassword123!@'
MINIO_BUCKET = 'secret-archives'
将此处替换为上一步生成的密钥
ENCRYPTION_KEY = b'YOUR_GENERATED_FERNET_KEY_HERE_32_BYTES_LENGTH'
cipher_suite = Fernet(ENCRYPTION_KEY)
初始化MinIO客户端
minio_client = Minio(
MINIO_ENDPOINT,
access_key=MINIO_ACCESS_KEY,
secret_key=MINIO_SECRET_KEY,
secure=False 如果配置了HTTPS,此处改为True
)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return 'No file part', 400
file = request.files['file']
if file.filename == '':
return 'No selected file', 400
try:
读取文件内容
file_data = file.read()
加密文件内容
encrypted_data = cipher_suite.encrypt(file_data)
上传到MinIO
minio_client.put_object(
MINIO_BUCKET,
file.filename,
data=encrypted_data,
length=len(encrypted_data),
content_type='application/octet-stream'
)
return f'File {file.filename} encrypted and uploaded successfully.', 200
except Exception as e:
return str(e), 500
@app.route('/download/', methods=['GET'])
def download_file(filename):
try:
从MinIO下载加密数据
response = minio_client.get_object(MINIO_BUCKET, filename)
encrypted_data = response.read()
response.close()
response.release_conn()
解密数据
decrypted_data = cipher_suite.decrypt(encrypted_data)
返回解密后的文件流
return Response(
decrypted_data,
mimetype='application/octet-stream',
headers={"Content-Disposition": f"attachment;filename={filename}"}
)
except S3Error as e:
return str(e), 404
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
4. 启动后端服务
使用Gunicorn或直接运行Flask应用:
export FLASK_APP=app.py
python app.py
此时,后端API服务已在5000端口运行。
为了方便操作,我们编写一个极简的HTML页面,通过AJAX与后端交互。
在/data/secure-archive目录下创建templates文件夹,并在其中创建index.html:
涉密档案管理系统
涉密档案管理终端
加密上传档案
解密下载档案
重启app.py,访问 http://服务器IP:5000 即可看到操作界面。
涉密传输严禁使用明文HTTP。我们使用Nginx配置反向代理并开启HTTPS,同时配置安全响应头。
1. 安装Nginx并生成SSL证书
apt install nginx -y
mkdir -p /etc/nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/selfsigned.key \
-out /etc/nginx/ssl/selfsigned.crt \
-subj "/C=CN/ST=State/L=City/O=Organization/CN=localhost"
2. 配置Nginx反向代理
编辑Nginx配置文件 /etc/nginx/sites-available/default,清空原有内容,填入以下配置:
server {
listen 443 ssl;
server_name your_domain_or_ip;
ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
安全头设置
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name your_domain_or_ip;
return 301 https://$host$request_uri;
}
3. 启用配置并重启服务
nginx -t
systemctl restart nginx
至此,一套具备私有化存储、应用层AES-256加密、HTTPS传输加密的涉密档案管理系统已搭建完成。所有文件在服务器磁盘上均为密文存储,即使黑客获取了服务器权限,也无法直接还原档案内容。建议在实际生产环境中,配合防火墙规则(如UFW或iptables)仅开放443端口,并定期更换加密密钥。