温馨提示×

Linux下GitLab如何进行安全审计

小樊
41
2025-12-02 18:46:52
栏目: 智能运维

Linux下GitLab安全审计实操指南

一 审计目标与总体架构

  • 覆盖对象:围绕账户与认证代码访问与变更系统层行为CI/CD流水线四条主线,建立可查询、可告警、可追溯的审计体系。
  • 日志来源与用途:
    • GitLab Rails 应用日志与审计日志:用户登录、项目/权限变更、令牌与SSH密钥操作等。
    • gitlab-shell 日志:SSH 拉取/推送等 Git 操作行为。
    • Nginx/系统日志:Web 登录爆破、异常访问、IP 来源。
    • auditd 系统审计:关键系统调用(如文件访问、权限变更)以满足合规留存。
    • PostgreSQL 审计视图:成员关系、项目授权等结构化数据核对。
  • 建议输出:统一到集中式日志平台(如 ELK/EFK),按用户/项目/时间建立索引,保留周期不少于180天,关键日志异地备份

二 日志与审计采集配置

  • 启用并落盘 GitLab 审计日志

    • 编辑配置文件:/etc/gitlab/gitlab.rb
      • 开启审计日志存储路径:audit_logs['storage_path'] = "/var/log/gitlab/audit"
      • 统一日志轮转:logging['logrotate_frequency'] = 'daily'logging['logrotate_size'] = '100M'
    • 应用配置:gitlab-ctl reconfigure
    • 采集建议:将**/var/log/gitlab/**下所有日志通过 Filebeat 发送至集中日志平台,按applicationlog_type字段区分(如gitlab-rails, gitlab-shell, nginx)。
  • 系统层审计(auditd)

    • 监控关键目录与配置变更:
      • sudo auditctl -w /etc/gitlab/ -p wa -k gitlab_config
      • sudo auditctl -w /var/opt/gitlab/gitlab-rails/ -p wa -k gitlab_rails
      • sudo auditctl -w /var/log/gitlab/ -p wa -k gitlab_logs
    • 持久化:将规则写入/etc/audit/rules.d/gitlab.rules并重启 auditd。
    • 用途:对敏感配置仓库数据日志文件的未授权访问/篡改进行取证与告警。
  • 网络与登录安全(为审计提供高质量数据源)

    • 仅开放80/443(必要时自定义SSH 2222),其余端口默认拒绝;对管理口与 Git SSH 端口实施IP 白名单
    • 防暴力登录:在 Nginx 层对/users/sign_in启用限流(如limit_req_zoneburst)。
    • 采集建议:将 Nginx 访问/错误日志纳入同一日志平台,结合源 IP、UA、失败次数做异常检测。

三 关键审计场景与查询要点

  • 账户与认证
    • 关注事件:用户创建/停用、角色变更、登录成功/失败、双因子启用/禁用、个人访问令牌(PAT)创建/撤销、SSH 密钥新增/删除。
    • 典型查询:统计某用户最近30天的失败登录次数与来源 IP;列出所有启用了2FA的管理员;追踪 PAT 的创建与最后一次使用时间。
  • 权限与项目访问
    • 关注事件:项目/组的创建与归档、成员新增/移除、权限变更(Guest→Reporter→Developer→Maintainer→Owner)、受保护分支/标签策略变更。
    • 典型查询:导出某项目的成员变更时间线;识别对关键仓库的权限放宽操作;核对离职人员账号的及时停用与权限回收。
  • 代码拉取/推送行为(下载与泄露风险)
    • 关注事件:通过 SSH/HTTP(S) 的git-upload-pack(拉取)与git-receive-pack(推送),包含用户、项目、来源 IP、时间、结果
    • 典型查询:统计某项目近7天的克隆/拉取次数与来源分布;识别非办公网对敏感仓库的访问;对异常时段/地点的拉取进行告警。
  • 系统层与合规
    • 关注事件:对/etc/gitlab//var/opt/gitlab/的读写与权限变更;异常进程执行;日志轮转与清理异常。
    • 典型查询:回溯某时间窗内对 GitLab 配置与仓库数据的未授权变更;对关键审计日志的删除/篡改行为进行取证。

四 权限与下载审计的落地方法

  • 数据库侧核对(只读审计,避免影响业务)

    • 通过 Rails 控制台或只读账号核对关键关系,示例(请先在测试环境验证 SQL):
      • 用户与 SSH 公钥:SELECT u.username, k.title, k.created_at FROM keys k JOIN users u ON k.user_id = u.id;
      • 组成员与项目授权:SELECT m.user_id, u.username, m.access_level, p.path FROM members m JOIN users u ON m.user_id = u.id JOIN projects p ON m.source_id = p.id WHERE m.source_type='Project';
      • LDAP 身份映射:SELECT u.username, i.extern_uid, i.provider FROM identities i JOIN users u ON i.user_id = u.id;
    • 用途:与 GitLab 审计日志进行交叉验证,发现“日志缺失/延迟/被篡改”的风险点。
  • 拉取/下载行为审计(gitlab-shell 日志)

    • 采集与解析/var/log/gitlab/gitlab-shell/gitlab-shell.log,提取字段如action(git-upload-pack/git-receive-pack)gl_project_pathremote_ipgit_user等,构建“用户-项目-来源 IP-时间”四维审计视图。
    • 告警建议:对来自非白名单网段的拉取、敏感项目在非工作时段拉取、单用户短时间大量克隆进行实时告警

五 代码与流水线的安全审计

  • 静态代码扫描(SAST)

    • .gitlab-ci.yml中集成 SonarQube 或 GitLab SAST,示例:
      • 触发条件:仅对合并请求主分支运行;失败时可设置质量阈阻断合并(建议先观察误报率再启用阻断)。
      • 典型流程:检出代码→运行扫描→上报结果→质量阈判定→失败则阻断合并请求。
    • 用途:将安全缺陷左移到开发阶段,形成“提交即审计”。
  • 轻量安全扫描(Semgrep)

    • 在服务端或 CI 中集成 Semgrep,对提交/合并请求触发的变更文件进行规则匹配(如 SQL 注入、命令注入、敏感信息泄露)。
    • 适用场景:快速覆盖多语言代码库、对新增/修改文件做增量审计,降低性能开销。

0