写在前面
众所周知,GitHub 是全球最大的代码托管平台,它在 2019 年报中提到平台已拥有超过 4000 万开发者,全年共创建了 4400 万个仓库。而在庞大的数字的背后,每天却发生着大量的安全泄露!我们需要实时监控 GitHub,防止出现重大安全事故。
工具介绍
GitHub 代码泄露监控工具 - 码小六,基于 PHP + Laravel 构建,开源免费
仓库地址:
https://github.com/4x99/code6
系统特点:
1、全可视化界面,操作简单
2、支持 GitHub 令牌管理及智能调度
3、扫描结果信息丰富,支持批量操作
4、任务配置灵活,可单独配置任务扫描参数
5、支持白名单模式,主动忽略白名单仓库
运行环境
Linux
PHP >= 7.3.0
Composer
MySQL >= 5.7
Apache >= 2.4
安装部署
码小六支持 Docker 部署与源码部署,在这里我选择使用docker部署。
Docker 镜像不含 MySQL 实例,请安装 MySQL、创建数据库并授权。
我使用的是华为的云耀云,centos7.6系统,需要先自己安装下mysql。
安装MySQL
1).在/usr/local/目录下(看个人情况)新建文件夹mysql用来存放下载好的MySQL Yum Repository(mkdir mysql);
2).从https://dev.mysql.com/downloads/repo/yum/下载MySQL Yum Repository(选择所使用的linux发行版对应的版本,这里选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package)。下载到本地后用命令 rz -be
上传到服务器上。
3).安装MySQL Yum Repository,执行命令sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm;
[root@hecs mysql]# ls
mysql80-community-release-el7-3.noarch.rpm
[root@hecs mysql]# sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
warning: mysql80-community-release-el7-3.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql80-community-release-el7-3 ################################# [100%]
[root@hecs mysql]#
4).选择MySQL版本,执行命令yum repolist all | grep mysql查看所有版本,执行命令yum-config-manager --disable mysql80-community禁用默认选择的版本,执行命令选择所需要的版本yum-config-manager --enable mysql57-community,最后执行yum repolist enabled | grep mysql使选择生效(如果提示命令不存在,安装yum-utils:执行命令:yum -y install yum-utils);
[root@hecs mysql]# yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community disabled
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community disabled
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community disabled
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community disabled
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community disabled
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community disabled
mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 153
mysql-connectors-community-source MySQL Connectors Community - disabled
mysql-tools-community/x86_64 MySQL Tools Community enabled: 110
mysql-tools-community-source MySQL Tools Community - Sour disabled
mysql-tools-preview/x86_64 MySQL Tools Preview disabled
mysql-tools-preview-source MySQL Tools Preview - Source disabled
mysql55-community/x86_64 MySQL 5.5 Community Server disabled
mysql55-community-source MySQL 5.5 Community Server - disabled
mysql56-community/x86_64 MySQL 5.6 Community Server disabled
mysql56-community-source MySQL 5.6 Community Server - disabled
mysql57-community/x86_64 MySQL 5.7 Community Server disabled
mysql57-community-source MySQL 5.7 Community Server - disabled
mysql80-community/x86_64 MySQL 8.0 Community Server enabled: 177
mysql80-community-source MySQL 8.0 Community Server - disabled
[root@hecs mysql]# yum-config-manager --disable mysql80-community
Loaded plugins: fastestmirror
================================================================== repo: mysql80-community ==================================================================
...省略...
[root@hecs mysql]# yum-config-manager --enable mysql57-community
Loaded plugins: fastestmirror
================================================================== repo: mysql57-community ==================================================================
...省略...
[root@hecs mysql]# yum repolist enabled | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community 153
mysql-tools-community/x86_64 MySQL Tools Community 110
mysql57-community/x86_64 MySQL 5.7 Community Server 424
[root@hecs mysql]#
5).安装MySQL,执行命令yum install mysql-community-server(全程选y),安装完成!
6).开启MySQL服务:service mysqld start(对于EL7-based平台,首选命令:systemctl start mysqld.service);
7).查看MySQL状态:service mysqld status(对于EL7-based频台,首选命令:systemctl status mysqld.service);
Docker部署
# 创建镜像
git clone https://github.com/4x99/code6.git
cd code6 && docker build -t code6 .
# 启动容器(宿主机映射端口 666 与 MySQL 连接参数请根据情况修改,容器启动将自动连接 MySQL 并导入数据表)
docker run -d \
-p 666:80 \
-e MYSQL_HOST=172.17.0.1 \
-e MYSQL_PORT=3306 \
-e MYSQL_DATABASE=code6 \
-e MYSQL_USERNAME=xxx \
-e MYSQL_PASSWORD=xxxxxx \
--name code6-server code6
# 进入容器创建用户
docker exec -it code6-server /bin/bash
php artisan code6:user-add <邮箱> <密码>
在执行命令php artisan code6:user-add <邮箱> <密码>时遇到错误:
root@544263f6a916:/var/www/html# php artisan code6:user-add xxxx.com xxxx
In Connection.php line 671:
SQLSTATE[HY000] [1130] Host '172.17.0.2' is not allowed to connect to this MySQL server (SQL: select * from `user` where (`email` = xxxxxx.com) limi
t 1)
In Connector.php line 70:
SQLSTATE[HY000] [1130] Host '172.17.0.2' is not allowed to connect to this MySQL server
这是因为你可能忘记配置mysql了,需要在mysql里自己增加一个用户,允许在172.17.0.2这个ip登录,并且记得创建code6这个数据库。
解决方法:
mysql> create user 'xxx'@'172.17.0.2' identified by 'xxxxx';
Query OK, 0 rows affected (0.00 sec)
mysql> create database code6;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| code6 |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> grant all on *.* to 'xxx'@'172.17.0.2';
Query OK, 0 rows affected (0.00 sec)
将在这里创建的用户名密码填入上面的
-e MYSQL_USERNAME=xxx \
-e MYSQL_PASSWORD=xxxxx \
做完以上的工作就安装完成了,此时便可以通过 http://<宿主机 IP>:666
访问系统。
设置令牌
进入系统的第一步需要到 [ 令牌配置 ] 模块配置 GitHub 令牌
如何申请令牌?
GitHub -> Settings -> Developer settings -> Personal access tokens -> Generate new token
直达地址:
https://github.com/settings/tokens/new
其他说明
1、建议至少配置 5 个令牌
2、不能用同一个 GitHub 账号创建多个令牌(这些令牌共享账号配额)
3、码小六在进行扫描任务时会自动检测更新令牌配额并进行调度
4、若令牌状态时而正常时而异常有可能是因为请求 GitHub 网络不通畅造成(可忽略)
开始使用
接下来可以到 [ 任务配置 ] 模块设置扫描任务啦!
关键字的选择
公司邮箱后缀、域名、项目标识是不错的选择,如果能在公司推行安全规范,在每个项目工程内放置唯一标识,并将此标识作为扫描关键字便能实现精准监控。
扫描结果存储
扫描结果存储入库目前支持以下选项:
1、记录文件的每个版本:即文件每次提交(包含关键字)会产生一条新的未审记录
2、一个文件只记录一次
3、一个仓库只记录一次
如果只关注项目维度选择“一个仓库只记录一次”即可,这样会大大减少需要审核的结果记录。
扫描结果
码小六的 [ 扫描结果 ] 模块显示了匹配到关键字的扫描记录,可以将这些记录设置为以下状态:
未审:未审核的记录
误报:已确认正常的记录
异常:已确认异常的记录
解决:异常且已处理的记录
结果处理
如果通过 GitHub 个人主页、代码或 Commit 记录中能找到仓库拥有者的联系方式,可以直接联系处理。如果联系不上,则只能通过 GitHub DMCA (数字千年版权法),写邮件给 GitHub 申请下架仓库(建议各在公司内建立相关预案以便能快速处理此类问题),帮助文档:
https://help.github.com/en/github/site-policy/guide-to-submitting-a-dmca-takedown-notice