Рубрики
Uncategorized

Как защитить неверный (открытый) API?

На прошлой неделе я не смог доставить правильную статью из-за внезапных коронных мер (я надеюсь, что все … Теги от AWS, Security, DevOps, WebDev.

Openapi (7 части серии)

На прошлой неделе я не смог доставить правильную статью из-за внезапных коронных мер (я надеюсь, что все останутся в безопасности!), Поэтому я решил отложить.

С этим сказанным, я хотел бы обсудить, как защитить ваши (открытые) API, использующие инструменты, которые уже существуют в сервисах AWS, которые мы используем, и как AWS WAF (Брандмауэр веб-приложений) может потенциально помочь (по цене).

Мы осмотрим следующие темы:

  • Введение
  • OwASP топ 10.
    • (1) инъекция
    • (2) Сломанная аутентификация
    • (3) Чувствительный экспозиция данных
    • (4) XML внешние объекты (XXE)
    • (5) Сломанный контроль доступа
    • (6) ошибка безопасности
    • (7) Скрипты поперечного сайта XSS
    • (8) небезопасная десериализация
    • (9) Использование компонентов с известными уязвимостями
    • (10) Недостаточная регистрация и мониторинг
  • В заключение
  • дальнейшее чтение

Чтобы дать это обсуждение лучшего контекста, я буду использовать OwASP топ 10 Уязвимости веб-приложений как руководящий список.

Архитектура, которая будет рассмотрена для этой статьи, является моей архитектурой справочной прикладной, используемой для этой серии статей Openapi.

rpstreef/openapi-tf-пример

Пример того, как вы можете использовать Openapi с Gateway AWS API, также включает в себя интеграции с AwslAbmda, AWS Cognito, AWS SNS и CloudWatch журналы

Это особенности;

  • API Gateway , подвергает все имеющиеся услуги
  • Лямбда Содержит код, который в конечном итоге экспозирует/обрабатывает данные в/из API.
  • Cognito для управления личности , Регистрация личности, вход и управление сессией.
  • CloudWatch Logs , ошибка, информация, регистрация отладки и службы тревоги.
  • SNS Надежный и прочный и долговечный/на основе интеграции на основе паба/дополнительных сообщений.
  • AWS CodePipipeline и CodeBuild , CI/CD для развертываний кода Lambda.

Обычно вы также использовали бы источник данных, здесь мы можем предположить, что мы либо используем NoSQL (Dynamodb), либо вариант SQL (MySQL, Postgress).

Список OWASP представляет широкий консенсус о наиболее важных рисках безопасности для веб-приложений.

Для каждого из 10 предметов я пройду через общее Риски связано с этим предметом, а затем возможным Решения подать заявку на каждый из соответствующих услуг AWS. В Заключение Для каждой главы я кратко укажу мою рекомендацию.

(1) инъекция

Риски

Инъекционные риски наиболее распространены в переменных средах, (NO) SQL-запросов, Parsers JSON/XML и параметры запроса/корпуса API.

Растворы

AWS API Gateway & openapi

Чтобы смягчить любой тип попытки впрыска, мы можем заставить правильный ввод наших API. Для этого мы можем использовать концепцию «моделей» в Gateway API. Эти модели по существу являются схемы JSON, которые определяют, какой тип данных принимается в качестве ввода или что приводится как выход после выполнения.

Например, эта модель регистров имеет рисунок Regex, которая определяет, какую информацию разрешено вводить в API с помощью этой модели:

{
  "title" : "Register",
  "required" : [ "email", "firstName", "lastName", "password", "username" ],
  "type" : "object",
  "properties" : {
    "email" : {
      "pattern" : "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$",
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    },
    "username" : {
      "type" : "string"
    },
    "firstName" : {
      "type" : "string"
    },
    "lastName" : {
      "type" : "string"
    }
  },
  "description" : "Registration details"
}

Когда вы включаете Валидация На вашем ресурсе API в вашей спецификации Openapi это будет использовать эту схему JSON для автоматического подтверждения вашего ввода. Это также поддержит проверку REGEX, а не только необходимое свойство (!). Посмотреть Это AWS Документация для получения дополнительной информации.

/identity/register:
    post:
      tags:
      - "Identity"
      description: "Register new Business user"
      operationId: "identityRegister"
      requestBody:
        description: "Registration details"
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Register"
        required: true
      x-amazon-apigateway-request-validator: full

Валидатор запроса выбирает, какую конфигурацию для использования для этой конкретной конечной точки.

Где-то еще в корне документа мы должны настроить варианты, как так:

x-amazon-apigateway-request-validators:
    full:
      validateRequestBody: true
      validateRequestParameters: true
    body-only:
      validateRequestBody: true
      validateRequestParameters: false

Конечно, вам придется сделать дополнительные проверки данных в вашем приложении, Строка приму что-нибудь. Здесь вы можете сделать компромисс между валидацией шлюза API и проверкой на основе кода. Преимущество валидации шлюза API заключается в том, что вы вообще не будете платить за выполнение любого кода.

Когда вы выполняете против API с этой конфигурацией, и вы поставляете неверный ввод, это ответ:

{
    "message": "Invalid request body"
}

AWS LAMBDA

По умолчанию все переменные среды зашифрованы в покое, см. здесь Если вы хотите использовать свои собственные ключи шифрования (CMK).

Если вы хотите зашифровать переменные среды в транзите, вы можете использовать ключ, управляемый по AWS KMS сделать это. Посмотреть Это Статья, объясняющая, как создать ключ, и как управлять шифрованием и дешифрованием в AWS Lambda.

AWS WAF.

Интернет-приложение брандмауэра поддерживает фильтрацию уровня 7 уровня OSI, значение на уровне приложения может выполнять входную фильтрацию. Это похоже на фильтрацию, показанную ранее, но это автоматически, и она не достигла вашего API вообще, если фильтр блокирует запрос API.

Это GitHub Project реализует все правила OwASP Top 10 в AWS WAF для вас, если хотите. Там недостаток в отношении модели ценообразования, о которой вы должны знать. Таким образом, здесь необходимо проводить компромисс между защитой уровня кода или защитой обслуживания AWS.

resource "aws_wafregional_sql_injection_match_set" "owasp_01_sql_injection_set" {
  count = "${lower(var.target_scope) == "regional" ? "1" : "0"}"

  name = "${lower(var.service_name)}-owasp-01-detect-sql-injection-${random_id.this.0.hex}"

  sql_injection_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "URI"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "URI"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "QUERY_STRING"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "QUERY_STRING"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "BODY"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "BODY"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "HEADER"
      data = "Authorization"
    }
  }

  sql_injection_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "HEADER"
      data = "Authorization"
    }
  }
}

