1. 強化日志文件權限管理
遵循最小權限原則,為Node.js應用創建專用用戶(如nodeapp
)和組(如nodeapp
),避免使用root運行。將日志目錄(如/var/log/my-node-app
)的所有者設為nodeapp
,權限設置為750
(所有者可讀寫執行,組可讀執行,其他用戶無權限)。對于敏感日志文件,進一步收緊權限至600
(僅所有者可讀寫)。例如:
sudo groupadd nodeapp
sudo useradd -g nodeapp nodeapp -s /bin/false
sudo mkdir -p /var/log/my-node-app
sudo chown nodeapp:nodeapp /var/log/my-node-app
sudo chmod 750 /var/log/my-node-app
在應用代碼中,創建日志文件時指定權限(如0o640
):
const fs = require('fs');
const logStream = fs.createWriteStream('/var/log/my-node-app/app.log', {
flags: 'a',
mode: 0o640 // -rw-r-----
});
2. 使用安全的日志庫
選擇成熟、功能豐富的日志庫(如Winston、Bunyan、Pino),替代原生console.log
。這些庫支持:
error
、warn
、info
),避免記錄敏感的調試信息(如密碼、密鑰);GzipTransport
、HTTPS Transport
),防止日志傳輸中被竊取。const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/my-node-app/error.log', level: 'error' }),
new winston.transports.File({ filename: '/var/log/my-node-app/combined.log' })
]
});
3. 實施日志輪轉與清理
使用logrotate
工具自動管理日志文件,防止單個文件過大導致存儲溢出或難以分析。創建/etc/logrotate.d/my-node-app
配置文件,設置:
daily
,每日輪轉);rotate 14
,保留14天日志);compress
,壓縮舊日志節省空間);create 640 nodeapp nodeapp
,新日志文件繼承正確權限)。/var/log/my-node-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 nodeapp nodeapp
sharedscripts
postrotate
[ ! -f /var/run/my-node-app.pid ] || kill -USR1 `cat /var/run/my-node-app.pid`
endscript
}
4. 加密敏感日志數據
對存儲的日志文件進行加密,防止數據泄露??墒褂肔inux自帶工具(如GnuPG
)或編程方式(如Node.js的crypto
模塊):
sudo apt install gpg
gpg --symmetric --cipher-algo AES256 --output encrypted.log.gpg myapp.log
解密時使用私鑰:gpg --decrypt --output myapp.log encrypted.log.gpg
openssl enc -aes-256-cbc -salt -in myapp.log -out encrypted.log.enc -pass pass:yourpassword
解密時:openssl enc -d -aes-256-cbc -in encrypted.log.enc -out myapp.log -pass pass:yourpassword
5. 監控與審計日志活動
部署SIEM系統(如Splunk、ELK Stack、Graylog),實時收集、分析和可視化日志。設置警報規則(如頻繁的登錄失敗、異常API調用),及時發現潛在攻擊。例如,使用ELK Stack:
/var/log/my-node-app
目錄);tail -f
或grep
),檢查是否有敏感信息泄露或異常行為。6. 防止敏感信息泄露
在代碼中避免直接記錄敏感數據(如用戶密碼、API密鑰、銀行卡號)。使用環境變量(如.env
文件)存儲敏感信息,并通過dotenv
庫加載:
# .env文件
DB_PASSWORD=mysecretpassword
API_KEY=1234567890
代碼中讀?。?/p>
require('dotenv').config();
const dbPassword = process.env.DB_PASSWORD;
確保.env
文件不被提交到版本控制系統(如Git),在.gitignore
中添加:
.env
7. 保持系統和依賴更新
定期更新Ubuntu系統和Node.js相關依賴(如日志庫、框架),修補已知安全漏洞。使用以下命令更新:
sudo apt update && sudo apt upgrade -y
npm outdated # 檢查過期的依賴
npm update # 更新依賴
對于Node.js版本,建議使用nvm
(Node Version Manager)管理,方便切換版本和安裝安全更新:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
source ~/.bashrc
nvm install --lts
nvm use --lts