AWS SDK para .NET
Developer Guide

Configuración de credenciales de AWS

Debe administrar sus credenciales de AWS de forma segura y evitar prácticas que puedan exponerlas al público de manera no intencionada. En este tema, describimos cómo configurar las credenciales de AWS de su aplicación de modo que sigan siendo seguras.

  • No use las credenciales raíz de su cuenta para obtener acceso a sus recursos de AWS. Estas credenciales proporcionan acceso ilimitado a la cuenta y son difíciles de revocar.

  • No ponga claves de acceso literales en su aplicación, incluido el archivo App.config o Web.config del proyecto. Si lo hace, puede crear un riesgo de exposición accidental de sus credenciales si, por ejemplo, carga el proyecto en un repositorio público.

nota

Suponemos que ha creado una cuenta de AWS y tiene acceso a sus credenciales. Si aún no los tiene, consulte Creación de una cuenta y credenciales de AWS.

A continuación, se indican directrices generales para administrar credenciales de forma segura:

  • Cree usuarios de IAM y utilice sus credenciales de usuario de IAM en lugar de su usuario raíz de AWS. Las credenciales de usuario de IAM son más fáciles de revocar si se filtran. Puede aplicar una política a cada usuario IAM que limite al usuario a un conjunto específico de recursos y acciones.

  • Durante el desarrollo de aplicaciones, el enfoque preferido para administrar credenciales es poner un perfil para cada conjunto de credenciales de usuario de IAM en el SDK Store. También puede usar un archivo de credenciales de texto no cifrado para almacenar perfiles con credenciales. A continuación, puede hacer referencia a un perfil específico mediante programación en lugar de almacenar las credenciales en los archivos del proyecto. Para limitar el riesgo de exponer credenciales de manera no intencionada, debe almacenar SDK Store o el archivo de credenciales fuera de los archivos del proyecto.

  • Use Roles de IAM para tareas para las tareas de Amazon Elastic Container Service (Amazon ECS).

  • Use roles de IAM para aplicaciones que se ejecutan en instancias Amazon EC2.

  • Use credenciales temporales o variables de entorno para aplicaciones disponibles para los usuarios que se encuentran fuera de su organización.

En los siguientes temas se describe cómo administrar credenciales para una aplicación AWS SDK for .NET. Para obtener una descripción de cómo administrar de forma segura las credenciales de AWS, consulte Prácticas recomendadas para administrar las claves de acceso de AWS.

Mediante el SDK Store

Durante el desarrollo de su aplicación AWS SDK for .NET, añada un perfil al SDK Store para cada conjunto de credenciales que desee usar en su aplicación. Esto impide la exposición accidental de sus credenciales de AWS. El SDK Store se encuentra en la carpeta C:\Users\<username>\AppData\Local\AWSToolkit en el archivo RegisteredAccounts.json. SDK Store proporciona los siguientes beneficios:

  • SDK Store puede contener varios perfiles de cualquier número de cuentas.

  • Las credenciales del SDK Store se cifran y el SDK Store reside en el directorio de inicio del usuario. Esto limita el riesgo de exposición accidental de sus credenciales.

  • Puede hacer referencia al perfil por nombre en su aplicación y se hace referencia a las credenciales asociadas en tiempo de ejecución. Sus archivos de origen nunca contienen las credenciales.

  • Si incluye un perfil llamado default, el AWS SDK for .NET usa ese perfil. Lo mismo sucede si no proporciona otro nombre de perfil o si no se encuentra el nombre especificado.

  • El SDK Store también proporciona credenciales a Herramientas de AWS para Windows PowerShell y AWS Toolkit for Visual Studio.

nota

Los perfiles de SDK Store son específicos de un usuario determinado de un host concreto. No pueden copiarse en otros hosts ni en otros usuarios. Por este motivo, no puede usar perfiles de SDK Store en aplicaciones de producción. Para obtener más información, consulte Resolución de credenciales y perfiles.