resource "aws_wafregional_rule" "owasp_01_sql_injection_rule" {
  depends_on = ["aws_wafregional_sql_injection_match_set.owasp_01_sql_injection_set"]

  count = "${lower(var.target_scope) == "regional" ? "1" : "0"}"

  name        = "${lower(var.service_name)}-owasp-01-mitigate-sql-injection-${random_id.this.0.hex}"
  metric_name = "${lower(var.service_name)}OWASP01MitigateSQLInjection${random_id.this.0.hex}"

  predicate {
    data_id = "${aws_wafregional_sql_injection_match_set.owasp_01_sql_injection_set.0.id}"
    negated = "false"
    type    = "SqlInjectionMatch"
  }
}

Этот конкретный пример состоит из 8 правил в пределах одного веб-ACL. Всего Стоимость Активации этого правила:

$ 5,00 (почасовой почасовой) 1 Web acl.
$ 8,00 (почасовой почасовой) 8 Правило
$0.60 на 1 миллион Запрос
$ 13,60 / месяц Всего

На основании 1 миллиона запросов на ваш API вы заплатите 13,60 долларов за защиту от всех типов атак SQL-инъекции на вершине регулярных затрат на запросы шлюза API.

Здесь есть окончательная компромисса между удобством, стоимостью, трафиком и целесообразной безопасностью доверительного уровня над системами на основе правил развития, таких как AWS WAF.

Заключение

Для большинства приложений я бы сказал, что AWS WAF для инъекций SQL не стоит обеспечить выполнение входных входов ввода API ввода и входной фильтрации уровня приложений.

Если у вас есть реальный опыт, используя AWS WAF в крупномасштабных приложениях, дайте мне знать в комментариях.

