gpt4 book ai didi

.net - 使用 AWS ECS 从 Linux 容器上运行的 .NET Core 应用程序访问具有集成安全性的 SQL Server

转载 作者:行者123 更新时间:2023-12-03 07:59:56 32 4
gpt4 key购买 nike

我有一个使用 AWS ECS Fargate 在 Linux 容器上运行的 .NET Core 应用程序。

如何使用集成安全性从该应用程序连接到 SQL Server?

最佳答案

第 1 步:确保 SQL Server 支持 Kerberos 身份验证 #使用 SQL Server Management Studio (SSMS),连接到您的数据库并执行以下语句:

select auth_scheme  
from sys.dm_exec_connections
where session_id = @@spid

如果查询结果是KERBEROS ,您已准备就绪并继续执行步骤 2。否则,如果结果为 NTLM ,这意味着 Kerberos 身份验证失败,SSMS 默默地回退到使用 NTLM 身份验证。由于 SQL Server 和 Linux 环境中运行的客户端之间的集成安全性完全依赖于 Kerberos 身份验证,因此必须首先解决此问题。

注意:连接到 SQL Server 时,请务必使用服务器主机名或 FQDN 而不是 IP 地址,否则 Kerberos 身份验证将不起作用。

检查 SPN 配置

Ensure that SPN is properly configured for SQL Server.

Microsoft 还发布了多种可以帮助进行 SPN 验证和配置的诊断工具:

最后但并非最不重要的一点是,您可以使用以下 setspn查询特定 SPN 的命令:

setspn -T CONTOSO.COM -F -Q MSSQLSvc/your_sql_server.contoso.com

上面的查询确实支持*对于通配符(将 CONTOSO.COM 替换为您的域名)

配置 Kerberos 允许的加密类型

在 Active Directory 中,找到运行 SQL Server 的帐户。在“帐户”选项卡和“帐户选项”部分下,确认 applicable Kerberos cyphers are selected .

示例:

enter image description here

第 2 步:配置 ECS 任务要使用 Kerberos 身份验证,ECS 服务中的应用程序任务将由两个容器组成:

  1. 一个容器,将使用 kinit 定期(重新)获取和缓存 Kerberos 票证授予票证 (TGT)命令。
  2. 一个容器,将运行应用程序,并使用第一个任务获取的 TGT 对 MS SQL Server 进行身份验证。

两个容器将安装相同的卷。第一个容器将缓存/写入 TGT 票证,第二个容器将从其中读取缓存的 TGT 票证。

TGT获取容器(sidecar容器)

设置 TGT 获取容器只需要 3 个文件:

  1. krb5.conf - Kerberos 配置文件。
  2. renew.sh - 包含更新 TGT 命令的脚本文件。
  3. Dockerfile - 将所有内容打包到 Docker 镜像中。
# krb5.conf
[libdefaults]
dns_lookup_realm = true
dns_lookup_kdc = true
forwardable = true
default_ccache_name = FILE:/var/kerberos/krbcache # TGT cache location
default_realm = CONTOSO.COM
permitted_enctypes = aes256-cts aes128-cts

[realms]
CONTOSO.COM = {
kdc = CONTOSO.COM
admin_server = CONTOSO.COM
}

[domain_realm]
.contoso.com = SCIF.COM
contoso.com = SCIF.COM

[logging]
default = STDERR
# renew.sh
#!/bin/bash

# Refresh the token periodically.
# Set the length of time that the script will wait to refresh the token.
[[ "$DELAY_SECONDS" == "" ]] && DELAY_SECONDS=3600

# If the AWS region hasn't been set, get it from instance metadata. This will work in an instance as well as in an ECS container.
[[ "$AWS_REGION" == "" ]] && AWS_REGION=$(curl --silent http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)

# Use the ECS container as the source for AWS credentials. This allows the AWS CLI to use the permissions of the task role.
aws configure set credential_source EcsContainer


while true
do
echo "Starting ticket renewal at: " + $(date)

# Get the credentials from Secrets Manager.
CREDENTIALS_SECRET_VALUE=$(aws secretsmanager get-secret-value --secret-id $CREDENTIALS_SECRET_ARN --region $AWS_REGION --query SecretString --output text)

# Use `jq` to parse the credentials into username & password.
CREDENTIALS_USERNAME=$(echo $CREDENTIALS_SECRET_VALUE | jq -r '.username')
CREDENTIALS_PASSWORD=$(echo $CREDENTIALS_SECRET_VALUE | jq -r '.password')

# Use the username & password to authenticate to Kerberos. The resulting token is written to the token cache,
# which is set up in `krb5.conf` to use the task scratch volume, shared by all containers.
echo $CREDENTIALS_PASSWORD | kinit $CREDENTIALS_USERNAME -f -V $OPTIONS

echo "Ticket renewal complete, waiting for $DELAY_SECONDS seconds"


sleep $DELAY_SECONDS &
wait
done
# Dockerfile

FROM amazonlinux:2

COPY renew.sh /
COPY krb5.conf /etc/krb5.conf

# Install the Kerberos tools -- to authenticate;
# `jq` -- to parse the credentials from the AWS Secrets Manager, which returns JSON
# `unzip` -- to install the latest version of the AWS CLI
RUN yum install -y krb5-workstation jq unzip

# Download and install the latest version of the AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install

VOLUME ["/var/kerberos"]

ENTRYPOINT ["/renew.sh"]

基于 CREDENTIALS_SECRET_ARN 中指定的值,renew.sh 将定期更新 TGT 并将其缓存/保存在 krb5.conf 文件指定的位置(例如 /var/kerberos/krbcache )。

要测试容器是否成功获取给定原则的 TGT,请与容器建立交互 session 并执行 klist命令。成功后,您应该看到 TGT 票证的详细信息,包括主体名称、到期日期等。

应用程序容器

应用程序容器运行您的.NET Core应用程序。要在该容器上启用 Kerberos,请在 Dockerfile 中添加以下行:

...
RUN apt update
RUN apt install -y krb5-config krb5-user
COPY krb5.conf /etc/krb5.conf
VOLUME ["/var/kerberos"]
...

krb5.conf 文件的内容应与 TGT 获取容器中的内容相同,它将指示应用程序将 Kerberos TGT 定位于 FILE:/var/kerberos/krbcache .

您的应用程序 SQL 连接字符串应类似于以下内容:

Server=yourSqlServer.contoso.com;Initial Catalog=YourDB;Integrated Security=true;

要测试容器是否有权访问缓存的 TGT,请与容器建立交互 session 并执行 klist 。成功后,您应该看到与另一个容器中相同的 TGT 票证。

如果一切顺利,您应该能够使用集成安全性从 Linux 上运行的 .NET Core 应用程序成功连接到 SQL Server。

其他资源

关于.net - 使用 AWS ECS 从 Linux 容器上运行的 .NET Core 应用程序访问具有集成安全性的 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74667855/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com