mportant;">本指南介绍了如何使用 Docker 设置 GitLab,并通过安全的 Kerberos 连接启用 Windows Active Directory 帐户的身份验证。

索引

  • 第一件事

  • 将 Debian 机器加入 Windows 域

  • 为 GitLab 设置服务主体名称

  • 设置 Docker 环境

  • 配置 GitLab

  • NGINX 配置

  • Git 客户端访问

  • 更多信息

第一件事

当然,您需要一个设置和配置的域控制器来托管 Active Directory 服务。在我的测试用例中,这是由 Windows Server 2012 R2 实例托管的。此外,您需要一台基于 Linux 的机器来托管 GitLab。为此,我使用了 Debian 10 Buster 映像。

本指南中的所有软件包安装过程都将使用apt执行。如果您使用不同的包管理器,请根据您的用例调整这些步骤。

将Debian机器加入Windows域

要访问托管 Active Directory 服务的域控制器,我们需要将 Debian 机器加入域。为此,我们使用 Linux 工具realmd

1. 使用您的包管理器安装realmd:

# apt install realmd -y

2. 现在,使用以下命令检查并测试您是否可以通过网络访问域:

# realmd discover your.domain.com

当然,假名your.domain.com必须换成你的域名。

其结果应如下所示:

your.domain.com
  type: kerberos
  real.name: YOUR.DOMAIN.COM
  domain-name: your.domain.com
  configured: no
  server-software: active-directory
  client-software: sssd
  required-packages: sssd-tools
  required-packages: sssd
  required-packages: libnss-sss
  required-packages: libpam-sss
  required-packages: adcli
  required-packages: samba-common-bin

3. 安装最后一条命令输出定义为required-packages的包。

# apt install -y sssd-tools sssd libnss-sss ...

4. 将机器加入域:

# realm join your.domain.com -U 'admin' --install=/' -v

定义的用户必须是管理员或允许将机器加入域的用户。

注意

Linux 机器在加入域时可能不会在您的域控制器上自动创建 DNS 条目。在这种情况下,您需要手动将A记录添加到您的 DNS 服务器。

设置GitLab的服务主体名称

您需要为您的 Active Directory 机器对象设置一个服务主体名称 (SPN),以允许通过 Kerberos 对您的 Web 应用程序 (GitLab) 进行安全身份验证。

为此,请在域控制器上打开管理员控制台并使用以下命令:

> setspn -A HTTP/MachineName.your.domain.com MachineName

再次,您需要将MachineName替换为 GitLab 服务器的 DNS 名称,并将your.domain.com替换为您的域的实际名称。

搭建Docker环境

这些步骤取自官方 Docker 文档关于在 Debian 上安装。

*https://docs.docker.com/install/linux/docker-ce/debian

*https://docs.docker.com/compose/install

1. 安装所需的包以安装和运行 Docker 包:

# apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

2. 添加 Dockers GPG 密钥:

# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

3. 将 Dockers 存储库添加到 apt:

# add-apt-repository \    "deb [arch=amd64] https://download.docker.com/linux/debian \
    $(lsb_release -cs) \
    stable" && apt update

4. 安装 Docker 包:

# apt install -y docker-ce docker-ce-cli containerd.io

5. 安装 docker-compose:

# curl -L \    "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/bin/docker-compose# chmod +x /usr/local/bin/docker-compose

6. 创建一个docker-compose.yml

该文件定义了 Docker 将如何设置容器以及为它们使用哪些参数。此外,它在容器之间创建了一个虚拟网络,该虚拟网络只能由它们访问,并且可以通过暴露的端口访问。

在这里您可以阅读有关 docker-compose 的更多信息。

7. 拉取镜像并创建容器:

# docker-compose up -d

之后,再次停止容器:

# docker-compose stop

配置GitLab

1. 链接keytab文件。

为了通过 Kerberos 安全地访问 Windows 域,Docker 容器需要访问主机krb5.keytab文件,该文件是在使用位于/etc/krb5.keytabrealm加入域时创建的。

该文件既可以直接复制到挂载的主机目录/etc/gitlab/(本例中为./volumes/gitlab/config/),也可以直接作为文件挂载到容器中。

之后,容器需要读取krb5.keytab文件的权限:

# docker exec gitlab chown root /etc/gitlab/krb5.keytab# docker exec gitlab chmod 0600 /etc/gitlab/krb5.keytab

如果您选择直接将文件挂载到容器中,请记住文件必须存在于主机系统上才能挂载文件,而不是在容器启动时创建目录。