(2) Сломанная аутентификация

Риски

Здесь мы хотим избежать атак в словаре в вашем процессе аутентификации и/или сломанным или плохо разработанным механизма аутентификации.

Растворы

AWS API Gateway & openapi

Для наших API мы хотим убедиться, что мы включим аутентификацию на наших API как можно больше, чтобы включить это на наших operapi, мы добавляем безопасность Параметр следующим образом:

paths:
  /user:
    get:
      operationId: getUser
      description: get User details by ID
      parameters:
        - $ref: '#/components/parameters/userID'
      security:
      - example-CognitoUserPoolAuthorizer: []

Это имя является ссылкой на конфигурацию авторизатора пользователей Cognito:

components:
  securitySchemes:
    example-CognitoUserPoolAuthorizer:
      type: "apiKey"
      name: "Authorization"
      in: "header"
      x-amazon-apigateway-authtype: "cognito_user_pools"
      x-amazon-apigateway-authorizer:
        providerARNs:
        - "${cognito_user_pool_arn}"
        type: "cognito_user_pools"

После включения для API им нужно иметь зарегистрированный пользователь в пуле пользователей Cognito, прежде чем они могут быть аутентифицированы и получить JWT токен В качестве доказательства они уполномочены выполнять API.

AWS Cognito

В Cognito нам нужно сделать несколько вещей, чтобы убедиться, что мы защищаем против следующих потенциальных рисков:

  • Словарь атаки/атаки грубой силы
  • Длина паролей и требования к прочности.
  • Мультифакторная аутентификация
  • Вращение идентификаторов сеанса авторизации.
  • Аннулирование идентификаторов сеансов.

Прежде всего, мы хотим убедиться, что пароль длиной не менее 8 символов, как рекомендуется Нич

В пределах AWS_COGNITO_USER_POOL Ресурс, мы устанавливаем политику пароля следующим образом:

resource "aws_cognito_user_pool" "_" {
  # ... other configuration ...

  password_policy {
    minimum_length    = 8
    require_uppercase = true
    require_lowercase = true
    require_numbers   = true
    require_symbols   = true
  }

   # ... other configuration ...
}

Затем включить многофакторную аутентификацию:

resource "aws_cognito_user_pool" "_" {
  # ... other configuration ...

  mfa_configuration          = "ON"
  sms_authentication_message = "Your code is {####}"

  sms_configuration {
    external_id    = "example"
    sns_caller_arn = aws_iam_role.sns_caller.arn
  }

  software_token_mfa_configuration {
    enabled = true
  }

   # ... other configuration ...
}

Когда mfa_configuration установлен на НА Для всех необходимо иметь SMS или программное обеспечение MFA.

Если вы хотите, Cognito поддерживает больше Усовершенствованные функции безопасности Для дополнительных Стоимость Отказ Пример, приведенный для 100 000 пользователей без продвинутой безопасности, составляет 250 долларов, а составляет 4525 долларов (!). Опять здесь, стоит ли это ваших инвестиций.

Предложенные функции:

Это, очевидно, потребует ли вы интеграции Cognito SDK в ваше приложение или веб-приложение.

Заключение

Правильно реализация API Gateway Security и Cognito аутентификация с разумными требованиями пароля с 2FA уже смягчается большинство вопросов, указанных в OwASP.

Если у вас есть более строгие требования к безопасности для вашего приложения, дополнительные расширенные функции безопасности, предлагаемые Cognito, могут быть полезны.

(3) Чувствительный экспозиция данных

Риски

Здесь очевидные риски не шифруют данные при транспортировке или в состоянии покоя, слабая криптография, которая может быть изменена, и человек в средних атаках.

Растворы

Все данные на стороне служб AWS зашифрованы в транзите с использованием TLS/SSL. Теперь мы в основном смотряте, как вы можете защитить данные в покое.

AWS Dynamodb.

Для Dynamodb мы хотим убедиться, что мы зашифровали информацию следующим образом.

resource "aws_dynamodb_table" "_" {

   # ... other configuration ...

  server_side_encryption {
    enabled = true
  }

   # ... other configuration ...

}

Для получения дополнительной информации о шифровании CMK или обновление таблицы см. Это Официальная документация.

