gosec 是一个 Go 语言源码安全分析工具, 其通过扫描 Go AST(抽象语法树) 来检查源代码是否存在安全问题.
许可证
根据 Apache 2.0 版本的 License; 除非符合许可, 否则你将不能使用该文件. 你可以 在这里 http://www.apache.org/licenses/LICENSE-2.0 获取到一个许可证的副本.
安装
$ go get github.com/securego/gosec/cmd/gosec/...
使用
我们可以将 Gosec 配置为仅运行某个规则子集, 如排除某些文件路径, 生成不同格式的报告等. 在默认情况下, Gosec 将对提供的输入文件运行所有规则. 要从当前目录递归扫描, 你可以提供'./...' 作为输入参数.
选择规则
默认情况下, gosec 将针对提供的文件路径运行所有规则. 但如果你要指定运行某个规则, 则可以使用 '-include=' 参数, 或者你也可以使用 '-exclude='来排除那些你不想运行的规则.
可用规则
G101: 查找硬编码凭证
G102: 绑定到所有接口
G103: 审计不安全区块的使用
G104: 审计错误未检查
G105: 审计 math/big.Int.Exp 的使用
G106: 审计 ssh.InsecureIgnoreHostKey 的使用
G201:SQL 查询构造使用格式字符串
G202:SQL 查询构造使用字符串连接
G203: 在 html 模板中使用未转义的数据
G204: 审计命令执行情况
G301: 创建目录时文件权限分配不合理
G302:chmod 文件权限分配不合理
G303: 使用可预测的路径创建临时文件
G304: 作为污点输入提供的文件路径
G305: 提取 zip 存档时遍历文件
G401: 检测 DES,RC4 或 MD5 的使用情况
G402: 查找错误的 TLS 连接设置
G403: 确保最小 RSA 密钥长度为 2048 位
G404: 不安全的随机数源 (rand)
G501: 导入黑名单列表: crypto/md5
G502: 导入黑名单列表: crypto/des
G503: 导入黑名单列表: crypto/rc4
G504: 导入黑名单列表: net/http/cgi
- # Run a specific set of rules
- $ gosec -include=G101,G203,G401 ./...
- # Run everything except for rule G303
- $ gosec -exclude=G303 ./...
注释代码
与所有自动检测工具一样, gosec 也会出现误报的情况. 如果 gosec 报告已手动验证为安全的, 则可以使用 "#nosec" 来注释代码.
注释将导致 gosec 停止处理 AST 中的任何其他节点, 因此可以应用于整个块或应用于单个表达式中.
- import "md5" // #nosec
- func main(){
- /* #nosec */
- if x> y {
- h := md5.New() // this will also be ignored
- }
- }
在某些情况下, 你可能还需要重新访问已使用 #nosec 注释的位置. 那么你可以执行以下命令来运行扫描程序以及忽略 #nosec 注释:
$ gosec -nosec=true ./...
build 标签
gosec 能够将 Go 构建标签传递给分析器. 它们可以以逗号分隔的列表提供, 如下所示:
$ gosec -tag debug,ignore ./...
输出格式
gosec 目前支持 text,json,yaml,csv 和 JUnit XML 的输出格式. 默认情况下, 结果将以 stdout(标准输出). 但我们也可以使用 '-fmt'参数指定输出格式, 以及'-out'来指定输出文件.
- # Write output in json format to results.json
- $ gosec -fmt=json -out=results.json *.go
开发
按照此处的说明安装 dep: https://github.com/golang/dep https://github.com/golang/dep
安装最新版本的 golint: https://github.com/golang/lint
- Build
- make
- Tests
- make test
发布版本
确保你已安装了 https://github.com/goreleaser/goreleaser , 然后你可以按以下方式发布 gosec:git tag 1.0.0 export GITHUB_TOKEN= make release
dist 文件夹中提供了该工具的已发布版本. build 信息应该会被展示在 usage 文本中.
- ./dist/darwin_amd64/gosec -h
- gosec - Golang security checker
- gosec analyzes Go source code to look for common programming mistakes that
- can lead to security problems.
- VERSION: 1.0.0
- GIT TAG: 1.0.0
- BUILD DATE: 2018-04-27T12:41:38Z
注意, 所有已发布的存档也会被同步到 GitHub 上.
Docker image
你可以执行一个发布版本并 build docker 镜像:
- git tag <VERSION>
- export GITHUB_TOKEN=<Your GitHub token>
- make image
在容器中运行 gosec:
docker run -it -v <YOUR LOCAL WORKSPACE>:/workspace gosec /workspace
生成 TLS 规则
可以从 Mozilla 的 TLS ciphers https://statics.tls.security.mozilla.org/server-side-tls-conf.json 建议生成 TLS 规则配置.
首先, 你需要安装 generator 工具:
go get github.com/securego/gosec/cmd/tlsconfig/...
现在你可以在项目的根目录中调用 go generate:
go generate ./...
这将生成一个 rules/tls_config.go 文件, 其中包含来自 Mozilla 的当前 ciphers 建议.
来源: http://www.tuicool.com/articles/fUbi2yr