Puede administrar los perfiles en SDK Store de varias maneras.

  • Use la interfaz de usuario gráfica (GUI) en AWS Toolkit for Visual Studio para administrar perfiles. Para obtener más información acerca de cómo añadir credenciales al SDK Store mediante la GUI, consulte Proporcionar credenciales de AWS en AWS Toolkit for Visual Studio.

  • Puede administrar sus perfiles desde la línea de comandos mediante el cmdlet Set-AWSCredentials en Herramientas de AWS para Windows PowerShell. Para obtener más información, consulte Uso de credenciales de AWS.

  • Puede crear y administrar sus perfiles mediante programación con la clase Amazon.Runtime.CredentialManagement.CredentialProfile.

En los siguientes ejemplos se muestra cómo crear un perfil básico y un perfil SAML, y cómo añadirlos al SDK Store mediante el método RegisterProfile.

Crear un perfil y guardarlo en el archivo de credenciales de .NET

Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfileOptions y establezca sus propiedades AccessKey y SecretKey. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfile. Proporcione el nombre del perfil y el objeto CredentialProfileOptions creado. De forma opcional, establezca la propiedad Region para el perfil. Cree una instancia de un objeto NetSDKCredentialsFile y llame al método RegisterProfile para registrar el perfil.

var options = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; var profile = new Amazon.Runtime.CredentialManagement.CredentialProfile("basic_profile", options); profile.Region = RegionEndpoint.USWest1; var netSDKFile = new NetSDKCredentialsFile(); netSDKFile.RegisterProfile(profile);

El método RegisterProfile se usa para registrar un nuevo perfil. Normalmente, su aplicación llama a este método solo una vez para cada perfil.

Crear un SAMLEndpoint y un perfil asociado y guardarlo en el archivo de credenciales de .NET

Cree un objeto Amazon.Runtime.CredentialManagement.SAMLEndpoint. Proporcione el nombre y los parámetros URI del punto de enlace. Cree un objeto Amazon.Runtime.CredentialManagement.SAMLEndpointManager. Llame al método RegisterEndpoint para registrar el punto de enlace. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfileOptions y establezca sus propiedades EndpointName y RoleArn. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfile y proporcione el nombre del perfil y el objeto CredentialProfileOptions creado. De forma opcional, establezca la propiedad Region para el perfil. Cree una instancia de un objeto NetSDKCredentialsFile y llame al método RegisterProfile para registrar el perfil.

var endpoint = new SAMLEndpoint("endpoint1", new Uri("https://some_saml_endpoint"), SAMLAuthenticationType.Kerberos); var endpointManager = new SAMLEndpointManager(); endpointManager.RegisterEndpoint(endpoint); options = new CredentialProfileOptions { EndpointName = "endpoint1", RoleArn = "arn:aws:iam::999999999999:role/some-role" }; profile = new CredentialProfile("federated_profile", options); netSDKFile = new NetSDKCredentialsFile(); netSDKFile.RegisterProfile(profile);

Uso de un archivo de credenciales

También puede almacenar perfiles en un archivo de credenciales compartidas. Los otros AWS SDK, la AWS CLI y Herramientas de AWS para Windows PowerShell pueden usar este archivo. Para reducir el riesgo de exposición accidental de credenciales, almacene el archivo de credenciales fuera de cualquier archivo del proyecto, normalmente de la carpeta de inicio del usuario. Tenga en cuenta que los perfiles de los archivos de credenciales se almacenan en texto no cifrado.