Для дальнейших лучших практик в области безопасности на Dynamodb см. Это Официальная документация.

Поскольку DynamoDB использует доступ к роли IAM, необходимо не строго необходимо использовать VPC для ограничения общественного доступа. Если вы хотите быть следующим передовым опытом, использование решения VPC рекомендуется здесь и может обеспечить выполнение всех трафика в сети AWS для повышения безопасности.

AWS RDS.

При создании хранилища данных на основе SQL мы можем использовать следующее для включения шифрования:

resource "aws_db_instance" "_" {

  # ... other configuration ...

  storage_encrypted   = true
  publicly_accessible = false

  # ... other configuration ...

}

Вам также было бы хорошо рекомендовать не разрешать публичный доступ к базе данных. VPC следует настроить, чтобы разрешить только частные подсети доступ к вашей базе данных для повышения безопасности.

Для подключения к RDS вы можете использовать его общедоступный сертификат SSL для обеспечения зашифрованных передач данных.

Посмотреть Это Статья для общих руководящих принципов безопасности для AWS RDS.

AWS LAMBDA

Перед хранением чувствительных данных, таких как детали кредитной карты, рекомендуется использовать правильные алгоритмы шифрования. Эти алгоритмы имеют задержку фактора рабочего фактора, которые затрудняют грубое затруднение. Аргон2 , Scrypt , BCRYPT или PBKDF2 Отказ

Заключение

В зависимости от которой вы используете базу данных, варианты доступны для обеспечения транспортировки и в состоянии покоя. Следующая вещь — предотвратить доступу от общественности как можно больше, используя настройку VPC.

(4) XML внешние объекты (XXE)

Риски

Многие системы все еще используют XML в одной или иной форме, вы можете подумать о SOAP API Services, а также интеграционные системы обмена сообщениями уровня. Этот риск состоит в том, чтобы автоматизированная обработка XML с в основном устаревшими библиотечными зависимостями.

Растворы

AWS LAMBDA

Убедитесь, что ваши библиотеки обработки XML обновлены и проверьте Пример сценарии атаки здесь Чтобы получить представление о векторах атаки.

Использовать Это Чит лист, чтобы узнать, как смягчить риск для этих языков программирования:

Заключение

Если честно, я вообще не использую XML. У нас есть только один проект, где нам нужно глотать XML, исходящую из правительственного агентства США, и этот конкретный формат даже не соответствует стандартам XML. Нам пришлось построить пользовательский парсер, чтобы иметь дело с этим.

(5) Сломанный контроль доступа

Риски

Сломанный контроль доступа означает, что злоумышленники могут получить доступ к информации, которая не принадлежит пользовательской сессии. Например, посредством изменения параметров запроса URL-адреса, как это:

http://example.com/app/accountInfo?acct=notmyacct

Другим потенциальным риском является либеральные настройки CORS, которые позволяют выполнять API из разных веб-доменов.

Растворы

AWS API Gateway & openapi

Рост

Управление правильными настройками CORS для вашего API является первым шагом. Для этого нам нужно изменить Варианты Работа на каждом из путей API, которые имели включение COR:

options:
  responses:
    200:
      $ref: '#/components/responses/cors'
    400:
      $ref: '#/components/responses/cors'
    500:
      $ref: '#/components/responses/cors'
  x-amazon-apigateway-integration:
    responses:
      default:
        statusCode: "200"
        responseParameters:
          method.response.header.Access-Control-Max-Age: "'7200'"
          method.response.header.Access-Control-Allow-Methods: "'OPTIONS,HEAD,GET,POST,PUT,PATCH,DELETE'"
          method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
          method.response.header.Access-Control-Allow-Origin: "'*'"
    passthroughBehavior: "when_no_match"
    timeoutInMillis: 29000
    requestTemplates:
      application/json: "{ \"statusCode\": 200 }"
    type: "mock"

Критически это метод .Response.Header. Access-Control-Allow-light Параметр ответа, который теперь установлен на '*' Принять все запросы о происхождении. Для целей развития это может быть в порядке, когда вы имеете дело с различными серверами тестирования и местными средами выполнения. Для производства нам необходимо заблокировать это до доменного имени, выполняющего только этот API.

Ограничения API

Следующее, что мы хотим убедиться, что мы ограничиваем количество параллельных казней API.

