Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Qué
La política AccessControl te permite permitir o denegar el acceso a tus APIs por direcciones IP específicas.
Esta política es una política estándar y se puede implementar en cualquier tipo de entorno. Para obtener información sobre los tipos de políticas y la disponibilidad de cada tipo de entorno, consulta Tipos de políticas.
Vídeo: consulta un breve vídeo para obtener más información sobre cómo permitir o denegar el acceso a tus APIs por direcciones IP específicas.
Aunque puedes asociar esta política en cualquier parte del flujo del proxy de API, lo más probable es que quieras comprobar las direcciones IP al principio del flujo ( Request/ProxyEndpoint/PreFlow), incluso antes de la autenticación o de la comprobación de cuotas.
También deberías usar Google Cloud Armor con Apigee como alternativa para proteger tus APIs.
Ejemplos
Los valores de máscara de los siguientes ejemplos de IPv4 identifican cuál de los cuatro octetos (8, 16, 24 y 32 bits) tiene en cuenta la regla de coincidencia al permitir o denegar el acceso. El valor predeterminado es 32. Consulta el atributo mask
en la referencia de Element para obtener más información.
Denegar 198.51.100.1
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Denegar todas las solicitudes de la dirección de cliente 198.51.100.1
Permite solicitudes de cualquier otra dirección de cliente.
Denegar el uso de variables
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="{kvm.mask.value}">{kvm.ip.value}</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Supongamos que usas un mapa de clave-valor (KVM) para almacenar valores de enmascaramiento e IPs.
Se trata de un método práctico para cambiar las IPs y enmascararlas durante el tiempo de ejecución sin tener que actualizar ni volver a implementar el proxy de API. Puede usar la política KeyValueMapOperations para recuperar las variables que contienen los valores de kvm.mask.value
y kvm.ip.value
(siempre que haya asignado esos nombres a las variables de su política de KVM que contienen los valores de la máscara y la IP de su KVM).
Si los valores que has obtenido son 24
para la máscara y 198.51.100.1
para la dirección IP, la política AccessControl denegaría todas las solicitudes de 198.51.100.*
Se permitirían todas las demás direcciones de cliente.
Denegar 198.51.100.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Deniega todas las solicitudes de la dirección de cliente 198.51.100.*
Permite solicitudes de cualquier otra dirección de cliente.
198.51.*.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="16">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Denegar todas las solicitudes de la dirección del cliente: 198.51.*.*
Permite solicitudes de cualquier otra dirección de cliente.
Denegar 198.51.100.* y permitir 192.0.2.1
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">192.0.2.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Deniega todas las solicitudes de la dirección del cliente 198.51.100.*, pero permite 192.0.2.1.
Permite solicitudes de cualquier otra dirección de cliente.
Allow 198.51.*.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "ALLOW"> <SourceAddress mask="16">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Permitir todas las solicitudes de la dirección 198.51.*.*
Deniega las solicitudes de cualquier otra dirección de cliente.
Permitir varias IPs
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "ALLOW"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Permitir solicitudes de direcciones de cliente: 198.51.100.* 192.0.2.* 203.0.113.*
Deniega todas las demás direcciones.
Denegar varias IPs
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Denegar solicitudes de las direcciones de cliente: 198.51.100.* 192.0.2.* 203.0.113.*
Permitir todas las demás direcciones.
Permitir varias IPs o denegar varias IPs
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> <MatchRule action = "ALLOW"> <SourceAddress mask="16">198.51.100.1</SourceAddress> <SourceAddress mask="16">192.0.2.1</SourceAddress> <SourceAddress mask="16">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Allow: 198.51.*.* 192.0.*.* 203.0.*.*
Denegar un subconjunto de la lista de permitidos: 198.51.100.* 192.0.2.* 203.0.113.*
Notas de uso
Además de proteger tus APIs frente a IPs maliciosas, la política AccessControl también te permite controlar el acceso de IPs legítimas. Por ejemplo, si solo quieres que los ordenadores que estén bajo el control de tu empresa accedan a las APIs expuestas en tu entorno de prueba, puedes permitir el intervalo de direcciones IP de tu red interna. Los desarrolladores que trabajen desde casa pueden acceder a estas APIs mediante una VPN.
La configuración y la ejecución de una política AccessControl implican lo siguiente:
- Define un conjunto de reglas de coincidencia con una de las dos acciones (PERMITIR o DENEGAR) asociada a cada una.
- En cada regla de coincidencia, especifique la dirección IP (elemento SourceAddress).
- Consulta Cómo elige la política qué dirección IP evaluar para determinar qué direcciones IP del mensaje quieres configurar para que se gestionen con reglas.
- Configura una máscara para cada dirección IP. Permites o deniegas el acceso en función de un valor de máscara en la dirección IP. Consulta Información sobre el enmascaramiento de IPs con la notación CIDR.
- Especifique el orden en el que se prueban las reglas.
- Todas las reglas de coincidencia se ejecutan en el orden indicado. Cuando se encuentra una coincidencia con una regla, se ejecuta la acción correspondiente y se omiten las reglas de coincidencia posteriores.
- Si se configura la misma regla con las acciones PERMITIR y DENEGAR, se activará la regla que se haya definido primero en el orden y se omitirá la regla posterior (con la otra acción).
Cómo elige la política qué dirección IP evaluar
Las direcciones IP pueden proceder de varias fuentes en una solicitud. Por ejemplo, el encabezado X-Forwarded-For
puede contener una o varias direcciones IP. En esta sección se describe cómo configurar la política AccessControl para que evalúe las direcciones IP exactas que quieras.
A continuación, se muestra la lógica que usa la política AccessControl para decidir qué dirección IP evaluar:
Encabezado X-Forwarded-For
Apigee rellena automáticamente el encabezado X-Forwarded-For
con la dirección IP que ha recibido del último handshake TCP externo (como la IP del cliente o del router). Si hay varias direcciones IP en el encabezado, es probable que se trate de la cadena de servidores que han procesado una solicitud. Sin embargo, la lista de direcciones también podría contener una dirección IP falsificada. Entonces, ¿cómo sabe la política qué direcciones debe evaluar?
Dimensiones X-Forwarded-For en las analíticas de Apigee
Apigee Analytics escribe el valor del encabezado X-Forwarded-For
en la dimensión x_forwarded_for_ip
. Para determinar la IP del cliente que ha hecho la solicitud a Apigee, utilice los valores de la dimensión ax_resolved_client_ip
, pero excluya ax_true_client_ip
, que no se admite con la política AccessControl. Consulte la referencia de las métricas, dimensiones y filtros de analíticas.
Información sobre el enmascaramiento de IPs con notación CIDR
La notación CIDR (enrutamiento de interdominios sin clases) es una forma de indicar un intervalo de direcciones IP mediante el enmascaramiento. Se aplica tanto a IPv4 como a IPv6. Veamos cómo funciona. Usaremos IPv4 en nuestros ejemplos para simplificar.
Las direcciones IP son grupos de números separados por puntos. En términos binarios, cada grupo es un número específico de bits (8 en IPv4 y 16 en IPv6). La dirección IPv4 198.51.100.1 tiene este aspecto en formato binario:
11000110.00110011.01100100.00000001
Es decir, 4 grupos de 8 bits, lo que da un total de 32 bits. Con CIDR, puedes indicar un intervalo añadiendo un número (del 1 al 32) a la dirección IP, como en este ejemplo:
198.51.100.1/24
En este caso, el 24 es el número que usarías para el valor del atributo mask
de esta política.
Esta notación significa: "Mantén los primeros 24 bits exactamente como están; los bits restantes pueden ser cualquier valor entre 0 y 255". Por ejemplo:
Mantenerlos exactamente como están | Valores posibles del último grupo |
---|---|
198.51.100. | 0 - 255 |
Observa que la máscara se aplica al final del grupo 3. De esta forma, todo estará ordenado y se creará una máscara como esta: 198.51.100.*. En la mayoría de los casos, si usas múltiplos de 8 (IPv4) y 16 (IPv6), obtendrás el nivel de enmascaramiento que quieras:
IPv4: 8, 16, 24 y 32
IPv6: 16, 32, 48, 64, 80, 96, 112 y 128
Sin embargo, puedes usar otros números para tener un control más preciso, lo que implica un pequeño cálculo binario. A continuación, se muestra un ejemplo en el que se usa una máscara de 30, como en 198.51.100.1/30, donde el último 1 es 00000001 en binario:
Mantenerlos exactamente como están | Posibles valores |
---|---|
11000110.00110011.01100100.000000 (los primeros 30 bits) | 00000000, 00000001, 00000010 o 00000011 |
198.51.100. | 0, 1, 2 o 3 |
En este ejemplo, si la configuración es <SourceAddress
mask="30">198.51.100.1</SourceAddress>
, se permitirían (o denegarían, según tus reglas) las siguientes IPs:
- 198.51.100.0
- 198.51.100.1
- 198.51.100.2
- 198.51.100.3
Referencia de elemento
En la referencia de elementos se describen los elementos y atributos de la política AccessControl.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> <DisplayName>Access Control 1</DisplayName> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn> </AccessControl>
Atributos <AccessControl>
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
Elemento <ClientIPVariable>
Especifica una variable de flujo que contiene una dirección IP con la que la política compara las IPRules. Si la variable de flujo no contiene una dirección IP válida (ipv4 o ipv6), la política genera un error.
Supongamos que la variable de flujo se ha definido como 12.31.34.52
. En el siguiente ejemplo,
se deniega el acceso. Si la variable tiene el valor 10.11.12.13
, se concede el acceso.
<AccessControl name='ACL'> <ClientIPVariable>FLOW_VARIABLE</ClientIPVariable> <IPRules noRuleMatchAction = 'DENY'> <MatchRule action = 'ALLOW'> <SourceAddress mask='32'>10.11.12.13</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Predeterminado | N/A |
---|---|
Presencia | Opcional |
Tipo | Variable de flujo |
Elemento <IgnoreTrueClientIPHeader>
Elemento <IPRules>
Elemento superior que contiene las reglas que permiten o deniegan direcciones IP. El atributo noRuleMatchAction
te permite definir cómo gestionar las direcciones IP que no se incluyan en tus reglas de coincidencias.
<IPRules noRuleMatchAction = "ALLOW">
Predeterminado | N/A |
---|---|
Presencia | Opcional |
Tipo | N/A |
Atributos
Atributo | Descripción | Tipo | Predeterminado | Presencia |
---|---|---|---|---|
noRuleMatchAction |
La acción que se debe realizar (permitir o denegar el acceso) si no se resuelve la regla de coincidencia especificada (no hay coincidencia).
Valores válidos: ALLOW o DENY
|
Cadena | PERMITIR | Obligatorio |
Elemento <IPRules>/<MatchRule>
La acción que se debe llevar a cabo (permitir o denegar el acceso) si la dirección IP coincide con las SourceAddress(es) que definas.
<IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules>
Predeterminado | N/A |
---|---|
Presencia | Opcional |
Tipo | N/A |
Atributos
Atributo | Descripción | Tipo | Predeterminado | Presencia |
---|---|---|---|---|
acción |
La acción que se debe realizar (permitir o denegar el acceso) si no se resuelve la regla de coincidencia especificada (no hay coincidencia). Valores válidos: ALLOW o DENY |
Cadena | PERMITIR | Obligatorio |
Elemento <IPRules>/<MatchRule>/<SourceAddress>
El intervalo de direcciones IP de un cliente.
Valor válido: dirección IP válida (notación decimal con puntos). Para usar el carácter comodín, utilice el atributo mask
.
<IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="{variable}">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">{variable}</SourceAddress> </MatchRule> </IPRules>
Como se muestra en el ejemplo anterior, el elemento SourceAddress
también admite plantillas de mensajes para el atributo mask
o la dirección IP, lo que significa que puede definir los valores mediante variables que estén disponibles en el flujo del proxy de API.
Por ejemplo, puede almacenar una dirección IP en un mapa de pares clave-valor (KVM) y usar la política KeyValueMapOperations para recuperar la dirección IP y asignarla a una variable (como kvm.ip.value
). Después, puede usar esa variable para la dirección IP:
<SourceAddress mask="24">{kvm.ip.value}</SourceAddress>
Si define una máscara o una dirección IP con una variable, podrá cambiar los valores en tiempo de ejecución sin tener que modificar y volver a implementar su proxy de API.
Predeterminado | N/A |
---|---|
Presencia | Opcional |
Tipo | Cadena (solo una dirección IP) |
Atributos
Atributo | Descripción | Tipo | Predeterminado | Presencia |
---|---|---|---|---|
enmascarar |
El atributo
es equivalente a la siguiente notación CIDR: 198.51.100.1/24 Valores válidos: IPv4: 1-32 IPv6: 1-128 El valor cero (0) solo es válido para la IP 0.0.0.0, por lo que no es práctico. Definir la máscara con una variable El atributo
|
Entero | N/A | Obligatorio |
Elemento <ValidateBasedOn>
Cuando el encabezado HTTP X-Forwarded-For
contiene varias direcciones IP, usa este elemento ValidateBasedOn
para controlar qué direcciones IP se evalúan.
Utiliza este método para evaluar direcciones IP solo si tienes la certeza de que las direcciones IP que quieres evaluar son válidas. Por ejemplo, si decide evaluar todas las direcciones IP de la encabezado X-Forwarded-For
, debe poder confiar en la validez de esas direcciones o configurar reglas completas de DENEGAR o PERMITIR para que solo las IPs de confianza puedan llamar a su proxy de API.
La dirección IP situada más a la izquierda del encabezado pertenece al cliente, y la situada más a la derecha es el servidor que ha reenviado la solicitud al servicio actual. La dirección IP situada más a la derecha o la última es la que Apigee ha recibido del último handshake TCP externo.
El valor que introduzcas en este elemento te permite determinar si quieres comprobar todas las direcciones IP del encabezado (opción predeterminada), solo la primera o solo la última.
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> <DisplayName>Access Control 1</DisplayName> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> </IPRules> <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn> </AccessControl>
Predeterminado | X_FORWARDED_FOR_ALL_IP |
---|---|
Presencia | Opcional |
Valores válidos |
|
Esquemas
Cada tipo de política se define mediante un esquema XML (.xsd). A modo de referencia, los esquemas de políticas están disponibles en GitHub.
Referencia de errores
En esta sección se describen los códigos de error y los mensajes de error que devuelve Apigee, así como las variables de error que define, cuando esta política activa un error. Es importante que conozcas esta información si vas a desarrollar reglas de errores para gestionarlos. Para obtener más información, consulta Qué debes saber sobre los errores de políticas y Cómo gestionar los fallos.
Errores de tiempo de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de fallo | Estado de HTTP | Causa | Solucionar |
---|---|---|---|
accesscontrol.IPDeniedAccess |
403 |
La dirección IP del cliente o una dirección IP transmitida en la solicitud de la API coincide con una dirección IP especificada en el elemento <SourceAddress> del elemento <MatchRule> de la política de control de acceso, y el atributo action del elemento <MatchRule> tiene el valor DENY . |
build |
accesscontrol.InvalidIPAddressInVariable |
500 |
La variable de flujo de <ClientIPVariable> contiene una dirección IP no válida. |
Variables de error
Estas variables se definen cuando se produce un error de tiempo de ejecución. Para obtener más información, consulta Variables específicas de errores de políticas.
Variables | Dónde | Ejemplo |
---|---|---|
fault.name="fault_name" |
fault_name es el nombre del fallo, tal como se indica en la tabla Errores de tiempo de ejecución de arriba. El nombre del error es la última parte del código de error. | fault.name Matches "IPDeniedAccess" |
acl.policy_name.failed |
policy_name es el nombre de la política especificado por el usuario que ha provocado el error. | acl.AC-AllowAccess.failed = true |
Ejemplo de respuesta de error
{ "fault":{ "faultstring":"Access Denied for client ip : 52.211.243.3" "detail":{ "errorcode":"steps.accesscontrol.IPDeniedAccess" } } }
Regla de fallo de ejemplo
<FaultRule name="IPDeniedAccess"> <Step> <Name>AM-IPDeniedAccess</Name> <Condition>(fault.name Matches "IPDeniedAccess") </Condition> </Step> <Condition>(acl.failed = true) </Condition> </FaultRule>