Puede administrar los perfiles del archivo de credenciales compartidas de dos formas:

  • Puede usar un editor de texto. El archivo se llama credentials y la ubicación predeterminada está en la carpeta de inicio del usuario. Por ejemplo, si su nombre de usuario es awsuser, el archivo de credenciales sería C:\users\awsuser\.aws\credentials.

    A continuación se muestra un ejemplo de un perfil en el archivo de credenciales.

    [{profile_name}] aws_access_key_id = {accessKey} aws_secret_access_key = {secretKey}

    Para obtener más información, consulte Prácticas recomendadas para administrar las claves de acceso de AWS.

    nota

    Si incluye un perfil llamado default, el AWS SDK for .NET usa ese perfil de forma predeterminada si no encuentra el perfil especificado.

    Puede almacenar el archivo de credenciales que contiene los perfiles en una ubicación de su elección, como C:\aws_service_credentials\credentials. A continuación, especifique de forma explícita la ruta de archivo en el atributo AWSProfilesLocation del archivo App.config o Web.config de su proyecto. Para obtener más información, consulte Especificación de un perfil.

  • Puede administrar mediante programación el archivo de credenciales con las clases del espacio de nombres Amazon.Runtime.CredentialManagement.

Configuración de un perfil de credenciales alternativo

El AWS SDK for .NET utiliza el perfil predeterminado por defecto pero puede cambiar el perfil a utilizar empleando la variable del entorno de AWS_Profile.

Por ejemplo, en Linux, macOS, or Unix ejecute el siguiente comando para cambiar el perfil a myProfile.

export AWS_PROFILE="myProfile"

En Windows, utilice la siguiente comando.

set AWS_PROFILE="myProfile"

El establecimiento de la variable de entorno AWS_PROFILE afecta a la carga de credenciales de todos los SDK y herramientas de AWS admitidas oficialmente (incluida la CLI de AWS y la CLI de AWS para PowerShell).

nota

La variable de entorno prevalece sobre la propiedad del sistema.

Crear un perfil y guardarlo en el archivo de credenciales compartidas

Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfileOptions y establezca sus propiedades AccessKey y SecretKey. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfile. Proporcione el nombre del perfil y el objeto CredentialProfileOptions creado. De forma opcional, establezca la propiedad Region para el perfil. Cree una instancia de un objeto Amazon.Runtime.CredentialManagement.SharedCredentialsFile y llame al método RegisterProfile para registrar el perfil.

options = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; profile = new CredentialProfile("shared_profile", options); profile.Region = RegionEndpoint.USWest1; var sharedFile = new SharedCredentialsFile(); sharedFile.RegisterProfile(profile);

El método RegisterProfile se usa para registrar un nuevo perfil. Normalmente, su aplicación llamará a este método solo una vez para cada perfil.

Crear un perfil de origen y un perfil "assume role" asociado y guardarlo en el archivo de credenciales

Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfileOptions para el perfil de origen y establezca sus propiedades AccessKey y SecretKey. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfile. Proporcione el nombre del perfil y el objeto CredentialProfileOptions creado. Cree una instancia de un objeto Amazon.Runtime.CredentialManagement.SharedCredentialsFile y llame al método RegisterProfile para registrar el perfil. Cree otro objeto Amazon.Runtime.CredentialManagement.CredentialProfileOptions para el perfil de rol asumido y establezca las propiedades SourceProfile y RoleArn para el perfil. Cree un objeto Amazon.Runtime.CredentialManagement.CredentialProfile para el rol asumido. Proporcione el nombre del perfil y el objeto CredentialProfileOptions creado.

// Create the source profile and save it to the shared credentials file var sourceProfileOptions = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; var sourceProfile = new CredentialProfile("source_profile", sourceProfileOptions); sharedFile = new SharedCredentialsFile(); sharedFile.RegisterProfile(sourceProfile); // Create the assume role profile and save it to the shared credentials file var assumeRoleProfileOptions = new CredentialProfileOptions { SourceProfile = "source_profile", RoleArn = "arn:aws:iam::999999999999:role/some-role" }; var assumeRoleProfile = new CredentialProfile("assume_role_profile", assumeRoleProfileOptions); sharedFile.RegisterProfile(assumeRoleProfile);

Actualizar un perfil existente en el archivo de credenciales compartidas

Cree un objeto Amazon.Runtime.CredentialManagement.SharedCredentialsFile. Establezca las propiedades Region, AccessKey y SecretKey para el perfil. Llame al método TryGetProfile. Si el perfil existe, use una instancia Amazon.Runtime.CredentialManagement.SharedCredentialsFile para llamar al método RegisterProfile para registrar el perfil actualizado.

