¿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 restringir a direcciones IP concretas el acceso a llamadas a la API de AWS. ¿Cómo puedo 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?

Breve descripción

Puede utilizar 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 su nombre, como AWS CloudFormation, a menos que utilice también la condición global aws:ViaAWSService. Para obtener más información, consulte AWS: deniega acceso a AWS en función de la dirección IP de origen.

Por ejemplo, supongamos que tiene 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 puede 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

Cree 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.

Cree la siguiente política de IAM y luego asocie 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"
  }
}

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

Nota:

  • Si utiliza la consola para crear el rol, modifique la política de confianza del rol como en el ejemplo de la política de confianza Bob. Si utiliza el comando create-role de AWS CLI o CreateRole de la API, puede 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: Sustituya YOURIAMUSERNAME por el nombre de su 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