该存储库包含Microsoft.extensions.configuration的提供商,该提供商检索存储在AWS Secrets Manager中的秘密。
概述
每个应用程序都有某种设置,这些设置绝不应该被检查到源控件中,例如数据库连接字符串或某些外部API凭据。但是,您的应用程序需要该设置才能正确执行其工作。
.NET核心本地支持从不同来源摄入设置。这允许根据当前环境自定义应用程序。典型的示例是可以变化的数据库的连接字符串,以便每个环境可以连接到特定数据库。
从事.NET Core的开发人员通常会在其开发环境中利用秘密经理。另一方面,生产环境的设置通常存储在环境变量中。
AWS Secrets Manager为问题提供了无服务器的托管解决方案。
kralizek.extensions.configuration.awssecretsmanager提供了一种方便的方法来访问您存储在AWS Secrets Manager中的秘密。
这就是您的ASP.NET Core 2.0应用程序的外观。注意config.AddSecretsManager();在代表中传递给了ConfigureAppConfiguration方法。
public class Program { public static void Main ( string [ ] args ) { BuildWebHost ( args ) . Run ( ) ; } public static IWebHost BuildWebHost ( string [ ] args ) => WebHost . CreateDefaultBuilder ( args ) . ConfigureAppConfiguration ( ( hostingContext , config ) => { config . AddSecretsManager ( ) ; } ) . UseStartup < Startup > ( ) . Build ( ) ; }
此示例中也可以使用此代码。
您也可以在经典的控制台应用程序中使用AddSecretsManager 。
static void Main ( string [ ] args ) { var builder = new ConfigurationBuilder ( ) ; builder . AddSecretsManager ( ) ; var configuration = builder . Build ( ) ; Console . WriteLine ( \"Hello World!\" ) ; }
此示例中也可以使用此代码。
注意:上面的片段假定某些AWS凭据默认情况下可用于您的应用程序。在这里,您可以看到如何设置环境。
社区提到
- ASP.NET核心的安全秘密存储与AWS Secrets Manager(第1部分)Andrew Lock
- ASP.NET核心的安全秘密存储与AWS Secrets Manager(第2部分)Andrew Lock
- 有用的工具来管理Jerrie Pelser的应用程序秘密
- 使用AWS Secrets Manager在.NET中正确存储秘密
- 米兰·乔瓦诺维奇(MilanJovanović
- 云基础:尼克·奇帕斯(Nick Chapsas)的C#开发人员的AWS服务
亚马逊弹性Kubernetes服务(EKS)
为了对AWS Secret Manager的请求进行身份验证,POD需要使用IAM角色来授予您访问您的秘密。亚马逊介绍了IAM的服务帐户角色,以便在没有第三方解决方案的情况下实现这一目标。
但是,此功能需要安装一个额外的软件包,以通过反射加载。
dotnet add AWSSDK.SecurityToken
定制
该库提供了自定义如何从AWS Secrets Manager检索设置值并将其添加到配置提供商中的可能性。
AWS证书
默认情况下,该库让AWS SDK决定应根据可用设置使用哪些凭据。您可以通过提供自己的凭据集来自定义。
这是一些样本。
基本证书
您可以使用BasicAWSCredentials类直接提供AWS访问和秘密键。
请注意,您应该避免这种情况。毕竟,该库的目的是将我们的秘密从源代码中删除。
var credentials = new BasicAWSCredentials ( \"my-accessKey\" , \"my-secretKey\" ) ; builder . AddSecretsManager ( credentials : credentials ) ;
使用连接到配置文件(旧)的凭据
您可以使用StoredProfileAWSCredentials类使用特定配置文件。
请注意, StoredProfileAWSCredentials已被标记为过时,并将在以后的版本中删除。
var credentials = new StoredProfileAWSCredentials ( \"my_profile_name\" ) ; builder . AddSecretsManager ( credentials : credentials ) ;
使用连接到配置文件(当前)的凭据
您可以使用CredentialProfileStoreChain类从可用的不同来源获取配置文件。
var chain = new Amazon . Runtime . CredentialManagement . CredentialProfileStoreChain ( ) ; if ( chain . TryGetAWSCredentials ( \"my_profile_name\" , out var credentials ) ) { builder . AddSecretsManager ( credentials ) ; }
您可以在这里看到一个示例。
AWS地区
默认情况下,此库获取与默认配置文件相关的AWS区域中注册的秘密。您可以通过经过所需区域来更改它。
builder . AddSecretsManager ( region : RegionEndpoint . EUWest1 ) ;
您可以在这里看到一个示例。
检索之前过滤秘密
最佳实践表明,您使用IAM角色限制您的应用程序可以访问的秘密列表。这并不总是可行的,尤其是在较旧的设置中(例如,位于同一EC2实例上的多个应用程序通过EC2实例配置文件共享权限)。
在这种情况下,仍然可以通过提供要在每个返回的秘密上应用的谓词来限制您的应用程序应检索哪些秘密。
注意检索可用秘密列表及其秘密价值的列表发生在两个不同的时刻,因此您可以防止应用程序访问您不需要的秘密的价值。
var acceptedARNs = new [ ] { \"MySecretARN1\" , \"MySecretARN2\" , \"MySecretARN3\" , } ; builder . AddSecretsManager ( configurator : options => { options . SecretFilter = entry => acceptedARNs . Contains ( entry . ARN ) ; } ) ;
您可以在这里看到一个示例。
提前定义秘密列表(无需清单秘密许可)
安全最佳实践有时会阻止在生产环境中列出秘密。结果,可以定义一个代替秘密过滤器的秘密列表。使用此方法时,库只会检索给定的已AcceptedSecretArns列表中的ARN或名称的秘密。
var acceptedARNs = new [ ] { \"MySecretFullARN-abcxyz\" , \"MySecretPartialARN\" , \"MySecretUniqueName\" , } ; builder . AddSecretsManager ( configurator : options => { options . AcceptedSecretArns = acceptedARNs ; } ) ;
更改如何将值添加到配置
有时我们无法控制整个系统。也许我们被迫使用其他使用其他约定的人定义的秘密。
在这种情况下,您可以提供每次发现值时都会调用的函数。此功能允许您自定义应使用哪个密钥。
例如,在这里,我们将所有传入的钥匙转换为上情况
builder . AddSecretsManager ( configurator : options => { options . KeyGenerator = ( entry , key ) => key . ToUpper ( ) ; } ) ;
您可以在这里看到一个示例。
自定义getsecretvaluerequest
有时,我们可能想请求其他版本的秘密或指定版本阶段。
在这种情况下,您可以提供一个函数,该功能更新GetSecretValueRequest ,该功能用于在发送请求之前从AWS检索秘密。
例如,在这里,我们在每个GetSecretValueRequest中添加了\"AWSCURRENT\" VersionStage 。
builder . AddSecretsManager ( configurator : options => { options . ConfigureSecretValueRequest = ( request , context ) => request . VersionStage = \"AWSCURRENT\" ; } ) ;
自定义AmazonSecretsManagerConfig,例如使用LocalStack
在某些情况下,您可能想自定义如何构建AmazonSecretsManagerConfig,例如,当您想在本地开发过程中使用LocalStack时。在这种情况下,您应该自定义ServiceUrl。
builder . AddSecretsManager ( configurator : options => { options . ConfigureSecretsManagerConfig = c => { c . ServiceUrl = \"http://loca**lhost*:4584\" // The url that\'s used by localstack } ; } ) ;
版本控制
该库遵循公开版本的语义版本2.0.0(发布给nuget.org)。
如何构建
该项目将Cake用作制造引擎。
如果您想在本地构建此项目,只需执行build.cake脚本即可。
您可以使用蛋糕作者创建的.NET工具并使用它来执行构建脚本。
dotnet tool install - g Cake.Tool
dotnet cake