2. 打开 GitLab 配置文件 (./volumes/gitlab/config/gitlab.rb) 并在文件末尾添加以下行:

当您将omniauth_allow_single_sign_on设置为true时,AD 用户可以登录,创建一个帐户并在之后自动阻止它。如果禁用此功能,则必须先在 GitLab 中创建每个帐户,然后将其链接到 AD 标识符。阅读这个了解更多信息。

3. 运行 GitLab 重新配置命令以使您的更改生效。此外,这必须在 docker 容器内完成:

# docker exec gitlab gitlab-ctl reconfigure

4. 重新启动 GitLab 容器。

然后,内部身份验证下方应该会出现一个名为Kerberos Spnego的新身份验证方法。此方法使用您的 Windows 登录票作为身份验证,因此您无需输入您的帐户凭据。之后,将通知您的帐户已被阻止。不用担心,GitLab 默认会为 AD 用户创建账户并在之后自动阻止它。该帐户必须由 GitLab 管理员手动解除阻止。

NGINX 配置

正如docker-compose.yml文件中定义的那样,我们将 ENGINX Web 服务器作为实际 GitLab 服务器之上的附加层。这对于管理 SSL 证书和配置到 GitLab 服务器的进一步 HTTP 路由非常有用。

在我们的例子中,我们使用以下命令创建一个自签名 SSL 证书:

# mkdir -p /etc/cert# openssl req \
     -x509 \
     -newkey rsa:4096 \
     -keyout /etc/cert/key.pem \
     -out /etc/cert/cert.pem \
     -days 365 \
     -nodes

当然,如果您已经拥有有效证书,则可以使用该证书。

然后,在容器的卷(./volumes/nginx/config/nginx.cfg)中创建 NGINX 配置文件:

在这里您可以阅读有关 NGINX 配置的完整详细文档:

为了支持 Active Directory 身份验证,我们需要使用large_client_header_buffers配置密钥来增加 NGINX 的客户端标头缓冲区的大小。在此处阅读有关此的更多信息。

Git客户端访问

通常,您可以在您的开发客户端上创建一个 GPG 密钥对,并将您的公钥推送到您的 GitLab 帐户,以通过 SSH 访问存储库。此步骤绕过 Kerberos 身份验证,因为它仅基于链接到您的私钥的相应公钥的身份验证。

当然,您还可以使用 Kerberos 身份验证通过 HTTPS 克隆和访问存储库。

为此,您需要在 Git 客户端上设置两个配置值:

首先,下载 GitLab 证书并使用浏览器将其作为 base64 编码的 X.509 证书文件进行保护。

然后,在您的 git 客户端配置中将该文件设置为受信任的证书:

$ git config --global http.sslCAInfo <PathToTheDownloadedCertFile>

此外,如果您使用的是 Git v.2.11 或更新版本并且会出现以下错误:

remote: HTTP Basic: Access deniedfatal: Authentication failed for '<KRB5 path>'

设置以下配置以解决此问题:

$ git config --global http.emptyAuth true

然后,您可以使用Kerberos链接到您的存储库,例如https://:@MachineName:8443/jd/coolrepo.git,访问客户端上的上游存储库。同样与 Web 界面登录类似,您不需要输入您的帐户凭据,因为身份验证使用 Kerberos 票证系统。

如果您使用HTTPS链接,您可能需要输入您的 AD 帐户凭据,因为这是一种基于密码的身份验证方法。

更多信息

在这里,您可以找到我也用于实现此设置的更多阅读材料和信息:

  • https://docs.gitlab.com/ee/integration/kerberos.html

  • https://docs.gitlab.com/omnibus/docker/

  • https://4sysops.com/archives/join-a-debian-linux-server-to-an-active-directory-domain/

  • https://www.systutorials.com/docs/linux/man/8-realm/

  • https://blogs.technet.microsoft.com/pie/2018/01/03/all-you-need-to-know-about-keytab-files/

  • https://support.microsoft.com/en-us/help/929650/how-to-use-spns-when-you-configure-web-applications-that-are-hosted-on

  • https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/cc731241(vu003dws.11)

有关 NGINX 的更多信息

  • https://www.nginx.com/resources/wiki/start

  • https://nginx.org/en/docs/http/ngx_http_core_module.html

有关 Docker 和 docker-compose 的更多信息

  • https://docs.docker.com/

  • https://docs.docker.com/compose/

  • https://docs.docker.com/compose/compose-file/