resource "aws_api_gateway_method_settings" "_" {
  rest_api_id = aws_api_gateway_rest_api._.id
  stage_name  = aws_api_gateway_stage._.stage_name
  method_path = "*/*"

  settings {
    throttling_burst_limit = var.api_throttling_burst_limit
    throttling_rate_limit  = var.api_throttling_rate_limit
    metrics_enabled        = var.api_metrics_enabled
    logging_level          = var.api_logging_level
    data_trace_enabled     = var.api_data_trace_enabled
  }
}

Чтобы контролировать пределы на вашем этапе API, установите Throttling_burst_limit а также throttling_rate_limit Параметры. Они контролируют следующее:

  • Throttling_burst_limit. : Количество запросов в секунду этап API будет поддерживать на несколько секунд, после чего это будет ошибка с откликом 429 HTTP.
  • throttling_rate_limit : Количество запросов в секунду для стадии API, он будет продолжаться до тех пор, пока не достигнет предела скорости разрыва, после чего это будет ошибка с откликом HTTP 429.

В случае злоупотребления нам необходимо убедиться, что они имеют разумные ограничения, такие что атаки DOS ограничены как можно больше.

AWS Dynamodb, Cognito и лямбда

Контроль прекрасного зерна

Мы можем реализовать мелкозернистые механизмы контроля доступа на dynamodb, который позволит только аутентифицированному доступу пользователей к собственным записям.

Это Статья входит в подробности, как это сделать, дан следующий пример:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:BatchGetItem",
        "dynamodb:Query"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-west-2:123456789012:dynamodb:table/GameScores"
      ],
      "Condition": {
        "ForAllValues:StringEquals": {
          "dynamodb:LeadingKeys": [
            "${www.amazon.com:user_id}"
          ],
          "dynamodb:Attributes": [
            "UserId",
            "GameTitle",
            "Wins"
          ]
        },
        "StringEqualsIfExists": {
          "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
        }
      }
    }
  ]
}

Вышеуказанная политика даст доступ только к читанию доступа к элементам в Gamescores Таблица, принадлежащая www.amazon.com:user_id и он сможет получить только эти столбцы для каждой строки; Userid , Gametitle и Выигрывает Отказ

Обратить внимание, что www.amazon.com:user_id Относится к идентификаторам от Amazon Federated входа в систему, а не на обычный пользовательский пул Cognito. Чтобы использовать пользовательский пул, зарегистрированные идентичности, используйте cognito-yentity.amazonaws.com:sub вместо.

Чтобы иметь возможность использовать эту политику в вашем AWS Lambda Code, вы должны получить временные учетные данные со следующей функцией, см. Официальная документация Больше подробностей:

var params = {
  RoleArn: 'STRING_VALUE', /* required */
  RoleSessionName: 'STRING_VALUE', /* required */
  WebIdentityToken: 'STRING_VALUE', /* required */
  DurationSeconds: 'NUMBER_VALUE',
  Policy: 'STRING_VALUE',
  PolicyArns: [
    {
      arn: 'STRING_VALUE'
    },
    /* more items */
  ],
  ProviderId: 'STRING_VALUE'
};
sts.assumeRoleWithWebIdentity(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

Когда это выполняет успешно, у вас есть временные учетные данные, которые позволяют читать с DynamOdb, как указано политикой ранее.

Роли и роль доступа

Чтобы решить роли и проблемы доступа к роли для вашего API, вы можете использовать следующую настройку в Cognito:

module "cognito" {
  source = "../modules/cognito"

  namespace         = var.namespace
  resource_tag_name = var.resource_tag_name
  region            = var.region

  cognito_identity_pool_name     = var.cognito_identity_pool_name
  cognito_identity_pool_provider = var.cognito_identity_pool_provider

  schema_map = [
    {
      name                = "email"
      attribute_data_type = "String"
      mutable             = false
      required            = true
    },
    {
      name                = "phone_number"
      attribute_data_type = "String"
      mutable             = false
      required            = true
    },
    {
      name                = "businessID"
      attribute_data_type = "String"
      mutable             = true
      required            = false
    },
    {
      name                = "role"
      attribute_data_type = "String"
      mutable             = true
      required            = false
    },
    {
      name                = "roleAccess"
      attribute_data_type = "String"
      mutable             = true
      required            = false
    }
  ]
}

schema_map Содержит все дополнительные параметры, которые необходимо записать (либо вручную, либо автоматическую после регистрации) для регистрации, и они получают во время аутентифицированы Сессия в AWS Lambda.

событие Объект в сеансе AWS Lambda содержит всю информацию из текущего аутентифицированного пользователя. Чтобы получить доступ к претензии Объект: event.requestcontext.authorizer.Claims который будет содержать пользовательские параметры, установленные в AWS Cognito, как:

{
  'custom:role': 'USER',
  'custom:roleAccess': '{
    "business": "rwu",
    "role": "r",
    "user": "rwud",
  }',
  'custom:businessID': '1'
}