sharedFile = new SharedCredentialsFile(); CredentialProfile basicProfile; if (sharedFile.TryGetProfile("basicProfile", out basicProfile)) { basicProfile.Region = RegionEndpoint.USEast1; basicProfile.Options.AccessKey = "different_access_key"; basicProfile.Options.SecretKey = "different_secret_key"; sharedFile.RegisterProfile(basicProfile); }

Obtención de acceso a las credenciales y perfiles de una aplicación

Puede encontrar fácilmente las credenciales y los perfiles en el archivo de credenciales de .NET o en el archivo de credenciales compartidas mediante la clase Amazon.Runtime.CredentialManagement.CredentialProfileStoreChain. Este es el modo en que el SDK de .NET busca las credenciales y perfiles. La clase CredentialProfileStoreChain realiza la comprobación automáticamente en ambos archivos de credenciales.

Puede obtener credenciales o perfiles mediante los métodos TryGetAWSCredentials o TryGetProfile. La propiedad ProfilesLocation determina el comportamiento de CredentialsProfileChain, como se indica a continuación:

  1. Si ProfilesLocation no es nulo y no está vacío, busque el archivo de credenciales compartidas en la ruta de disco de la propiedad ProfilesLocation.

  2. Si ProfilesLocation es nulo o está vacío y la plataforma admite el archivo de credenciales de .NET, busque el archivo de credenciales de .NET. Si no se encuentra el perfil, busque el archivo de credenciales compartidas en la ubicación predeterminada.

  3. Si ProfilesLocation es nulo o está vacío y la plataforma no admite el archivo de credenciales de .NET, busque el archivo de credenciales compartidas en la ubicación predeterminada.

Obtenga credenciales en el archivo de credenciales del SDK o el archivo de credenciales compartidas de la ubicación predeterminada.

Cree un objeto CredentialProfileStoreChain y un objeto Amazon.Runtime.AWSCredentials. Llame al método TryGetAWSCredentials. Proporcione el nombre de perfil y el objeto AWSCredentials en el que se van a devolver las credenciales.

