Um cofre flexível baseado em PHP para fornecer segredos dinamicamente
Este projeto está licenciado no GNU LGPL 3.0.
composer install technicalguru/vaultVocê pode baixar os pacotes de código -fonte da página de lançamento do GitHub
O procedimento é melhor descrito no blog Hashicorp. Ele descreve como criar um approle . Aqui está a essência disso:
# Enable the auth method for approle
vault auth enable approle
# Create a renewal policy
echo ' path "auth/token/*" { capabilities = [ "create", "read", "update", "delete", "list", "sudo" ] } ' > renewal-policy.hcl
vault policy write renewal-policy renewal-policy.hcl
# Create a file with your policy on the respective secret path:
cat ' path "secret/my-secret" { capabilities = ["read", "list"] } ' > app-policy.hcl
# Create the policy
vault policy write my-app-policy app-policy.hcl
# Create the approle with renewal-policy and your application policy
vault write auth/approle/role/my-approle token_policies=renewal-policy,my-app-policy token_period=30m token_ttl=30m token_max_ttl=1h token_explicit_max_ttl=2h
# Get the role ID printed
vault read auth/approle/role/my-approle/role-id
# Create the secret ID and print it
vault write -f auth/approle/role/my-approle/secret-idObserve que você precisa recriar o ID secreto sempre que alterar a função de aplicativo ou uma política.
Observe que este cofre é realmente um cliente para um hashicorp existente.
// Create configuration
$ config = array (
' type ' => ' hashicorp ' ,
' config ' => array (
' uri ' => ' https://127.0.0.1:8200/v1 ' ,
' roleId ' => ' 123456-12345-12345-123456 ' ,
' secretId ' => ' abcdef-abcde-abcde-abcdef '
)
);
// Create the vault instance
try {
$ vault = TgVault VaultFactory:: create ( $ config );
} catch ( TgVault VaultException $ e ) {
// Vault could not be created
} // Create configuration
$ config = array (
' type ' => ' memory ' ,
' config ' => array (
' secrets ' => array (
' my/secret/number/1 ' => array (
' username ' => ' my-username1 ' ,
' password ' => ' my-password1 ' ,
),
' my/secret/number/2 ' => array (
' username ' => ' my-username2 ' ,
' password ' => ' my-password2 ' ,
),
)
)
);
// Create the vault instance
try {
$ vault = TgVault VaultFactory:: create ( $ config );
} catch ( TgVault VaultException $ e ) {
// Vault could not be created
} // Create configuration
$ config = array (
' type ' => ' file ' ,
' config ' => array (
' filename ' => ' path-to-json-secret-file '
)
);
// Create the vault instance
try {
$ vault = TgVault VaultFactory:: create ( $ config );
} catch ( TgVault VaultException $ e ) {
// Vault could not be created
}O arquivo de segredos (JSON) será assim:
{
"secrets" : {
"my/secret/number/1" : {
"username" : " my-username1 " ,
"password" : " my-password1 "
},
"my/secret/number/2" : {
"username" : " my-username2 " ,
"password" : " my-password2 "
}
}
} try {
$ mySecret1 = $ vault -> getSecret ( ' my/secret/number/1 ' );
$ mySecret2 = $ vault -> getSecret ( ' my/secret/number/2 ' );
} catch ( TgVault VaultException $ e ) {
// secret was not found
}
$ username1 = $ mySecret1 -> get ( ' username ' );
$ password1 = $ mySecret1 -> get ( ' password ' );
$ username2 = $ mySecret2 -> get ( ' username ' );
$ password2 = $ mySecret2 -> get ( ' password ' ); Um valor em um segredo é NULL quando a chave não existe, enquanto uma exceção será lançada quando o próprio segredo não puder ser encontrado ou ocorreu um erro durante a recuperação.
Você pode usar as classes SecretProvider ou CredentialsProvider Helper para aprovar as credenciais sem saber de onde elas vêm ou como usar um cofre.
$ callback1 = new TgVault SecretProvider ( $ vault , ' my/secret/number/1 ' );
$ callback2 = new TgVault CredentialsProvider ( $ vault , ' my/secret/number/2 ' );
try {
$ username1 = $ callback1 -> get ( ' username ' );
$ password1 = $ callback1 -> get ( ' password ' );
$ username2 = $ callback2 -> getUsername ();
$ password2 = $ callback2 -> getPassword ();
} catch ( TgVault VaultException $ e ) {
// Secret cannot be retrieved or does not exist
} O CredentialsProvider recebe argumentos de construtor adicionais que definem, que as chaves no segredo fornecem nome de usuário e senha. Os padrões são os dados acima para o SecretProvider .
Relate um bug, solicite uma solicitação de aprimoramento ou puxão no rastreador de problemas do GitHub.