Когда пользователь аутентичен против Cognito, теперь AWS Lambda знает, какую роль имеет роль пользователя, и какую роль доступ к которому влечет за собой. Каждая из этих свойств, например Бизнес позволит вам разрешить доступ к Получить (r), Пост (w), Поставить (U), Удалить (d) Операции на этом конкретном бизнесе API. Вы можете сделать это как мелкозернистым, как вам нужно.

Для ключевых идентификаторов, таких как предприниматель Рекомендуется сделать те часть клавиши раздела Dynamodb такими, что они обязательны при запросе данных и никогда не поставляются через параметры запроса API или объекты тела JSON.

Заключение

Сломанные элементы управления доступом могут создавать множество проблем как для безопасности данных, так и для (d) возможностей атаки DOS через свободные CORS и настройки пределов скорости на вашем API.

(6) ошибка безопасности

Риски

Это очень широкий набор угроз, которые проходят через стек приложения. От ненаправленного программного обеспечения на учетные записи по умолчанию. Типичным примером здесь является ведро S3, которое имеет публичные разрешения, это раньше было распространено как Это Статья показывает.

Растворы

Код AWS Build.

Поскольку этот стек работает в полновейвере, и, таким образом, является управляемым сервисом Amazon, область, которые наиболее подвержены воздействию потенциальных утечек безопасности, является кодом, который мы используем на слое AWS Lambda и Lambda.

В случае узла нам нужно убедиться, что мы обновились до последней версии, поддерживаемой AWS, и это версия 12. В вашей системе сборки у нас есть много возможностей для тестирования для уязвимостей в зависимости и кодах, таких как:

  • NPM Audit: Чтобы проверить ваши зависимости, см. Это Статья для деталей, мы можем реализовать NPM Audit Шаг в CodeBuild и остановите трубопровод после обнаружения уязвимостей.
  • Casker Checker Owasp: OWASP имеет проверку зависимости, который может быть интегрирован в командную строку, см. здесь Отказ Этот конкретный анализатор имеет поддержку нескольких языков, включая NODEJS и NPM Package Manager, см. здесь для деталей.
  • Nodejsscan: NODEJSSCAN — Docker Ready General Tever Scanner, специально для Nodejs, Вот Github для более подробной информации. Это сканирует всю вашу кодовую базу для уязвимостей, таких как XSS, впрыска удаленного кода и инъекция SQL среди других.
  • Степеньи: Это хорошо известный сканер для узлов и уязвимости кода JavaScript. Увидеть их Страница GitHub для деталей.

AWS LAMBDA

Для AWS Lambda у нас есть отличное промежуточное программное обеспечение, чтобы охватить правильные конфигурации безопасности, касающиеся HTTP REST API, он называется Среднее Отказ Это некоторые из рекомендуемых плагинов:

  • Http-cors помогает установить правильные заголовки HTTP CORS.
  • HTTP-Error-Handler Возвращает правильные HTTP-ответы, это работает в сочетании с HTTP-Error Отказ
  • HTTP-Security-заголовки Это применяет лучшие практические заголовки безопасности к HTTP-ответам.

Заключение

Поскольку AWS позаботится о деталях вокруг каждой службы, которую мы используем, мы все еще имеем ответственность в этом районе, мы введем возможные утечки безопасности. Конечно, мы можем неправильно проверить ведро S3 для публичного доступа, и есть много других примеров, которые я мог бы покрыть. Тем не менее, я сосредоточился на ключевой области исходного кода.

