帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:  credential  工具  UTIL  凭证  UTI  MAN  
A little utility for managing credentials in the cloud

  • 源代码名称:credstash
  • 源代码网址:http://www.github.com/fugue/credstash
  • credstash源代码文档
  • credstash源代码下载
  • Git URL:
    git://www.github.com/fugue/credstash.git
  • Git Clone代码到本地:
    git clone http://www.github.com/fugue/credstash
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/fugue/credstash
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • CredStash

    快速安装

    • ( 仅 Linux ) 安装依赖项
    • pip install credstash
    • 在KMS中设置名为credstash的密钥( 在IAM控制台中找到)
    • 确保你在 boto/botocore可以读取它们的地方有AWS证书
    • credstash setup

    Linux安装时间依赖性

    Credstash最近从PyCrypto移动到 cryptographycryptography 在OSX和 Windows 上使用预先构建的二进制轮,但不在Linux上。 也就是说,如果想在linux上运行 credstash,就需要安装一些依赖项。

    对于Debian和 Ubuntu,以下命令将确保安装所需的依赖项:

    
    $ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
    
    
    
    

    对于Fedora和rhel衍生品,以下命令将确保安装所需的依赖项:

    
    $ sudo yum install gcc libffi-devel python-devel openssl-devel
    
    
    
    

    无论哪种情况,一旦安装了依赖项,就可以像往常一样执行 pip install credstash

    有关更多信息,请参见 https://cryptography.io/en/latest/installation/

    这是什么?

    软件系统通常需要访问一些共享的凭证。 例如web应用程序需要访问数据库密码或者某些第三方服务的API密钥。

    有些组织构建完整的凭证管理系统,但对于我们大多数人来说,管理这些凭证通常是事后。 最好的情况是,人们使用ansible库,这样做很不错,但会导致其它管理问题。 许多凭证管理方案的数量仅为 scp'将 secrets 文件输出到队列,或者在最坏的情况下,将密钥刻录到SCM中( 在 password 中进行github搜索) )。

    CredStash使用AWS密钥管理服务( KMS ) 为密钥包装和主密钥存储提供了一个非常简单,易于使用的凭据管理和分发系统,并提供了凭据存储和共享。

    与其他语言的兼容性

    有许多伟大的项目可以提供credstash与其他语言的兼容性。 以下是我们对( 如果你知道其他问题,可以随意打开一个请求请求) 所了解的内容:

    :它是如何工作的

    完成 Setup 部分中的步骤之后,将在 dbo ( 本文中,我们将把那个键称为 master key ) 中有一个加密密钥,以及数据库中的凭据存储 table。

    隐藏密钥

    每当你想存储/共享凭证( 比如数据库密码) 时,你只需运行 credstash put [credential-name] [credential-value] 例如 credstash put myapp.db.prod supersecretpassword1234 credstash将进入KMS并生成唯一的数据加密密钥,它本身由主密钥( 这称为密钥包装) 加密。 credstash将使用数据加密密钥来加密凭据值。 然后它将存储加密的凭据,以及DynamoDB中的凭证存储中包装的( 已经加密) 数据加密密钥。

    你也可以通过引用文件或者通过通过 stdin 传递秘密来存储凭证。 若要从文件中添加秘密,而不是作为参数传递密钥,请传递包含 @ 标签前缀的文件的文件名。 比如, credstash put myapp.db.prod @secret.txt 通过传递 - 字符作为密钥参数,也可以通过 stdin 传递凭据。 比如, tr -dc '[:alnum:]' </dev/urandom | fold -w 32 | head -n 1 | credstash put myapp.db.prod -

    秘密

    当你想获取凭据时,例如,作为web服务器上的Bootstrap 进程的一部分,只需执行 credstash get [credential-name]。 比如, export DB_PASSWORD=$(credstash get myapp.db.prod) 当你运行 get 时,credstash将从凭证存储( DynamoDB ) 中获取并获取加密凭据和包装的加密密钥。 然后它将把打包的加密密钥发送到 KMS,并使用主密钥对它的进行解密。 然后,credstash使用解密的数据加密密钥解密凭据。 凭据打印到 stdout,因此你可以在脚本中使用它或者将它的分配给 环境变量。

    控制和审核密钥

    可以选择包括任意数量的加密上下文 key-value 对与凭证关联。 请求中必须提供与凭证关联的加密上下文 key-value 对的确切集合,以成功解密凭据。 在CloudTrail日志中,这些加密上下文 key-value 对对于向加密和解密操作提供审核上下文非常有用。 这些方法对于使用KMS关键策略条件和KMS授权条件限制对给定credstash存储凭证的访问也非常有用。 这样做可以确保数据库服务器和web服务器可以读取web服务器的用户名,但是数据库服务器不能读取你的web服务器的tls/ssl private 证书密钥的密码。 带有加密上下文的put 请求看起来像 credstash put myapp.db.prod supersecretpassword1234 app.tier=db environment=prod 为了让你的网络服务器读取相同的凭证,它们将执行 get 调用,如 export DB_PASSWORD=$(credstash get myapp.db.prod environment=prod app.tier=db)

    版本控制

    存储在凭据存储区中的凭据被版本控制且不可更改。 即,如果你使用一个名为 1的凭证和一个 bar 值( put 版本为0 ),那么foo版本 1将始终具有bar值,并且 credstash 中不存在更改它的值的方法。 凭据旋转通过版本传递。 假设你做了 credstash put foo bar ,然后决定以后旋转 foo,你可以通过执行以下操作来将 foo 版本 2 credstash put foo baz -v 当你下次执行 credstash get foo 时,它将返回 baz。 你可以获得特定的凭证版本以及( 使用相同的-v 标志)。 你可以在凭证存储中获取所有凭证的List,并使用 list 命令获取它们的版本。

    如果使用递增整数版本号( 例如 [1, 2, 3,.. .] ),然后你可以使用 -a 标志和 put 命令自动增加版本号。 但是,由于,中的字典排序,credstash 将使用零( 例如,) 留下版本表示, [001, 025, 103,.. .] 除了 19个字符,足以处理 64位 系统上的sys.maxint )。

    在 2015年12月 之前使用Credstash自动版本控制的特殊注释

    在 2015年12月 之前,credstash 自动使用unpadded整数进行。 这导致了一个键命中十个版本后的排序错误。 为了确保对非数字(。例如日期,版本版本,名称,等等 )的支持,保留字典排序行为,但auto版本控制行为更改为左填充整数表示形式。

    如果你已经使用了自动版本管理,那么你应该运行存储库的root 中包含的credstash-migrate-autoversion.py 脚本。 如果你提供自己的版本号,你应该确保你的版本产生你想要的结果。

    依赖项

    credstash使用以下AWS服务:

    • AWS密钥管理服务( KMS ) - 用于主密钥管理和密钥包装
    • AWS身份和访问管理- 用于访问控制
    • Amazon DynamoDB - 用于凭证存储

    设置

    ;dr

    • 在KMS中设置一个名为 credstash的密钥
    • 安装credstash依赖项的python ( 或者只使用 pip )
    • 确保你在 boto/botocore可以读取它们的地方有AWS证书
    • 运行 credstash setup

    设置 KMS

    credstash 当前将不设置你的KMS主密钥。 创建KMS主密钥,

    • 转到AWS控制台
    • 转到IAM控制台/选项卡
    • 在左侧单击"加密密钥"
    • 单击"创建密钥"。对于别名,请将"credstash"。 如果要使用不同的NAME,请确保将它的传递给 credstash,使用 -k 标志
    • 确定你希望能够管理密钥的IAM主体
    • 在"密钥使用权限"屏幕上,选择将使用 credstash ( 以后可以改变你的主意)的rtc用户/角色。
    • 已完成!

    设置 credstash

    最简单的方法是运行 pip install credstash。 这将下载并安装credstash及其依赖项( boto和 PyCypto )。 你还可以通过运行 pip install credstash[YAML] 来安装带有可选的YAML支持的credstash。

    第二个最容易做的事情是在 credstash 目录中做 python setup.py install

    credstash的python 依赖项位于 requirements.txt 文件中。 你可以安装它们 pip install -r requirements.txt

    在所有情况下,你都需要一个用于构建 PyCrypto ( 你可以通过执行 apt-get install gcc 或者 yum install gcc 安装 gcc )的C 编译器。

    你将需要 boto/botocore访问AWS凭证。 最简单的方法是使用IAM角色在一个EC2实例上运行 credstash。 或者,你可以将AWS凭证放入 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量 中。 或者,你可以将它们放入文件( 请参见 http://boto.readthedocs.org/en/latest/boto_config_tut.html )。

    你可以使用 -r 标志或者设置 AWS_DEFAULT_REGION 环境变量来指定 credstash 应该操作的区域。 请注意,命令行 标志优先于环境变量。 如果你既没有设置,那么 credstash 将对us-east-1进行操作。

    证书就绪后,运行 credstash setup。 这将创建凭据存储所需的DDB table。

    使用多个AWS帐户( 配置文件)

    如果需要使用多个AWS帐户,那么在 ~/.aws/credentials 文件中设置多个概要文件是很容易的事情。 比如,

    
    [dev]
    
    
    aws_access_key_id = AKIDEXAMPLEASDFASDF
    
    
    aws_secret_access_key = SKIDEXAMPLE2103429812039423
    
    
    [prod]
    
    
    aws_access_key_id= AKIDEXAMPLEASDFASDF
    
    
    aws_secret_access_key= SKIDEXAMPLE2103429812039423
    
    
    
    

    然后,通过将 AWS_PROFILE 环境变量设置为概要文件的NAME,( 在本例中,开发或者),你可以将credstash指向适当的帐户。

    有关更多信息,请参见 https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs

    用法

    
    usage: credstash [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] {delete,get,getall,list,put,setup}.. .
    
    
    
    A credential/secret storage system
    
    
    
    delete
    
    
     usage: credstash delete [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] credential
    
    
    
     positional arguments:
    
    
     credential the name of the credential to delete
    
    
    
    get
    
    
     usage: credstash get [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-n] [-v VERSION]
    
    
     credential [context [context.. .]]
    
    
    
     positional arguments:
    
    
     credential the name of the credential to get. Using the wildcard
    
    
     character '*' will search for credentials that match
    
    
     the pattern
    
    
     context encryption context key/value pairs associated with the
    
    
     credential in the form of"key=value"
    
    
    
     optional arguments:
    
    
     -n, --noline Don't append newline to returned value (useful in
    
    
     scripts or with binary files)
    
    
     -v VERSION, --version VERSION
    
    
     Get a specific version of the credential (defaults to
    
    
     the latest version)
    
    
    
    getall
    
    
     usage: credstash getall [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-v VERSION] [-f {json,yaml,csv,dotenv}]
    
    
     [context [context.. .]]
    
    
    
     positional arguments:
    
    
     context encryption context key/value pairs associated with the
    
    
     credential in the form of"key=value"
    
    
    
     optional arguments:
    
    
     -v VERSION, --version VERSION
    
    
     Get a specific version of the credential (defaults to
    
    
     the latest version).
    
    
     -f {json,yaml,csv,dotenv}, --format {json,yaml,csv,dotenv}
    
    
     Output format. json(default), yaml, csv or dotenv.
    
    
    
    list
    
    
     usage: credstash list [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN]
    
    
    
    put
    
    
     usage: credstash put [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN] [-k KEY] [-v VERSION]
    
    
     credential value [context [context.. .]]
    
    
    
    positional arguments:
    
    
     credential the name of the credential to store
    
    
     value the value of the credential to store or, if beginning
    
    
     with the"@" character, the filename of the file
    
    
     containing the value, or pass"-" to read the value
    
    
     from stdin
    
    
     context encryption context key/value pairs associated with the
    
    
     credential in the form of"key=value"
    
    
    
     optional arguments:
    
    
     -k KEY, --key KEY the KMS key-id of the master key to use. See the
    
    
     README for more information. Defaults to
    
    
     alias/credstash
    
    
     -v VERSION, --version VERSION
    
    
     Put a specific version of the credential (update the
    
    
     credential; defaults to version `1`).
    
    
     -a, --autoversion Automatically increment the version of the credential
    
    
     to be stored. This option causes the `-v` flag to be
    
    
     ignored. (This option will fail if the currently
    
    
     stored version is not numeric.)
    
    
     -d {SHA,MD5,RIPEMD,SHA384,SHA224,SHA256,SHA512,WHIRLPOOL}, --digest {SHA,MD5,RIPEMD,SHA384,SHA224,SHA256,SHA512,WHIRLPOOL}
    
    
     the hashing algorithm used to to encrypt the data.
    
    
     Defaults to SHA256
    
    
    
    setup
    
    
     usage: credstash setup [-h] [-r REGION] [-t TABLE] [-p PROFILE | -n ARN]
    
    
    
    optional arguments:
    
    
     -r REGION, --region REGION
    
    
     the AWS region in which to operate. If a region is not
    
    
     specified, credstash will use the value of the
    
    
     AWS_DEFAULT_REGION env variable, or if that is not
    
    
     set, the value in `~/.aws/config`. As a last resort,
    
    
     it will use us-east-1
    
    
     -t TABLE, --table TABLE
    
    
     DynamoDB table to use for credential storage
    
    
     -p PROFILE, --profile PROFILE
    
    
     Boto config profile to use when connecting to AWS
    
    
     -n ARN, --arn ARN AWS IAM ARN for AssumeRole
    
    
    
    

    IAM策略

    Secret

    你可以使用KMS密钥授权。KMS密钥策略或者IAM策略来向credstash发送或者写入密钥。 如果正在使用cxf策略,则以下cxf权限是能够放置或者写入秘密的最小值:

    
    {
    
    
    "Version":"2012-10-17",
    
    
    "Statement": [
    
    
     {
    
    
    "Action": [
    
    
    "kms:GenerateDataKey"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"arn:aws:kms:us-east-1:AWSACCOUNTID:key/KEY-GUID"
    
    
     },
    
    
     {
    
    
    "Action": [
    
    
    "dynamodb:PutItem"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"arn:aws:dynamodb:us-east-1:AWSACCOUNTID:table/credential-store"
    
    
     }
    
    
     ]
    
    
    }
    
    
    
    

    在使用 kms:GenerateDataKey 策略时,使用替代 AWSACCOUNTID的帐户ID并替换密钥 guid。如果使用密钥( 在KMS控制台中可以找到)的标识符替换密钥 guid,则不需要使用。

    秘密读取器

    你可以通过使用KMS密钥授权。KMS密钥策略或者IAM策略来从credstash中读取机密信息。 如果正在使用cxf策略,则以下cxf权限是能够获取或者读取密钥所需的最小值:

    
    {
    
    
    "Version":"2012-10-17",
    
    
    "Statement": [
    
    
     {
    
    
    "Action": [
    
    
    "kms:Decrypt"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"arn:aws:kms:us-east-1:AWSACCOUNTID:key/KEY-GUID"
    
    
     },
    
    
     {
    
    
    "Action": [
    
    
    "dynamodb:GetItem",
    
    
    "dynamodb:Query",
    
    
    "dynamodb:Scan"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"arn:aws:dynamodb:us-east-1:AWSACCOUNTID:table/credential-store"
    
    
     }
    
    
     ]
    
    
    }
    
    
    
    

    在使用 kms:Decrypt 策略时,使用替代 AWSACCOUNTID的帐户ID并替换密钥 guid。如果使用密钥( 在KMS控制台中可以找到)的标识符替换密钥 guid,则不需要使用。 注意,如果你不在 get 服务器中使用通配符,则不需要 dynamodb:Scan 权限。

    设置权限

    为了运行 credstash setup,你还需要能够执行以下分布式操作:

    
    {
    
    
    "Version":"2012-10-17",
    
    
    "Statement": [
    
    
     {
    
    
    "Action": [
    
    
    "dynamodb:CreateTable",
    
    
    "dynamodb:DescribeTable"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"arn:aws:dynamodb:us-west-2:<ACCOUNT NUMBER>:table/credential-store"
    
    
     },
    
    
     {
    
    
    "Action": [
    
    
    "dynamodb:ListTables"
    
    
     ],
    
    
    "Effect":"Allow",
    
    
    "Resource":"*"
    
    
     }
    
    
     ]
    
    
    }
    
    
    
    

    安全注意事项

    可以从凭据存储库 table 获取项,并且可以调用 kms。解密的任何IAM主体,都可以读取已经存储的凭据。

    面向 credstash的目标部署故事是运行具有IAM角色的EC2实例,具有读取凭证存储和使用主密钥的权限。 由于rtc角色凭据是实例元数据服务的vended,默认情况下,系统上的任何用户都可以获取证书。 这意味着默认情况下,实例边界是该系统的安全边界。 如果你担心实例中未授权用户,应该采取步骤来保护对实例元数据服务(。例如使用iptables连接到除特权用户之外的)的访问。 另外,由于credstash是用 python 编写的,如果攻击者可以转储credstash进程的内存,那么他们可能能够恢复凭证。 这是一个已经知问题,但在目标部署案例中,假定安全边界是实例边界。

    常见问题( FAQ )

    1.主密钥存储在哪里?

    主密钥存储在AWS密钥管理服务( KMS ) 中,其中存储在安全hsm备份存储中。 主密钥永远不会离开KMS服务。

    2.凭证旋转如何处理?

    商店里的每个凭证都有一个版本号。 每当你想要一个新值的凭据时,必须使用新的凭据版本进行 put。 例如如果数据库中有 foo 版本 1,则更新 foo,则可以将版本 2设置为。 你可以手动指定版本( 例如。 credstash put foo bar -v 2 ),或者你可以使用 -a 标志,该标志将尝试增加版本号( 例如, credstash put foo baz -a )。只要执行 get 操作,credstash将获取该凭据的最新( 最高版本) 版本。 所以,为了做凭证旋转,只需放置一个新版本的凭据,获取凭据的客户端将获得新版本。

    3。运行credstash成本所需的AWS服务有多大?

    如果你今天在分布式数据库上使用 25/,和 25写入,那么 ~$1/month 将使用credstash来使用。

    KMS中的主密钥每月成本 $1.

    凭据存储分布器分布式 table 使用 1位置备读取和 1位写入吞吐量,以及少量实际存储。 这在 below ( 25每秒读取和 25写入)的免费层中很好。 如果你已经是重量分布器用户并超过免费层,凭证存储 table 将成本为 $0.53个月( 大部分来自写吞吐量)。

    如果使用credstash很大,并且需要增加已经配置的读/写,则可能会导致额外的。 你可以使用AWS简单的每月计算器( http://calculator.s3.amazonaws.com/index.html#s=DYNAMODB ) 来估算你的帐单。

    4.凭据存储的DynamoDB? 为什么不 S3?

    DDB非常适合应用程序。 如果credstash处于启动应用程序的关键路径,那么拥有非常低的延迟是非常不错的。 在配置管理工具中,能够根据负载和需求来转换吞吐量和需求也是很好的事情。 同时,随着credstash进入更复杂的凭证管理功能,分布式数据库的查询能力也得到了。

    也就是说,S3支持可能会发生在某一天。

    5我在哪里可以了解关于credstash之类的用例和上下文的更多信息?

    查看这里博客帖子: http://blog.fugue.it/2015-04-21 -aws-kms-secrets.html



    文章标签:MAN  UTIL  UTI    工具  credential  凭证  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语