1. 精簡超級用戶權限
定期檢查/etc/passwd
文件,確認僅必要賬戶擁有root權限(UID=0),使用passwd -l
命令鎖定冗余root賬戶,減少潛在攻擊面。
2. 強化密碼策略
修改/etc/login.defs
文件,設置密碼復雜度要求(包含大小寫字母、數字、特殊字符,長度≥10位),并通過chage
命令強制用戶定期修改密碼。
3. 保護關鍵系統文件
使用chattr +i
命令為/etc/passwd
、/etc/shadow
、/etc/group
、/etc/gshadow
添加不可修改屬性,防止未授權篡改;確保存儲路徑權限為600
(僅root可讀寫)。
4. 限制su命令使用
編輯/etc/pam.d/su
文件,添加auth required pam_wheel.so use_uid
配置,僅允許wheel
組的用戶使用su
切換至root,避免普通用戶獲取root權限。
5. 配置root賬戶自動注銷
在/etc/profile
文件中設置TMOUT=300
(單位:秒),使root賬戶空閑5分鐘后自動注銷,降低因長時間未操作導致的安全風險。
6. 防火墻與SELinux配置
使用firewalld
或iptables
限制Golang應用的網絡訪問,僅開放必要端口(如80、443);將SELinux設置為強制模式(setenforce 1
),通過策略限制進程權限,防止越權操作。
1. 防止SQL注入
使用database/sql
包的參數化查詢(Prepared Statements)或預編譯語句,避免直接拼接SQL語句;例如:
query := "SELECT id, name FROM users WHERE username = ?"
row := db.QueryRow(query, username)
禁止使用字符串拼接方式構造SQL。
2. 防止XSS攻擊
使用html/template
或text/template
包渲染HTML,自動轉義特殊字符(如<
、>
、&
);避免直接輸出用戶輸入的內容,例如:
t, _ := template.ParseFiles("template.html")
t.Execute(w, userInput) // 自動轉義HTML標簽
禁止使用fmt.Fprintf
直接輸出未轉義的用戶輸入。
3. 防止CSRF攻擊
使用gorilla/csrf
等中間件生成并驗證CSRF Token,確保請求來自合法用戶;在表單中添加Token字段,在后端驗證Token有效性。
4. 啟用TLS加密通信
使用crypto/tls
包配置HTTPS,加載SSL證書(如Let’s Encrypt免費證書),強制應用通過HTTPS傳輸數據;例如:
cert, _ := tls.LoadX509KeyPair("cert.pem", "key.pem")
tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}}
server := &http.Server{Addr: ":443", TLSConfig: tlsConfig}
server.ListenAndServeTLS("", "")
避免使用HTTP傳輸敏感信息(如密碼、個人信息)。
5. 設置內容安全策略(CSP)
通過HTTP響應頭Content-Security-Policy
限制瀏覽器加載的資源,防止惡意腳本執行;例如:
w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self' cdn.example.com")
禁止加載未經授權的外部腳本、樣式表或圖片。
6. 安全依賴管理
使用go mod
管理第三方依賴,定期運行go mod tidy
清理無用依賴;通過govulncheck
(官方漏洞掃描工具)或gosec
(第三方安全掃描工具)檢查依賴項的安全性,及時更新存在漏洞的庫。
1. 輸入驗證與輸出轉義
對所有用戶輸入(如表單、URL參數、HTTP頭部)進行嚴格驗證,使用正則表達式或validator
庫檢查輸入格式(如郵箱、手機號);輸出時使用模板引擎自動轉義特殊字符,避免XSS攻擊。
2. 安全密碼存儲
使用golang.org/x/crypto/bcrypt
包對用戶密碼進行哈希處理,設置合適的成本因子(如bcrypt.DefaultCost=10
),避免明文存儲密碼;例如:
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
驗證密碼時使用bcrypt.CompareHashAndPassword
函數,避免 timing attack。
3. 避免全局變量
盡量使用局部變量或結構體封裝狀態,減少全局變量的使用;全局變量可能導致并發問題(如數據競爭),增加安全風險。
4. 妥善處理錯誤
避免在錯誤處理中泄露敏感信息(如數據庫連接字符串、文件路徑),使用log
包記錄錯誤時,過濾敏感內容;例如:
if err != nil {
log.Printf("操作失敗: %v", err) // 避免直接輸出err.Error()
http.Error(w, "內部服務器錯誤", http.StatusInternalServerError)
}
禁止將錯誤信息直接返回給客戶端。
5. 會話安全管理
使用gorilla/sessions
等安全會話庫,設置會話Cookie的HttpOnly
(防止XSS竊取Cookie)、Secure
(僅HTTPS傳輸)、SameSite=Strict
(防止CSRF)屬性;定期更換會話密鑰,避免會話固定攻擊。
1. 定期更新系統與依賴
使用yum update -y
命令定期更新CentOS系統及軟件包,修復已知漏洞;使用go get -u ./...
命令更新Golang依賴庫,確保使用最新安全版本。
2. 日志記錄與監控
配置日志記錄(如使用log
包或ELK
棧),記錄應用運行狀態、用戶操作、錯誤信息;設置監控告警(如Prometheus
+Grafana
),及時發現異常行為(如大量失敗登錄、異常請求頻率)。
3. 代碼審查與安全測試
定期進行代碼審查,重點檢查輸入驗證、權限控制、敏感信息處理等環節;使用gosec
、govulncheck
等工具進行自動化安全測試,發現并修復潛在漏洞。