¿Cómo puedo usar roles de IAM para restringir a la consola de administración de AWS las llamadas a la API desde direcciones IP concretas?

4 minutos de lectura
0

Quiero usar roles de AWS Identity and Access Management (IAM) para limitar a la consola de administración de AWS el acceso a llamadas a la API.

Descripción corta

Utiliza la clave de condición global aws:SourceIp en el elemento de condición de una política de IAM para restringir las llamadas a la API desde direcciones IP concretas. Sin embargo, así se deniega el acceso a servicios de AWS que realizan llamadas en tu nombre, como AWS CloudFormation, a menos que utilices también la condición global aws:ViaAWSService. Para obtener más información, consulta AWS: deniega acceso a AWS en función de la dirección IP de origen.

Por ejemplo, supongamos que tienes un rol de servicio de AWS que permite que AWS CloudFormation llame a Amazon Elastic Compute Cloud (Amazon EC2) con el fin de detener una instancia. La solicitud se deniega porque el servicio de destino (Amazon EC2) ve la dirección IP del servicio que llama (AWS CloudFormation) en lugar del usuario de origen. No puedes pasar la dirección IP de origen a través de un servicio de llamadas al servicio de destino para su evaluación en una política de IAM.

Solución

Crea un rol de IAM con el mismo conjunto de permisos asociados que la política de IAM asociada al usuario de IAM. Así se concede permisos al usuario de IAM para asumir la API de rol sts:AssumeRole solo si la solicitud proviene de la dirección IP especificada. Esto se debe a la comprobación de la restricción aws:SourceIp, que se lleva a cabo cuando el usuario intenta asumir el rol. Cuando el usuario asume el rol de IAM, adquiere los permisos de la política de IAM asociada. Dado que la política de IAM asociada al rol no utiliza la clave de condición aws:SourceIp, se permite el acceso a servicios de AWS.

Crea la siguiente política de IAM y luego asocia esta política a un usuario de IAM con acceso programático. Esta política de IAM permite al usuario de IAM asumir el rol (AssumeRole) denominado Bob. Bob no necesita permisos adicionales. Todos los demás permisos necesarios se adquieren cuando el usuario de IAM asume satisfactoriamente el rol Bob.

Nota:

Ejemplo de política de usuario de IAM

Esta política de ejemplo tiene permisos para realizar llamadas a la API en los recursos de la cuenta.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::EXAMPLEIAMACCOUNTID:role/Bob"
  }
}

Crea el rol de IAM Bob para delegar los permisos al usuario de IAM. Sigue las instrucciones de Creación de un rol de IAM (consola). También puedes utilizar la API de AWS o AWS CLI.

Nota:

  • Si utilizas la consola para crear el rol, modifica la política de confianza del rol como en el ejemplo de la política de confianza Bob. Si utilizas el comando create-role de AWS CLI o CreateRole de la API, puedes transferir la política de la relación de confianza como valor en el parámetro update-assume-role-policy del documento.
  • La solicitud debe venir del intervalo de direcciones IP especificado: 103.15.250.0/24 o 12.148.72.0/23. De lo contrario, el usuario de IAM no podrá asumir el rol ni realizar llamadas a la API.

Ejemplo de política de confianza para roles de IAM

Este ejemplo de política de confianza permite que el usuario asuma el rol si la solicitud viene del intervalo de direcciones IP 103.15.250.0/24 o 12.148.72.0/23.

Nota: Sustituye YOURIAMUSERNAME por el nombre de tu usuario de IAM.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/YOURIAMUSERNAME"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "103.15.250.0/24",
            "12.148.72.0/23"
          ]
        }
      }
    }
  ]
}

Nota: Esta solución alternativa interrumpe los registros de AWS CloudTrail porque las acciones las realiza el rol de IAM que asumió el usuario, no el usuario de IAM. La llamada a la API assumeRole realizada por el usuario de IAM se guarda en registros de CloudTrail en el usuario de IAM. Todas las llamadas a la API adicionales que realice el rol de IAM se guardarán en registros de CloudTrail con el nombre del rol.

Información relacionada

AWS global condition context keys