Analiza políticas con lint

alpha feature

En este tema, se describe cómo lint (validar) sus políticas de Cloud Identity and Access Management (Cloud IAM).

Antes de comenzar

Conceptos básicos sobre el análisis con lint para las políticas de Cloud IAM

En el contexto de las políticas de Cloud IAM, "linting" es un método para examinar una política nueva o existente y revisarla para detectar problemas específicos. Estos problemas incluyen el siguiente rango de posibilidades:

  • Sugerencias
  • Advertencias
  • Información que puede ayudar a mejorar la intención de la política, como una mejor sintaxis y semántica
  • Errores semánticos o de sintaxis que harán que fallen las operaciones setIamPolicy

El anaálisis con lint de una política se puede usar como la herramienta de depuración para proporcionar una explicación detallada de cualquier operación setIamPolicy() fallida. También se puede usar como herramienta de ayuda para facilitar la creación de una política de Cloud IAM para lograr el resultado deseado.

Análisis con lint de una condición

Las expresiones de condición suelen ser complejas, especialmente en situaciones que requieren varias cláusulas y operadores lógicos para restringir el acceso de forma adecuada. Si una expresión de condición contiene lógica no válida o si la sintaxis infringe las restricciones de una expresión de condición, la operación setIamPolicy() fallará. Además, aunque una condición puede superar todos los requisitos de semántica y sintaxis estrictos para la actualización de políticas, puede contener construcciones que pueden generar resultados de acceso inesperados durante la aplicación de la política. Algunos ejemplos de estos casos son el uso de funciones no recomendadas, el uso de nombres de servicios o tipos de recursos heredados, condiciones ineficaces (fecha / hora aprobadas), etc. Si analizas con lint una condición, se realizarán inspecciones exhaustivas y se informarán las fallas la actualización de la política y otras construcciones cuestionables.

Antes de intentar establecer una nueva vinculación condicional de funciones, recomendamos que primero analices con lint la expresión. En esta sección, se explica cómo analizar con lint una expresión mediante Cloud Console, la herramienta de línea de comandos de gcloud o la API de REST.

Para analizar con lint una expresión de condición:

Console

  1. Abre la página IAM en Cloud Console.

    Abrir la página IAM

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. En la lista de miembros, busca el miembro deseado y haz clic en el botón .

  4. En el panel Editar permisos, ubica la función que deseas analizar con lint. Luego, en Condición, haga clic en el nombre de la condición.

  5. En el panel Editar condición, el Editor de condiciones proporciona la capacidad análisis con lint de la expresión. En la actualidad, el creador de condiciones tiene una funcionalidad limitada análisis con lint.

  6. En el Editor de condiciones, agregue o edite manualmente una expresión de condición.

  7. Para validar la sintaxis de CEL, haz clic en Run Linter arriba del cuadro de texto en la parte superior derecha. Si la sintaxis contiene errores, aparecerá un ícono junto a cada línea de la expresión. Si desplazas el puntero sobre el ícono, aparecerá el mensaje de error correspondiente a esa parte de la expresión y proporcionarás comentarios prácticos para la depuración.

    Le recomendamos que corrija los errores antes de guardar la condición. Si las condiciones son sintácticamente correctas, pero la operación de lint encuentra construcciones cuestionables, aparecerá un ícono de advertencia (). Si desplazas el puntero sobre el ícono, aparecerá el mensaje de advertencia para esa parte de la expresión y proporcionarás comentarios prácticos para la depuración. Si bien es muy recomendable, no es un requisito estricto corregir las advertencias antes de guardar la condición.

  8. Realiza los cambios necesarios en la expresión de condición. Después de que se active Run Linter, continuará el análisis en el fondo para facilitar la edición de la expresión.

  9. Después de que la expression se haya realizado correctamente, haz clic en Guardar para aplicar la condición.

  10. Una vez que el panel Editar condición esté cerrado, vuelva a hacer clic en Guardar desde el panel Editar permisos para actualizar su política de Cloud IAM.

Comando de gcloud

Ejecute el comando gcloud alpha iam policies lint-condition para analizar con lint una expresión de condición determinada. Para ejecutar este comando, puedes crear un archivo de texto que contenga la condición o especificar marcas para el título, la descripción y la expresión de la condición.

En el siguiente ejemplo, usaremos un archivo de texto que contenga la condición:

condition.json

"condition": {
        "title": "1_less_than_2",
        "description": "",
        "expression": "1 <"
    }
    

Comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

