gitlab-ee使⽤mysql_内部代码管理平台Gitlab下载及权限审计企业通常会使⽤Gitlab作为内部代码管理平台,⼀来私有仓库更加安全,⼆来gitlab的功能⼗分完整。但仍不能保证私有仓库中的代码不被泄露到外部,于是对gitlab的权限审计以及下载审计就变得尤为重要。本⽂将基于gitlab-ee-11.10版本,详细叙述如何对gitlab的权限及代码下载进⾏审计。
0×00 快速部署gitlab
笔者使⽤了docker进⾏快速部署:
docker pull gitlab/gitlab-ee
docker run --detach --ample --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume
/srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:latest
gitlab可以与ldap绑定,使⽤AD域账号进⾏登录。如果想要修改gitlab.rb⽂件,可以登⼊到容器中修改:
docker exec -it CONTAINER_ID /bin/bash
0×01 Git的传输协议了解
Git主要以两种⽅式跨越两个仓库传输数据。
1.哑协议
Git基于HTTP之上传输通常被称为哑协议,这是因为它在服务端不需要有针对Git特有的代码。这个获取过程仅仅是⼀系列GET请求,客户端可以假定服务端的Git仓库中的布局。简单解读官⽅给出的举例,⼀次git clone过程:
Initialized empty Git repository in /private/tmp/simplegit-progit/.git/ //在/private/tmp/simplegit-progit/.git/⽬录中初始化⼀个空的git仓库
got ca82a6dff817ec66f44342007202690a93763949 //获取info/refs⽂件,这个⽂件由服务端的update-server-info⽣成,⽤于给不进⾏动态包⽣成的哑服务器提供辅助信息⽂件,以帮助客户机发现服务器有哪些引⽤和包,哑服务器意味着通过http访问
walk ca82a6dff817ec66f44342007202690a93763949 //获取commit对象
got 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 //查看commit对象的内容
Getting index for pack 816a9b2334da9953e530f27bcac22082a9f5b835 //获取这个打包⽂件的索引
mysql下载要钱吗Getting pack 816a9b2334da9953e530f27bcac22082a9f5b835 which contains
cfda3bf379e4f8dba8717dee55aab78aef7f4daf //查看打包⽂件的索引是否包括要的对象
walk 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 //获取commit
walk a11bef06a3f659402fe7563abf99ad00de2209e6 //下载对象
2.智能协议
HTTP⽅法是很简单但效率不是很⾼。使⽤智能协议是传送数据的更常⽤的⽅法。这些协议在远端都有Git智能型进程在服务,它可以读出本地数据并计算出客户端所需要的合适的数据给它,这有两类传输数据的进程:⼀对⽤于上传数据和⼀对⽤于下载。此处只对下载展开描述:
当下载数据时,fetch-pack和upload-pack进程就起作⽤了。客户端启动fetch-pack进程,连接⾄远端的upload-pack进程,以协商后续数据传输过程。在远端仓库有不同的⽅式启动upload-pack进程。你可以使⽤与receive-pack(接收推送到存储库中的内容时所启⽤的进程)相同的透过SSH管道的⽅式,也可以通过Git后台来启动这个进程,它默认监听在9418号端⼝上。这⾥fetch-pack进程在连接后像这样向后发送数据:
fgit-upload-pack schacon/simplegit-progit.git\0host=myserver\0
它也是以4字节指定后续字节长度的⽅式开始,然后是要运⾏的命令,和⼀个空字节,然后是服务端的主机名,再跟随⼀个最后的空字节。Git后台进程会检查这个命令是否可以运⾏,以及那个仓库是否存在,以及是否具有公开权限。如果所有检查都通过了,它会启动这个upload-pack进程并将客户端的请求移交给它。
如果你透过SSH使⽤获取功能,fetch-pack会像这样运⾏:
ssh -x git@github "git-upload-pack 'schacon/simplegit-progit.git'"
0×02 gitlab数据库结构了解
docker镜像使⽤的是postgresql数据库,⼀共有236张数据表,我们知道gitlab采⽤了ueba的⽤户权限管理模型,因此想要获得⽤户、项⽬、项⽬组、key之间的关系,我们⾸先要关⼼这⼏张表:
identities存储ldap的信息,其中extern_uid存储ldap的部门等信息 :
ColumnType id integer extern_uid character varying provider character varying user_id integer created_at timestamp
without time zone updated_at timestamp without time zone secondary_extern_uid character varying saml_provider_id
integer
keys存储key,以及与user_id的对应关系:
ColumnType id integer user_id integer created_at timestamp without time zone updated_at timestamp without time zone key text title character varying type character varying fingerprint character varying public boolean last_used_at timestamp without time zone
namespaces存储⽤户及项⽬组的路径,主要⽤于获取项⽬组(type=’Group’)的信息(description)
ColumnType id integer name character varying path character varying owner_id integer created_at timestamp without time zone updated_at timestamp without time zone type character varying description character varying avatar character varying membership_lock boolean share_with_group_lock boolean visibility_level integer request_access_enabled boolean
ldap_sync_status character varying ldap_sync_error character varying ldap_sync_last_update_at timestamp without time zone ldap_sync_last_successful_update_at timestamp without time zone lda
p_sync_last_sync_at timestamp without time zone description_html text lfs_enabled boolean parent_id integer shared_runners_minutes_limit integer repository_size_limit bigint require_two_factor_authentication boolean two_factor_grace_period integer cached_markdown_version integer plan_id integer project_creation_level integer runners_token character varying trial_ends_on timestamp with time zone
file_template_project_id integer saml_discovery_token character varying runners_token_encrypted character varying
custom_project_templates_group_id integer auto_devops_enabled boolean extra_shared_runners_minutes_limit integer
project_authorizations存储⽤户、项⽬以及访问权限的关系
ColumnType user_id integer project_id integer access_level integer
其中,access_level的含义为:
10 => Guest access
20 => Reporter access
30 => Developer access
40 => Maintainer access
50 => Owner access # Only valid for groups
projects存储项⽬信息:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。