Если вы заинтересованы в гораздо более широком и углубленном взгляде, пожалуйста, просмотрите руководящие принципы на СНГ для дополнительных решений здесь Отказ

(7) Скрипты поперечного сайта XSS

Риски

Недостатки XSS возникают, когда веб-приложения включают в себя предоставленные пользователем данные в веб-страницах, которые отправляются в браузер без надлежащей дезинфекции. Если данные не проверяются должным образом или избежают, злоумышленник может встроить скрипты, встроенные кадры или другие объекты в визуализированную страницу.

XSS — очень хорошо известная безопасность риск безопасности, есть несколько вариантов Owasp Признает:

  • Отраженные XSS: Как правило, это о взаимодействии/сценариях URL, которые имеют злонамеренные намерения, исходящие от пользовательских данных, которые не демонстрируются.
  • Хранится XSS: Хранение безцинцированного пользовательского ввода, которая рассматривается кем-то еще и в худшем случае кем-то с привилегиями администратора.
  • DOM XSS: Наиболее распространенные с JavaScript Frameworks, которые манипулируют DOM, такими как Reactjs и Vuejs. Пример здесь замена узла DOM с вредоносным экраном входа.

Растворы

AWS API Gateway & Lambda

Этот риск заключается в том, что входные санитарии мы обсудили это в предыдущих главах, см. Главу о инъекции для моих рекомендаций о том, как иметь дело с этим.

AWS WAF.

Кроме того, если вы хотите, чтобы уединенные правила брандмауэра веб-приложения для решения рисков XSS можно использовать следующий террафом код (взято из это GitHub Repo):

resource "aws_wafregional_xss_match_set" "owasp_03_xss_set" {
  count = "${lower(var.target_scope) == "regional" ? "1" : "0"}"

  name = "${lower(var.service_name)}-owasp-03-detect-xss-${random_id.this.0.hex}"

  xss_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "URI"
    }
  }

  xss_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "URI"
    }
  }

  xss_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "QUERY_STRING"
    }
  }

  xss_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "QUERY_STRING"
    }
  }

  xss_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "BODY"
    }
  }

  xss_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "BODY"
    }
  }

  xss_match_tuple {
    text_transformation = "URL_DECODE"

    field_to_match {
      type = "HEADER"
      data = "cookie"
    }
  }

  xss_match_tuple {
    text_transformation = "HTML_ENTITY_DECODE"

    field_to_match {
      type = "HEADER"
      data = "cookie"
    }
  }
}

resource "aws_wafregional_rule" "owasp_03_xss_rule" {
  depends_on = ["aws_wafregional_xss_match_set.owasp_03_xss_set"]

  count = "${lower(var.target_scope) == "regional" ? "1" : "0"}"

  name        = "${lower(var.service_name)}-owasp-03-mitigate-xss-${random_id.this.0.hex}"
  metric_name = "${lower(var.service_name)}OWASP03MitigateXSS${random_id.this.0.hex}"

  predicate {
    data_id = "${aws_wafregional_xss_match_set.owasp_03_xss_set.0.id}"
    negated = "false"
    type    = "XssMatch"
  }
}

Опять же здесь, стоимость, чтобы AWS позаботиться об этом для вас следующим образом. Эти защиты XSS содержат 8 правил в пределах одного веб-ACL. Всего Стоимость Активации этого правила:

$ 5,00 (почасовой почасовой) 1 Web acl.
$ 8,00 (почасовой почасовой) 8 Правило
$0.60 на 1 миллион Запрос
$ 13,60 / месяц Всего

На основании 1 миллиона запросов к вашему API вы заплатите 13,60 доллара за защиту от всех типов атак XSS, на верхней части регулярных заправок запроса шлюза API. Конечно, вы можете активировать это вместе с правилами впрыска SQL в одном Web ACL для экономии 5,00 долл. США в месяц на общую сумму 22,20/месяц.

Заключение

Когда вы применяете хорошие входные санитарии, которые должны быть достаточно защищены от какого-либо риска XSS. Пожалуйста, проверьте вашу текущую реализацию против Это чит-лист от OwASP, чтобы убедиться, что вы полностью защищены.

(8) небезопасная десериализация

Риски