El resultado del comando contiene lo siguiente:

    lintResults:
    - debugMessage: |-
        ERROR: Parse expression:1:3: mismatched input '<EOF>' expecting {'[', '{', '(', '.', '-', '!', 'true', 'false', 'null', NUM_FLOAT, NUM_INT, NUM_UINT, STRING, BYTES, IDENTIFIER}
          | 1 >
          | ...^
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 3
      severity: ERROR
      validationUnitName: LintValidationUnits/ConditionCompileCheck
    ...
    

Cada uno de los resultados de lint contiene un debugMessage que se puede usar para ayudar a localizar el problema con la expresión de condición. Si no se pudo compilar la condición, es posible que veas muchos tipos validationUnitName diferentes con el siguiente texto debugMessage:

    The validation unit is skipped due to absence of a required object: CheckedExpr
    

Realiza los cambios necesarios para que la expresión se compile correctamente y, luego, intenta analizar con lint la condición nuevamente.

API de REST

Llama al lintPolicy() para analizar con lint una expresión de condición:

    POST https://iam.googleapis.com/v1/iamPolicies:lintPolicy
    

El cuerpo de la solicitud contiene la expresión de condición:

{
        "condition": {
          "title": "1_less_than_2",
          "description": "",
          "expression": "1 &lt;"
        }
    }
    

El cuerpo de la respuesta contiene uno o más objetos LintResult, como los siguientes:

{
      "lint_results": {
        "level": "CONDITION",
        "validation_unit_name": "LintValidationUnits/ConditionCompileCheck",
        "severity": "ERROR",
        "field_name": "condition.expression",
        "location_offset": "2",
        "debug_message": "ERROR: Parse expression:1:2: mismatched input \'&lt;EOF&gt;\' expecting {\'[\', \'{\', \'(\', \'.\', \'-\', \'!\', \'true\', \'false\', \'null\', NUM_FLOAT, NUM_INT, NUM_UINT, STRING, BYTES, IDENTIFIER}\n  | 1&lt;\n  | ..^"
      },
      "lint_results": {
        "level": "CONDITION",
        "validation_unit_name": "LintValidationUnits/ConditionComplexityCheck",
        "severity": "NOTICE",
        "field_name": "condition.expression",
        "debug_message": "The validation unit is skipped due to absence of a required object: CheckedExpr"
      }
    }
    

Cada uno de los resultados de lint contiene un debug_message que se puede usar para ayudar a localizar el problema con la expresión de condición. Si no se pudo compilar la condición, es posible que veas muchos validation_unit_name tipos diferentes con el siguiente texto debugMessage:

    The validation unit is skipped due to absence of a required object: CheckedExpr
    

Realice los cambios necesarios para que la expresión se compile correctamente y, luego, intente analizar con lint la expresión de condición nuevamente.

Unidades de validación admitidas

Como se describió en la sección anterior, una unidad de validación es un tipo de lint individual que evalúa la expresión para problemas sintácticos. La siguiente tabla resume las unidades de validación admitidas, cada una con el nivel de linting deseado, la severidad de los resultados de las linting y una breve descripción.

Unidad de validación Nivel de lint Gravedad Descripción
ConditionCompileCheck CONDITION ERROR La expresión de condición contiene un error de compilación como resultado de una sintaxis de CEL no válida.
ConditionComplexityCheck CONDITION ERROR La expresión de condición contiene más que el máximo de 12 operadores lógicos.
DateTimeCheck CONDITION WARNING La expresión de condición especifica una marca de tiempo verdadera o falsa, debido a un formato de marca de tiempo no válido (que no sea ISO 8601), o la marca de tiempo de vencimiento es anterior o la marca de tiempo de inicio es anterior.
DateTimeRangeCheck CONDITION WARNING Valor fuera del intervalo para la función de marca de tiempo avanzada deseada y la expresión de comparación. Consulta aquí el rango de valores válidos para las funciones avanzadas de marcas de tiempo.
EffectiveTimeRangeCheck CONDITION WARNING En un uso más complejo de las funciones de marca de tiempo y la comparación, la expresión da como resultado un intervalo de tiempo efectivo vacío y, por lo tanto, es falsa. Como alternativa, el intervalo de tiempo abarca un rango completo y, por lo tanto, es eficaz.
ResourceServiceLiteralCheck CONDITION WARNING No se admite el valor resource.service especificado. La expresión que usa ese literal de string para la comparación de igualdad es efectivamente falsa. Consulte aquí para conocer los valores admitidos.
ResourceTypeLiteralCheck CONDITION WARNING No se admite el valor resource.type especificado. La expresión que usa ese literal de string para la comparación de igualdad es efectivamente falsa. Consulte aquí para conocer los valores admitidos.
RestrictedAttributesCheck CONDITION WARNING La expresión usa un atributo que actualmente está en versión Beta privada. Es posible que el ajuste de la expresión de condición no se realice correctamente debido a las restricciones de uso del control de acceso a la lista blanca. Consulta aquí la lista de atributos y las etapas de lanzamiento.