var chain = new CredentialProfileStoreChain(); AWSCredentials awsCredentials; if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)) { // use awsCredentials }

Obtener un perfil en el archivo de credenciales del SDK o el archivo de credenciales compartidas de la ubicación predeterminada

Cree un objeto CredentialProfileStoreChain y un objeto Amazon.Runtime.CredentialManagement.CredentialProfile. Llame al método TryGetProfile y proporcione el nombre de perfil y el objeto CredentialProfile en el que se van a devolver las credenciales.

var chain = new CredentialProfileStoreChain(); CredentialProfile basicProfile; if (chain.TryGetProfile("basic_profile", out basicProfile)) { // Use basicProfile }

Obtener AWSCredentials en un archivo en el formato de archivo de credenciales compartidas en una ubicación del archivo

Cree un objeto CredentialProfileStoreChain y proporcione la ruta al archivo de credenciales. Cree un objeto AWSCredentials. Llame al método TryGetAWSCredentials. Proporcione el nombre de perfil y el objeto AWSCredentials en el que se van a devolver las credenciales.

var chain = new CredentialProfileStoreChain("c:\\Users\\sdkuser\\customCredentialsFile.ini"); AWSCredentials awsCredentials; if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)) { // Use awsCredentials }

Cómo crear una clase AmazonS3Client Using the SharedCredentialsFile

Puede crear un objeto AmazonS3Client que use las credenciales para un perfil específico mediante la clase Amazon.Runtime.CredentialManagement.SharedCredentialsFile. El AWS SDK for .NET carga las credenciales incluidas en el perfil automáticamente. Podría hacer esto si desea usar un perfil específico para un cliente determinado distinto del profile especificado en App.Config.

CredentialProfile basicProfile; AWSCredentials awsCredentials; var sharedFile = new SharedCredentialsFile(); if (sharedFile.TryGetProfile("basic_profile", out basicProfile) && AWSCredentialsFactory.TryGetAWSCredentials(basicProfile, sharedFile, out awsCredentials)) { using (var client = new AmazonS3Client(awsCredentials, basicProfile.Region)) { var response = client.ListBuckets(); } }

Si desea usar el perfil predeterminado y que el AWS SDK for .NET utilice automáticamente sus credenciales predeterminadas para crear el objeto de cliente, use el siguiente código.

using (var client = new AmazonS3Client(RegionEndpoint.US-West2)) { var response = client.ListBuckets(); }

Credential and Profile Resolution

El AWS SDK for .NET busca credenciales en el siguiente orden y usa el primer conjunto disponible para la aplicación actual.

  1. La configuración de cliente, o bien aquello explícitamente establecido en el cliente de servicio de AWS.

  2. BasicAWSCredentials que se crean a partir de los valores AWSAccessKey y AWSSecretKey AppConfig, si están disponibles.

  3. Un perfil de credenciales con el nombre especificado por un valor en AWSConfigs.AWSProfileName (establecido explícitamente o en AppConfig).

  4. El perfil de credenciales default.

  5. SessionAWSCredentials que se crean a partir de las variables de entorno AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY y AWS_SESSION_TOKEN, si no están todas vacías.

  6. BasicAWSCredentials que se crean a partir de las variables de entorno AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY, si no están ambas vacías.

  7. Roles de IAM para tareas de Amazon EC2 Container Service (Amazon ECS).

  8. Metadatos de la instancia EC2.

Los perfiles de SDK Store son específicos de un usuario determinado de un host concreto. No puede copiarlos en otros hosts ni en otros usuarios. Por este motivo, no puede volver a usar los perfiles de SDK Store que se encuentran en su equipo de desarrollo de otros hosts o equipos de desarrollador. Si su aplicación se ejecuta en una instancia Amazon EC2, como un entorno de producción, utilice un rol de IAM tal como se describe en Uso de roles de IAM para instancias EC2 con el AWS SDK para .NET. De lo contrario, almacene sus credenciales en un archivo de credenciales al que su aplicación web tenga acceso en el servidor.

Resolución del perfil

Con dos tipos de archivo de credenciales diferentes, es importante entender cómo configurar el AWS SDK for .NET y Herramientas de AWS para Windows PowerShell para usarlos. AWSConfigs.AWSProfilesLocation (establecido explícitamente o en AppConfig) controla cómo el AWS SDK for .NET encuentra perfiles de credenciales. El argumento de línea de comando -ProfileLocation controla cómo Herramientas de AWS para Windows PowerShell encuentra un perfil. A continuación se indica cómo funciona la configuración en ambos casos.

Valor de ubicación del perfil Comportamiento de resolución del perfil

null (no establecido) o vacío

En primer lugar, busque en el archivo de credenciales de .NET un perfil con el nombre especificado. Si no está ahí, busque en %HOME%\.aws\credentials. Si no está ahí, busque en %HOME%\.aws\config.

La ruta a un archivo en el formato del archivo de credenciales compartidas

Busque solo en el archivo especificado el perfil con el nombre indicado.

Especificación de un perfil

Los perfiles son la mejor forma de usar credenciales en una aplicación AWS SDK for .NET. No tiene que especificar dónde se almacena el perfil. Solo tiene que hacer referencia al perfil por nombre. El AWS SDK for .NET recupera las credenciales correspondientes, como se describe en la sección anterior.

La mejor forma de especificar un perfil es definir un valor AWSProfileName en la sección appSettings del archivo App.config o Web.config de su aplicación. Las credenciales asociadas se incorporan a la aplicación durante el proceso de compilación.

En el siguiente ejemplo se especifica un perfil llamado development.

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> </appSettings> </configuration>

Este ejemplo supone que el perfil existe en SDK Store o en un archivo de credenciales de la ubicación predeterminada.

Si sus perfiles se almacenan en un archivo de credenciales de otra ubicación, especifique la ubicación añadiendo un AWSProfilesLocation valor de atributo en el elemento <appSettings>. En el siguiente ejemplo se especifica C:\aws_service_credentials\credentials como archivo de credenciales.

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> <add key="AWSProfilesLocation" value="C:\aws_service_credentials\credentials"/> </appSettings> </configuration>

La forma alternativa descartada de especificar un perfil se muestra a continuación para ofrecer una descripción completa, pero no lo recomendamos.

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/> </configuration> <configuration> <configSections> <section name="aws" type="Amazon.AWSSection,AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/> </configuration>

Uso de credenciales de la cuenta de usuario federado

Las aplicaciones que usan el AWS SDK for .NET (AWSSDK.Core versión 3.1.6.0 y posterior) pueden usar cuentas de usuario federado a través de Servicios de federación de Active Directory (AD FS) para obtener acceso a servicios web de AWS mediante el Security Assertion Markup Language (SAML, Lenguaje de marcado para confirmaciones de seguridad).

La compatibilidad del acceso federado significa que los usuarios pueden autenticarse mediante su Active Directory. Las credenciales temporales se conceden al usuario automáticamente. Estas credenciales temporales, que son válidas durante una hora, se usan cuando su aplicación invoca servicios web de AWS. El SDK gestiona la administración de las credenciales temporales. Para las cuentas de usuario unidas a un dominio, si su aplicación realiza una llamada, pero las credenciales han caducado, el usuario vuelve a autenticarse automáticamente y se conceden credenciales actualizadas (para las cuentas que no unidas a un dominio, se le pide al usuario que escriba las credenciales antes de la segunda autenticación).

Para usar este soporte en su aplicación de .NET, primero debe configurar el perfil de rol mediante un cmdlet de PowerShell. Para obtener información acerca de cómo hacerlo, consulte la documentación de las Herramientas de AWS para Windows PowerShell.

Después de configurar el perfil de rol, haga referencia al perfil del archivo app.config/web.config de su aplicación con la clave AWSProfileName de la misma forma que haría con otros perfiles de credenciales.

El ensamblado de SDK Security Token Service (AWSSDK.SecurityToken.dll), que se carga en tiempo de ejecución, proporciona la compatibilidad con SAML para obtener las credenciales de AWS. Asegúrese de que este ensamblado está disponible para su aplicación en tiempo de ejecución.

Especificación de roles o credenciales temporales

En el caso de las aplicaciones que se ejecutan en instancias Amazon EC2, el modo más seguro de administrar las credenciales es usar roles de IAM, como se describe en la sección sobre el uso de roles de IAM para instancias EC2 con el AWS SDK para .NET.

Para los escenarios de aplicación en los que el software ejecutable está disponible para los usuarios externos a su organización, recomendamos que diseñe el software para usar credenciales de seguridad temporales. Además de proporcionar acceso restringido a los recursos de AWS, estas credenciales tienen la ventaja de caducar después de un período de tiempo especificado. Para obtener más información sobre cómo usar credenciales de seguridad temporales, consulte lo siguiente:

Aunque el título del segundo artículo hace referencia de forma específica a las aplicaciones móviles, el artículo contiene información que es útil para cualquier aplicación de AWS implementada fuera de su organización.

Uso de credenciales de proxy

Si su software se comunica con AWS a través de un proxy, puede especificar las credenciales para el proxy mediante la propiedad ProxyCredentials en la clase AmazonS3Config para el servicio. Por ejemplo, para Amazon S3 podría usar código similar al siguiente, donde {my-username} y {my-password} son el nombre de usuario y la contraseña del proxy especificados en un objeto NetworkCredential.

AmazonS3Config config = new AmazonS3Config(); config.ProxyCredentials = new NetworkCredential("my-username", "my-password");

Las versiones anteriores del SDK usaban ProxyUsername y ProxyPassword, pero estas propiedades están obsoletas.