Дефекты в том, как десериализация сделана, может привести к выполнению удаленного выполнения кода. Например, объект JSON отправляет веб-приложением через шлюз AWI API, является десериализирован (JSON to JavaScript объект преобразования), а действия выполняются на этих данных.

Примеры потенциальных рисков; Сеанс Cookie Tampering, и манипуляция состояния сеанса.

Растворы

AWS LAMBDA

Это требует отзыв ручного кода и использование сканеров уязвимости кода, как введено в Безопасность ошибка глава. Решение, как рекомендовано Owasp Соответствует проверке состояния и файлов cookie, используя проверки целостности с цифровыми подписями, такими как хэш или подпись аутентификации. Если данные не содержат таких подписей, она будет игнорироваться. Кроме того, регистрация любых ошибок десериализации очень полезна для обнаружения любого возможного вмешательства.

Заключение

Пожалуйста, просмотрите Это OWASP Cheat лист для деталей на языку программирования, для чего смотреть.

(9) Использование компонентов с известными уязвимостями

Риски

Любой код или компонент, который используется в качестве зависимости, может иметь известные уязвимости. Поскольку такая огромная зависимость от зависимостей с открытым исходным кодом в большинстве проектов очень трудно осознавать риски безопасности.

Растворы

Здесь мы должны полагаться на построение фазового сканирования и ручного обзора, чтобы избежать максимально возможных рисков безопасности. Пожалуйста, ознакомьтесь с решениями в разделе «Независимо от решения о безопасности главы», чтобы уменьшить этот риск безопасности.

Заключение

Тот факт, что несколько сходств OvASP TOP 10 RISCS COMPLESS означает, что многие программные услуги и продукты полагаются на программное обеспечение с открытым исходным кодом. С этой зависимостью приходят уязвимости безопасности, которые трудно обнаружить без какой-либо формы автоматизированного обнаружения. Разработчики и DEVOPS должны поставить гораздо больше внимания обнаружению угрозы в фазе сборки до того, как код введен в производство.

(10) Недостаточная регистрация и мониторинг

Риски

Эти риски связаны отсутствием контекстуальной регистрации (где, что и как), что снижает осведомленность, а во время мониторинга угроз. Последнее о том, насколько быстро IT-команда может отвечать на инциденты безопасности.

Растворы

AWS Cloudwatch.

CloudWatch может обеспечить как журнал, так и мониторинг с предупреждениями. Как я продемонстрировал в более ранней статье в этом Openapi Серия статей. Просмотрите эту статью для предложений о регистрации и мониторинге, которые повысят видимость и облегчают обнаружение отладки и ошибки (угрозы).

Как вести вход на aw serverless

Rolf Streefkerk · 9 февраля · 8 мин прочитаны

Aws рентген

Рентгеновский рентген так же, как имя предложит услугу, которая обеспечивает гораздо больше прозрачности в исполнение без сервера, как визуализируя путь выполнения, а также легко доступны журналы. Я охватил использование и реализацию в более ранней статье, пожалуйста, просмотрите эту статью ниже.

Безверонетная трассировка с AWS рентген

Rolf Streefkerk · 16 февраля · 6 мин прочитаны

Заключение

С этими двумя инструментами в руке большинство аномалий могут быть относительно быстро обнаружены либо хоть и мониторинг оповещений от CloudWatch через SNS, либо с помощью анализа ошибок/ошибок с помощью AWS рентген.

Здесь было много, чтобы покрыть здесь, и я уверен, что я одинаково не пропустил. Исследование этого на самом деле обнаружило некоторые вещи, которые я еще не реализовал себя правильно, вот что делает создание этих статей так ценным для меня. Я надеюсь, что это было полезным чтением, и я очень ценю ваше время и внимание.

Если я сделал какие-либо ошибки или у вас есть предложения, дополнения, пожалуйста, дайте мне знать в комментариях. Мне очень интересно, читая ваши мысли и опыт на этом сложном предмете.

Для моей следующей статьи я хотел бы обсудить Dynamodb в некоторых деталях, и почему вы должны использовать его.

Спасибо за прочтение!

Openapi (7 части серии)

Оригинал: «https://dev.to/rolfstreefkerk/how-to-protect-serverless-open-api-s-5eem»