Ejemplos de análisis con lint

En esta sección, se proporciona un ejemplo de uso de la política de análisis con lint para cada unidad de validación. Para cada unidad de validación, se proporciona el ejemplo de entrada problemática. Cada ejemplo muestra cómo se hace un análisis con lint con la herramienta de línea de comandos de gcloud.

ConditionCompileCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition not compiling",
          "description": "",
          "expression":
            "true=false"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: |-
        ERROR: Parse expression:1:4: token recognition error at: '=f'
          | true=false
          | ....^
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 4
      severity: ERROR
      validationUnitName: LintValidationUnits/ConditionCompileCheck
    

ConditionComplexityCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition not compiling",
          "description": "",
          "expression":
            "1<2 || 2<3 || 3<4 || 4<5 || 5<6 || 6<7 || 7<8 || 8<9 || 9<10 || 10<11
            || 11<12 || 12<13 || 13<14 || 14<15"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: Logical operators count must not be more than 12
      fieldName: condition.expression
      level: CONDITION
      severity: ERROR
      validationUnitName: LintValidationUnits/ConditionComplexityCheck
    

DateTimeCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition not compiling",
          "description": "",
          "expression": "request.time < timestamp('2000-01-01T00:00:00Z')"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: Ineffective date time value 2000-01-01T00:00:00+00:00 parsed from
        "2000-01-01T00:00:00Z"; condition is effectively False. Time expired already.
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 25
      severity: WARNING
      validationUnitName: LintValidationUnits/DateTimeCheck
    

DateTimeRangeCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Time function out of range",
          "description": "",
          "expression":
            "request.time.getMonth() > 13"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: The value being compared to the specified timestamp function (getMonth)
        must be in range [0, 11].
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 26
      severity: WARNING
      validationUnitName: LintValidationUnits/DateTimeRangeCheck
    

EffectiveTimeRangeCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Empty time range",
          "description": "",
          "expression":
            "request.time.getMonth() > 5 && request.time.getMonth() < 4"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: The aggregate of time functions [getMonth] results in empty ranges.
      fieldName: condition.expression
      level: CONDITION
      severity: WARNING
      validationUnitName: LintValidationUnits/EffectiveTimeRangeCheck
    

ResourceServiceLiteralCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition with unsupported resource service string",
          "description": "",
          "expression":
            "resource.service == 'resourcemanager'"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: 'resource.service : resourcemanager is not supported. Using this
        value in condition may lead to unintended consequences. Check user guide at
        https://cloud.google.com/iam/docs/conditions-resource-attributes#resource_service_values
        for supported values for resource.service.'
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 20
      severity: WARNING
      validationUnitName: LintValidationUnits/ResourceServiceLiteralCheck
    

ResourceTypeLiteralCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition with legacy resource type",
          "description": "",
          "expression":
            "resource.type == 'resourcemanager.projects'"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: 'resource.type : resourcemanager.projects is not supported.
        Using this value in condition may lead to unintended consequences. Check
        user guide at https://cloud.google.com/iam/docs/conditions-resource-attributes#resource_type_values
        for supported values for resource.type.'
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 17
      severity: WARNING
      validationUnitName: LintValidationUnits/ResourceTypeLiteralCheck
    

RestrictedAttributesCheck

Ejemplo de expresión de condición:

{
        "condition": {
          "title": "Condition with restricted attribute",
          "description": "",
          "expression":
            "'accessPolicies/123/accesslevels/TRUSTED' in request.auth.access_levels"
        }
    }
    

Ejecutar comando:

    gcloud alpha iam policies lint-condition --condition-from-file=`condition.json`
    

Resultado de Lint:

lintResults:
    - debugMessage: Condition attribute `request.auth.access_levels` is in private beta
        release and may be subject to whitelist control. Please check https://cloud.google.com/iam/docs/conditions-overview
        for the full list of restricted attributes
      fieldName: condition.expression
      level: CONDITION
      locationOffset: 57
      severity: WARNING
      validationUnitName: LintValidationUnits/RestrictedAttributesCheck