Announcing ASCP integration with Pod Identity: Enhanced security for secrets management in Amazon EKS

Post Syndicated from Rodrigo Bersa original https://aws.amazon.com/blogs/security/announcing-ascp-integration-with-pod-identity-enhanced-security-for-secrets-management-in-amazon-eks/

In 2021, Amazon Web Services (AWS) introduced the AWS Secrets and Configuration Provider (ASCP) for the Kubernetes Secrets Store Container Storage Interface (CSI) Driver, offering a reliable way to manage secrets in Amazon Elastic Kubernetes Service (Amazon EKS). Today, we’re excited to announce the integration of ASCP with Pod Identity, the new standard for AWS Identity and Access Management (IAM) integration with Amazon EKS. This integration provides enhanced security, simplified configuration, and improved Day-2 operation for applications running on EKS that need access to secrets stored in AWS Secrets Manager and AWS Systems Manager Parameter Store. In this post, we’ll cover use-case scenarios for single and cross-account secrets using Pod Identity integration with ASCP.

Amazon EKS introduced Pod Identity in 2023 as a feature that streamlines the process of configuring IAM permissions for Kubernetes applications. Pod Identity simplifies the identity management of applications running on top of Amazon EKS by allowing you to set up permissions directly through EKS interfaces, reducing the number of steps required and alleviating the need to switch between the EKS and IAM services. Pod Identity enables the use of a single IAM role across multiple clusters without updating trust policies, and it supports role session tags for more granular access control. This approach not only simplifies policy management by allowing the reuse of permission policies across roles, but also enhances security by enabling access to AWS resources based on matching tags.

Background

When your applications that are running on top of Amazon EKS require sensitive information like credentials to access a database, or a key to authenticate through an API, we call this kind of information secrets. You can secure, store, and manage secrets in AWS Secrets Manager. ASCP allows Kubernetes applications to securely retrieve the secrets stored in Secrets Manager and Systems Manager Parameter Store. Previously, ASCP relied on IAM roles for service accounts (IRSA) for authentication. Although IRSA provided improvements over previous methods, Pod Identity offers even greater security and simplicity.

Pod Identity provides a more secure and efficient way to integrate IAM roles with applications running on EKS, granting more granular AWS permissions to individual Pods, so that you don’t need instance-level credentials or IRSA.

This integration provides the following key benefits over using IRSA:

  • Enhanced security: Pod Identity provides a more granular and secure way to manage permissions at the Pod level, alleviating the need to expose the IAM role annotation on Kubernetes ServiceAccount objects.
  • Simplified configuration:Pod Identity streamlines and simplifies the setup process, reducing the potential for misconfiguration, especially in high-scale environments.
  • Improved operation: Pod Identity reduces the operational overhead compared to previous methods, centralizing the management with the AWS API.
  • Native EKS integration: Pod Identity is the new standard for IAM integration for applications running on EKS and provides a more cohesive experience.

Solution overview

With this integration, ASCP uses Pod Identity to authenticate and authorize access to AWS services. When a Pod requires access to a secret, the workflow is as shown in Figure 1.

Figure 1: The workflow performed by the Pod Identity and ASCP integration to provide access to a secret stored on AWS Secrets Manager for a Pod running on Amazon EKS

Figure 1: The workflow performed by the Pod Identity and ASCP integration to provide access to a secret stored on AWS Secrets Manager for a Pod running on Amazon EKS

The workflow is as follows:

  1. A user creates an IAM role and a Pod Identity association between the IAM role and the Kubernetes ServiceAccount assigned to the Pod.
  2. EKS API validates the Pod Identity association, allowing ASCP to use this role to authenticate with AWS services.
  3. If authorized, the Pod Identity agent allows ASCP to assume the IAM role assigned to the Pod through the use of a ServiceAccount token.
  4. The Pod retrieves the requested secrets values and makes them available to the Pod through the use of a mounted volume.

Prerequisites

You need to have the following prerequisites in place in order to implement this solution:

Implement the solution

This guide presents two scenarios: single-account setup and cross-account setup. Complete the single-account steps in Account A before proceeding to the cross-account configuration, which involves Account B. The cross-account setup builds on the single-account foundation to demonstrate secure secrets management across AWS accounts.

Amazon EKS cluster setup

Before you start, you’ll need to set up an Amazon EKS cluster with the required add-ons in a single account (Account A).

  1. (Optional) Use the following commands to set environment variables and create an Amazon EKS cluster:
    export CLUSTER_NAME=<YOUR_CLUSTER_NAME>
    export AWS_REGION=<YOUR_AWS_REGION>
    export NAMESPACE=<YOUR_NAMESPACE>
    export ACCOUNT_A=<ACCOUNT_ID_1>
    export ACCOUNT_B=<ACCOUNT_ID_2>
    export SECRET_NAME=<NAME_OF_YOUR_SECRET>
    export SECRET_NAME_CROSS=<NAME_OF_YOUR_CROSS_SECRET>

    Here are the environment variables for this demonstration:

    export CLUSTER_NAME=ascp-podidentity
    export SECRET_NAME=secret-a
    export AWS_REGION=$(aws configure get region)
    export NAMESPACE=default
    export SECRET_NAME=secret-a
    export SECRET_NAME_CROSS=secret-b

    Create the EKS cluster:

    eksctl create cluster —name $CLUSTER_NAME —version=1.31

  2. Update your kubeconfig file to enable Pod Identity on your EKS cluster (if it’s not already enabled):
    eksctl create addon --cluster $CLUSTER_NAME --name eks-pod-identity-agent

  3. Install the Secrets Store CSI driver:
    aws eks --region $AWS_REGION update-kubeconfig --name $CLUSTER_NAME
    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver

  4. Verify the Secrets Store CSI Driver installation:
    kubectl --namespace=kube-system get pods -l "app=secrets-store-csi-driver"

    You should see this expected output:

    NAME READY STATUS RESTARTS AGE
    csi-secrets-store-secrets-store-csi-driver-fcxf6 3/3 Running 0 41s
    csi-secrets-store-secrets-store-csi-driver-j9wqh 3/3 Running 0 41s

  5. Install the ASCP plugin:
    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

Consuming secrets in a single account

Now that you’ve set up your Amazon EKS cluster, in this use case, you’ll create an AWS Secrets Manager secret in the same account where the cluster and the applications reside (Account A).

  1. Create a secret in AWS Secrets Manager with tags kubernetes-namespace and eks-cluster-name within the same AWS account as the EKS cluster:
    aws secretsmanager create-secret --region $AWS_REGION \
    --name $SECRET_NAME \
    --tags Key=kubernetes-namespace,Value=$NAMESPACE Key=eks-cluster-name,Value=$CLUSTER_NAME \
    --secret-string "{"user":"user1","password":"passwd1"}"

    You should see this expected output:

    {
    "ARN": "arn:aws:secretsmanager:$AWS_REGION:$ACCOUNT_A:secret:dummy-secret-q1w2e3",
    "Name": "secret-a",
    "VersionId": "abcdefgh-1234-5678-ijklmnopqrst"
    }

    Note the Amazon Resource Name (ARN) of the new secret. You will use it in the next step.

  2. Create an IAM role and trust policy with the required permissions to retrieve the newly created secret within the same AWS account:
    SECRET_ARN=< NOTED_SECRET_ARN_FROM_PREVIOUS_STEP>
    cat << EOF > policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": ["secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret"],
                "Resource": ["$SECRET_ARN"],
                "Condition": {
                    "StringEquals": {
                        "secretsmanager:ResourceTag/kubernetes-namespace": "\${aws:PrincipalTag/kubernetes-namespace}",
                        "secretsmanager:ResourceTag/eks-cluster-name": "\${aws:PrincipalTag/eks-cluster-name}"
                    }
                }
            }
        ]
    }
    EOF

    In the preceding example IAM role permission policy, the use of conditions with kubernetes-namespace and eks-cluster-name tags helps enforce fine-grained access control by specifying that secrets can only be accessed by Pods from specific namespace and clusters. This allows secretsmanager actions only if the secret is tagged with the matching kubernetes-namespace and  eks-cluster-name values.

    cat << EOF > trust.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {  
                "Effect": "Allow",
                "Principal": {
                    "Service": "pods.eks.amazonaws.com" 
                },
                "Action": [
                    "sts:AssumeRole",
                    "sts:TagSession"
                ]
            }
        ]
    }
    EOF

    Notice that the preceding example IAM role trust policy allows the Amazon EKS Pod Identity service (pods.eks.amazonaws.com) to assume the role and tag the session. These actions are necessary for Pod Identity to function correctly, enabling Pods to securely access AWS resources.

    Finally, apply the role and trust policy:

    aws iam create-role --role-name ascp-podidentity --assume-role-policy-document file://trust.json
    aws iam put-role-policy --role-name ascp-podidentity --policy-name ascp-podidentity --policy-document file://policy.json

    Note the ARN of the new role. You will use it in the next step.

  3. Create a Kubernetes ServiceAccount and add the Pod Identity association between the ServiceAccount and the IAM role:
    ROLE_ARN=<NOTED_ROLE_ARN_FROM_PREVIOUS_STEP>
    kubectl create serviceaccount serviceaccount-a
    
    aws eks create-pod-identity-association \
    --cluster-name "$CLUSTER_NAME" \
    --namespace "default" \
    --service-account serviceaccount-a \
    --role-arn $ROLE_ARN

  4. Create a SecretProviderClass to use the newly created secret in your Amazon EKS cluster.
    cat << EOF | kubectl apply -f -
    
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aws-secrets-manager
    spec:
      provider: aws
      parameters:
        objects: |
          - objectName: "secret-a" # Secret name or ARN to be mounted to the Pod
            objectType: "secretsmanager"
        usePodIdentity: "true" # Indicator to use Pod Identity instead of IRSA
        
    EOF

  5. Create a new deployment to consume your newly created secret using Pod Identity as a mounted volume.
    cat << EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: application-a
      name: application-a
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: application-a
      template:
        metadata:
          labels:
            app: application-a
        spec:
          containers:
          - image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
            name: amazonlinux
            args:
            - infinity
            command:
            - sleep
     volumeMounts:
     - name: secrets-store-inline
     mountPath: "/mnt/secret" # Directory where secret will be mounted to
     readOnly: true
     volumes:
     - name: secrets-store-inline
     csi:
     driver: secrets-store.csi.k8s.io
     readOnly: true
     volumeAttributes:
     secretProviderClass: "aws-secrets-manager" # Match SecretProviderClass name created
     serviceAccountName: serviceaccount-a # Specify service account created
    
    EOF

  6. Validate that the deployment was created successfully and confirm the secret was mounted correctly.
    kubectl get pods -l app=application-a
    kubectl exec -it $(kubectl get pods -l app=application-a -o name) -- cat /mnt/secret/secret-a

    You should see this expected output:

    NAME READY STATUS RESTARTS AGE
    application-a-b98d44bb8-bzvn4 1/1 Running 0 3s
    
    {"user":"user1","password":"passwd1"}%

Working with cross-account secrets through resource policies

For this second use case, you’ll also use the Amazon EKS cluster on Account A, and create a new Secrets Manager secret in a different account (Account B).

In order to access a secret in a different account, you can’t use the default AWS Key Management Service (AWS KMS) key, but will use aws/secretsmanager to encrypt this secret. So you need to first create a new AWS KMS key that allows cross-account access.

On Account B

  1. Create a customer managed key on AWS KMS with cross-account permissions:
    cat < key-policy.json
    {
      "Version": "2012-10-17",
      "Id": "cross-account-access",
      "Statement": [
        {
          "Sid": "Enable IAM User Permissions",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::${ACCOUNT_B}:root"
          },
          "Action": "kms:*",
          "Resource": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/*"
        },
        {
          "Sid": "Allow access for Key Administrators",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::${ACCOUNT_B}:role/Admin"
          },
          "Action": [
            "kms:Create",
            "kms:Describe",
            "kms:Enable",
            "kms:List",
            "kms:Put",
            "kms:Update",
            "kms:Revoke",
            "kms:Disable",
            "kms:Get",
            "kms:Delete",
            "kms:TagResource",
            "kms:UntagResource",
            "kms:ScheduleKeyDeletion",
            "kms:CancelKeyDeletion",
            "kms:RotateKeyOnDemand"
          ],
          "Resource": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/*"
        },
        {
          "Sid": "Allow access through AWS Secrets Manager",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt",
            "kms:CreateGrant",
            "kms:DescribeKey"
          ],
          "Resource": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/*",
          "Condition": {
            "StringEquals": {
              "kms:ViaService": "secretsmanager.${AWS_REGION}.amazonaws.com",
              "kms:CallerAccount": [
                "$ACCOUNT_A",
                "$ACCOUNT_B"
              ]
            }
          }
        },
        {
          "Sid": "Allow access through AWS Secrets Manager for Generate Data Key",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": "kms:GenerateDataKey",
          "Resource": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/*",
          "Condition": {
            "StringEquals": {
              "kms:CallerAccount": [
                "$ACCOUNT_A",
                "$ACCOUNT_B"
              ]
            },
            "StringLike": {
              "kms:ViaService": "secretsmanager.${AWS_REGION}.amazonaws.com"
            }
          }
        },
        {
          "Sid": "Allow direct access to key metadata to the account",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::${ACCOUNT_A}:root",
              "arn:aws:iam::${ACCOUNT_B}:root"
            ]
          },
          "Action": [
            "kms:Describe",
            "kms:Get",
            "kms:List",
            "kms:RevokeGrant"
          ],
          "Resource": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/*"
        }
      ]
    }
    EOF

    Then create the KMS key:

    $ aws kms create key --region $AWS_REGION --policy file://key-policy.json

    You should see this expected output:

    {
        "KeyMetadata": {
            "AWSAccountId": "$ACCOUNT_B",
            "KeyId": "abcdefgh-1234-5678-90ij-klmnopqrstuv",
            "Arn": "arn:aws:kms:${AWS_REGION}:${ACCOUNT_B}:key/abcdefgh-1234-5678-90ij-klmnopqrstuv",
            "CreationDate": "2025-01-23T18:00:00.756000-05:00",
            "Enabled": true,
            "Description": "",
            "KeyUsage": "ENCRYPT_DECRYPT",
            "KeyState": "Enabled",
            "Origin": "AWS_KMS",
            "KeyManager": "CUSTOMER",
            "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
            "KeySpec": "SYMMETRIC_DEFAULT",
            "EncryptionAlgorithms": [
                "SYMMETRIC_DEFAULT"
            ],
            "MultiRegion": false
        }
    }

    Take note of the KeyID and the ARN of the key. You can use it to create an alias for the newly created key:

    KEY_ID=<NOTED_KEY_ID_FROM_PREVIOUS_STEP>
    aws kms create-alias --region $AWS_REGION —-alias-name alias/secretsmanager-cross —-target-key-id $KEY_ID

  2. Create a new secret in Secrets Manager, using the new KMS key to encrypt it:
    aws secretsmanager create-secret --region $AWS_REGION \
    --name $SECRET_NAME_CROSS \
    --tags Key=kubernetes-namespace,Value=$NAMESPACE Key=eks-cluster-name,Value=$CLUSTER_NAME \
    --secret-string "This is a Cross Account Secret" \
    --kms-key-id $KEY_ID

    You should see this expected output:

    {
    "ARN": "arn:aws:secretsmanager:$AWS_REGION:$ACCOUNT_B:secret:secret-b-12345",
    "Name": "secret-b",
    "VersionId": "abcdefgh-1234-5678-ijklmnopqrst"
    }

    Note the ARN of the new secret. You will use it in the next step.

  3. Add a resource policy that allows the IAM role on Account A to access the newly created secret:
    SECRET_CROSS_ARN=< NOTED_SECRET_CROSS_ARN_FROM_PREVIOUS_STEP>
    cat << EOF > resource-policy.json
    
    {
      "Version" : "2012-10-17",
      "Statement" : [ {
        "Effect" : "Allow",
        "Principal" : {
          "AWS" : "arn:aws:iam::${ACCOUNT_A}:root"
        },
        "Action" : [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ],
        "Resource" : "$SECRET_CROSS_ARN"
        } 
      ]
    }
    
    EOF
    aws secretsmanager put-resource-policy --secret-id $SECRET_NAME_CROSS --resource-policy file://resource-policy.json

Now let’s go back to Account A.

On Account A

  1. Create a new IAM role and trust policy with the required permissions to retrieve the newly created secret within Account B:
    KEY_ARN=< NOTED_KEY_ARN_FROM_PREVIOUS_STEP>
    cat << EOF > cross-policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": ["secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret"],
                "Resource": ["$SECRET_CROSS_ARN"],
                "Condition": {
                    "StringEquals": {
                        "secretsmanager:ResourceTag/kubernetes-namespace": "\${aws:PrincipalTag/kubernetes-namespace}",
                        "secretsmanager:ResourceTag/eks-cluster-name": "\${aws:PrincipalTag/eks-cluster-name}"
                    }
                }
            },
            {
                "Effect": "Allow",
                "Action": [
                    "kms:Decrypt",
                    "kms:DescribeKey"
                    ],
                "Resource": "$KEY_ARN"
            }
        ]
    }
    EOF

    In the preceding example IAM role permission policy, note that the resource ARN is pointing to the secret created on Account B.

    cat << EOF > trust.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {  
                "Effect": "Allow",
                "Principal": {
                    "Service": "pods.eks.amazonaws.com" 
                },
                "Action": [
                    "sts:AssumeRole",
                    "sts:TagSession"
                ]
            }
        ]
    }
    EOF

    The IAM role trust policy needs to have pods.eks.amazonaws.com as a trusted entity to perform the sts:AssumeRole and sts:TagSession actions.

    Next, create the role and apply the policy:

    aws iam create-role --role-name ascp-podidentity-cross --assume-role-policy-document file://trust.json
    aws iam put-role-policy --role-name ascp-podidentity-cross --policy-name ascp-podidentity-cross --policy-document file://cross-policy.json

    Note the ARN of the new role. You will use it in the next step.

  2. Create the second Kubernetes ServiceAccount and add the cross-account Pod Identity association:
    kubectl create serviceaccount serviceaccount-b
    
    ROLE_CROSS_ARN=<NOTED_ROLE_CROSS_ARN_FROM_PREVIOUS_STEP>
    aws eks create-pod-identity-association \
    --cluster-name "$CLUSTER_NAME" \
    --namespace "default" \
    --service-account serviceaccount-b \
    --role-arn $ROLE_CROSS_ARN

  3. Create a SecretProviderClass to use the cross-account secret created in Account B in your Amazon EKS cluster:
    cat << EOF | kubectl apply -f -
    
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aws-secrets-manager-cross
    spec:
      provider: aws
      parameters:
        objects: |
          - objectName: "$SECRET_CROSS_ARN" # Full ARN of the Secret in the ACCOUNT B to be mounted on Pod
            objectType: "secretsmanager"
        usePodIdentity: "true" # Indicator to use Pod Identity instead of IRSA
        
    EOF

  4. Create a new deployment to consume your newly created secret using Pod Identity as a mounted volume:
    cat << EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: application-b
      name: application-b
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: application-b
      template:
        metadata:
          labels:
            app: application-b
        spec:
          containers:
          - image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
            name: amazonlinux
            args:
            - infinity
            command:
            - sleep
     volumeMounts:
     - name: secrets-store-cross
     mountPath: "/mnt/secret" # Directory where secret will be mounted to readOnly: true
     volumes:
     - name: secrets-store-cross
     csi:
     driver: secrets-store.csi.k8s.io
     readOnly: true
     volumeAttributes:
     secretProviderClass: "aws-secrets-manager-cross" # Match SecretProviderClass name created for cross-account access serviceAccountName: serviceaccount-b # Specify service account created for cross-account access
    
    EOF

  5. Validate that the deployment was created successfully and confirm the mounted secret:
    kubectl get pods -l app=application-b
    kubectl exec -it $(kubectl get pods -l app=application-b -o name) -- cat /mnt/secret/$SECRET_CROSS_ARN

    Note that the volume name is the secret ARN, because it’s a cross-account secret.

    You should see this expected output:

    NAME READY STATUS RESTARTS AGE
    application-b-67b755444f-ngrhv 1/1 Running 0 8s
    
    "This is a Cross Account Secret"%

Conclusion

The integration of ASCP with Pod Identity marks a significant step forward in secrets management for Amazon EKS. It offers enhanced security, simplified configuration, and improved operations. We encourage all EKS users to explore this new integration and take advantage of its benefits.

The integration of ASCP with Pod Identity offers these benefits over IRSA:

  1. Simplified setup: With Pod Identity, you don’t need to create and manage service accounts for each application.
  2. Enhanced security: Pod Identity provides more granular control over permissions at the Pod level.
  3. Improved scalability: Pod Identity is easier to implement in large-scale environments.
  4. Consistent AWS experience: Pod Identity aligns more closely with AWS best practices for IAM management.

For more information, see our documentation for: AWS Secrets Manager, AWS Secrets CSI Store Provider (ASCP), and Amazon EKS Pod Identity.

 
If you have feedback about this post, submit comments in the Comments section below. If you have questions about this post, contact AWS Support.
 

Rodrigo Bersa
Rodrigo Bersa

Rodrigo is a Senior Specialist Solutions Architect for Containers and AppMod, with a focus on security and infrastructure-as-code automation. In this role, Rodrigo aims to help customers achieve their business goals by leveraging best practices for AWS container services when building new environments or migrating existing technologies.
Akshay Aggarwal
Akshay Aggarwal

Akshay is a Senior Technical Product Manager on the AWS Secrets Manager team. As part of the AWS Cryptography team, Akshay drives technologies and defines best practices that help improve customers’ experiences of building secure, reliable workloads in the AWS Cloud. Akshay is passionate about building technologies that are easy to use, secure, and scalable.
Stephanie Shen
Stephanie Shen

Stephanie Shen is a Software Development Engineer at Amazon Web Services (AWS), working on the AWS Security Services team. She has over 8 years of experience, previously working as a Product Manager. Stephanie aims to help customers improve their security posture by enhancing the features on AWS security services.

AWS Weekly Roundup: AWS Step Functions, AWS CloudFormation, Amazon Q Developer, and more (February 10, 2024)

Post Syndicated from Matheus Guimaraes original https://aws.amazon.com/blogs/aws/aws-weekly-roundup-aws-step-functions-aws-cloudformation-amazon-q-developer-and-more-february-10-2024/

We are well settled into 2025 by now, but many people are still catching up with all the exciting new releases and announcements that came out of re:Invent last year. There have been hundreds of re:Invent recap events around the world since the beginning of the year, including in-person all-day official AWS events with multiple tracks to help you discover and dive deeper into the releases you care about, as well as community and virtual events.

Last month, I was lucky to be a co-host for AWS EMEA re:Invent re:Cap which was a nearly 4-hour livestream with experts featuring demos, whiteboard sessions, and a live Q&A. The good news is that you can now watch it on-demand! We had a great team and thousands of people enjoyed learning through the virtual experience. I recommend you check it out or share it with colleagues who have not been able to attend any re:Invent re:Cap events.

The Korean team also did an amazing job hosting their own virtual re:Invent re:Cap event, and it’s also now available on-demand. So if you speak Korean I do recommend you check it out.

If you’re more of a reader, then we have a treat for you. You can download the full official re:Invent re:Cap deck with all the slides covering releases across all areas by visiting community.aws! While there, you can also check all the upcoming in-person re:Invent re:Cap community events remaining across the globe for a chance to still attend one of those in a city near you.

But as we know, new releases, announcements, and updates don’t stop at re:Invent. Every week there are even more, and this is why we have this Weekly Roundup series that you can read every Monday to get the AWS news highlights from the week before.

So here’s what caught my attention last week.

Last week’s AWS Launches
If you use AWS Step Functions you may be interested in these:

Amazon Q Developer also got a couple of updates:

Here are some other releases that caught my attention this week from a variety of other AWS services:

AWS CloudFormation introduces stack refactoring – You can now split your CloudFormation stacks, move resources from one stack to another, and change the logical name of resources within the same stack. This adds a lot of flexibility enabling you to keep up with changes within your organization and architectures, such as streamlining resource lifecycle management for existing stacks, keeping up with naming convention changes, and other cases. You can refactor your stacks by using the AWS command line interface (CLI) or AWS SDK.

AWS Config now supports 4 new release typesAWS Config is great for monitoring resources across your AWS environment and help you towards ensuring alignment with your company and security policies as well as compliance requirements. It now has four new types of resources enabling you to monitor Amazon VPC block public access settings, any exceptions made within those settings, as well as monitor S3 Express One Zone bucket policies and directory bucket settings.

Automated recovery of Microsoft SQL Server on EC2 instan ces with VSS – You can now use a new feature called Volume Shadow Copy Services (VSS) to backup Microsoft SQL Server databases to Amazon Elastic Block Store (EBS) snapshots while the database is running. You can then use AWS Systems Manager Automation Runbook to set a recovery point of time of your preference and it will restore the database automatically from your VSS-based EBS snapshot without incurring any downtime.

Other updates
Upcoming changes to the AWS Security Token Service (AWS STS) global endpoint – To help improve the resiliency and performance of your applications, we are making changes to the AWS STS global endpoint (https://sts.amazonaws.com), with no action required from customers. Starting in early 2025, requests to the STS global endpoint will be automatically served in the same Region as your AWS deployed workloads. For example, if your application calls sts.amazonaws.com from the US West (Oregon) Region, your calls will be served locally in the US West (Oregon) Region instead of being served by the US East (N. Virginia) Region. These changes will be released in the coming weeks and we will gradually roll it out to AWS Regions that are enabled by default by mid-2025.

Upcoming AWS and community events

AWS Public Sector Day London, February 27 — Join public sector leaders and innovators to explore how AWS is enabling digital transformation in government, education, and healthcare.

AWS Innovate GenAI + Data Edition — A free online conference focusing on generative AI and data innovations. Available in multiple Regions: APJC and EMEA (March 6), North America (March 13), Greater China Region (March 14), and Latin America (April 8).

Browse more upcoming AWS led in-person and virtual developer-focused events.

Looking for some reading recommendations? At the beginning of every year Dr. Werner Vogles, VP and CTO of Amazon, publishes a list of recommended books that he believes should have your attention. This year’s list is looking particularly good in my opinion!

That’s it for this week! For a full list of AWS announcements, be sure to keep an eye on the What’s New with AWS page.

See you next time 🙂

Matheus Guimaraes | @codingmatheus

Amazon Redshift Serverless adds higher base capacity of up to 1024 RPUs

Post Syndicated from Ricardo Serafim original https://aws.amazon.com/blogs/big-data/amazon-redshift-serverless-adds-higher-base-capacity-of-up-to-1024-rpus/

In the rapidly evolving world of data and analytics, organizations are constantly seeking new ways to optimize their data infrastructure and unlock valuable insights. Amazon Redshift is changing the game for thousands of businesses every day by making analytics straightforward and more impactful. Fully managed, AI powered, and using parallel processing, Amazon Redshift helps companies uncover insights faster than ever. Whether you’re a small startup or a big player, Amazon Redshift helps you make smart decisions quickly and with the best price-performance at scale. Amazon Redshift Serverless is a pay-per-use serverless data warehousing service that eliminates the need for manual cluster provisioning and management. This approach is a game changer for organizations of all sizes with predictable or unpredictable workloads.

The key innovation of Redshift Serverless is its ability to automatically scale compute up or down based on your workload demands, maintaining optimal performance and cost-efficiency without manual intervention. Redshift Serverless allows you to specify the base data warehouse capacity the service uses to handle your queries for a steady level of performance on a well-known workload or use a price-performance target (AI-driven scaling and optimization), better suited in scenarios with fluctuating demands, optimizing costs while maintaining performance. The base capacity is measured in Redshift Processing Units (RPUs), where one RPU provides 16 GB of memory. Redshift Serverless defaults to a robust 128 RPUs, capable of analyzing petabytes of data, allowing you to scale up for more power or down for cost optimization, making sure that your data warehouse is optimally sized for your unique needs. By setting a higher base capacity, you can improve the overall performance of your queries, especially for data processing jobs that tend to consume a lot of compute resources. The more RPUs you allocate as the base capacity, the more memory and processing power Redshift Serverless will have available to tackle your most demanding workloads. This setting gives you the flexibility to optimize Redshift Serverless for your specific needs. If you have a lot of complex, resource-intensive queries, increasing the base capacity can help make sure those queries are executed efficiently, with little to no bottlenecks or delays.

In this post, we explore the new higher base capacity of 1024 RPUs in Redshift Serverless, which doubles the previous maximum of 512 RPUs. This enhancement empowers you to get high performance for your workload containing highly complex queries and write-intensive workloads, with concurrent data ingestion and transformation tasks that require high throughput and low latency with Redshift Serverless. Redshift Serverless also offers scale up to 10 times the base capacity. The focus is on helping you find the right balance between performance and cost to meet your organization’s unique data warehousing needs. By adjusting the base capacity, you can fine-tune Redshift Serverless to deliver the perfect combination of speed and efficiency for your workloads.

The need for 1024 RPUs

Data warehousing workloads are increasingly demanding high-performance computing resources to meet the challenges of modern data processing requirements. The need for 1024 RPUs is driven by several key factors. First, many data warehousing use cases involve processing petabyte-sized historical datasets, whether for initial data loading or periodic reprocessing and querying. This is particularly prevalent in industries like healthcare, financial services, manufacturing, retail, and engineering, where third-party data sources can deliver petabytes of information that must be ingested in a timely manner. Additionally, the seasonal nature of many business processes, such as month-end or quarter-end reporting, creates periodic spikes in computational needs that require substantial scalable resources.

The complexity of the queries and analytics run against data warehouses has also grown exponentially, with many workloads now scanning and processing multi-petabyte datasets. This level of complex data processing requires substantial memory and parallel processing capabilities that can be effectively provided by a 1024 RPU configuration. Furthermore, the increasing integration of data warehouses with data lakes and other distributed data sources adds to the overall computational burden, necessitating high-performing, scalable solutions.

Also, many data warehousing environments are characterized by heavy write-intensive workloads, with concurrent data ingestion and transformation tasks that require a high-throughput, low-latency processing architecture. For workloads requiring access to extremely large volumes of data with complex joins, aggregations, and numerous columns that necessitate substantial memory usage, the 1024 RPU configuration can deliver the necessary performance to help meet demanding service level agreements (SLAs) and provide timely data availability for downstream business intelligence and decision-making processes. And for the control of costs, we can set the maximum capacity (on the Limits tab at the workgroup configuration) to cap the usage of resources to a maximum. The following screenshot shows an example.

MaxCapacity

During the tests discussed later in this post, we compare using maximum capacity of 1024 RPUs vs. 512 RPUs.

When to consider using 1024 RPUs

Consider using 1024 RPUs in the following scenarios:

  • Complex and long-running queries – Large warehouses provide the compute power needed to process complex queries that involve multiple joins, aggregations, and calculations. For workloads analyzing terabytes or petabytes of data, the 1024 RPU capacity can significantly improve query completion times.
  • Data lake queries scanning large datasets – Queries that scan extensive data in external data lakes benefit from the additional compute resources. This provides faster processing and reduced latency, even for large-scale analytics.
  • High-memory queries – Queries requiring substantial memory—such as those with many columns, large intermediate results, or temporary tables—perform better with the increased capacity of a larger warehouse.
  • Accelerated data loading – Large capacity warehouses improve the performance of data ingestion tasks, such as loading massive datasets into the data warehouse. This is particularly beneficial for workloads involving frequent or high-volume data loads.
  • Performance-critical use cases – For applications or systems that demand low latency and high responsiveness, a 1024 RPU warehouse provides smooth operation by allocating sufficient compute resources to handle peak loads efficiently.

Balancing performance and cost

Choosing the right warehouse size requires evaluating your workload’s complexity and performance requirements. A larger warehouse size, such as 1024 RPUs, excels at handling computationally intensive tasks but should be balanced against cost-effectiveness. Consider testing your workload on different base capacities or using the Redshift Serverless price-performance slider to find the optimal setting.

When to avoid larger base capacity

Although larger warehouses offer powerful performance benefits, they might not always be the most cost-effective solution. Consider the following scenarios where a smaller base capacity might be more suitable:

  • Basic or small queries – Simple queries that process small datasets or involve minimal computation don’t require the high capacity of a 1024 RPU warehouse. In such cases, smaller warehouses can handle the workload effectively, avoiding unnecessary costs.
  • Cost-sensitive workloads – For workloads with predictable and moderate complexity, a smaller warehouse can deliver sufficient performance while keeping costs under control. Selecting a larger capacity might lead to overspending without proportional performance gains.

Comparison and cost-effectiveness

The previous maximum of 512 RPUs should suffice for most use cases, but there can be situations that need more. At 512 RPUs, you get 8 TB of memory on your workgroup; with 1024 RPU, it’s doubled to 16 TB. Consider a scenario where you are ingesting large volumes of data with the COPY command and there are healthcare datasets that go into the 30 TB (or more) range.

To illustrate, we ingested the TPC-H 30TB datasets available at AWS Labs Github repository amazon-redshift-utils on the 512 RPU workgroup and the 1024 RPU workgroup.

The following graph provides detailed runtimes. We see an overall 44% performance improvement on 1024 RPUs vs. 512 RPUs. You will notice that the larger ingestion workloads show a greater performance improvement.

Ingestion

The cost for running 6,809 seconds at 512 RPUs in the US East (Ohio) AWS Region at $0.36 per RPU-hour is calculated as 6809 * 512 * 0.36 / 60 / 60 = $348.62.

The cost for running 3,811 seconds at 1024 RPUs in the US East (Ohio) Region at $0.36 per RPU-hour is calculated as 3811 * 1024 * 0.36 / 60 / 60 = $390.25.

1024 RPUs is able to ingest the 30 TB of data 44% faster at a 12% higher cost compared to 512 RPUs.

Next, we ran the 22 TPC-H queries available at AWS Samples Github repository redshift-benchmarks on the same two workgroups to compare query performance.

The following graph provides detailed runtimes for each of the 22 TPC-H queries. We see an overall 17% performance improvement on 1024 RPUs vs. 512 RPUs for a single session sequential query execution, even though performance improved for some and deteriorated for others.

Queries

When running 20 sessions concurrently, we see 62% performance improvement, from 6,903 seconds on 512 RPUs down to 2,592 seconds on 1024 RPUs, with each concurrent session running the 22 TPC-H queries in a different order.

Notice the stark difference in performance improvement seen for concurrent execution (62%) vs. serial execution (17%). The concurrent executions represent a typical production system where multiple concurrent sessions are running queries against the database. It’s important to base your proof of concept decisions on production-like scenarios with concurrent executions, and not only on sequential executions, which typically come from a single user running the proof of concept. The following table compares both tests.

512 RPU 1024 RPU
Sequential (seconds) 1276 1065
Concurrent executions (seconds) 6903 2592
Total (seconds) 8179 3657
Total ($) $418.76 $374.48

The total ($) is calculated by seconds * RPUs * 0.36 / 60 / 60.

1024 RPUs are able to run the TPC-H queries against 30 TB benchmark data 55% faster, and at 11% lower cost compared to 512 RPUs.

Amazon Redshift offers system metadata views and system views, which are useful for tracking resource utilization. We analyzed additional metrics from the sys_query_history and sys_query_detail tables to identify which specific parts of query execution experienced performance improvements or declines. Notice that 1024 RPUs with 16 TB of memory is able to hold a larger number of data blocks in-memory, thereby needing to fetch 35% fewer SSD blocks compared to 512 RPUs with 8 TB of memory. It is able to run the larger workloads better by needing to fetch remote Amazon S3 blocks 71% less compared to 512 RPUs. Finally, local disk spill to SSD (when a query can’t be allocated more memory) was reduced by 63% and remote disk spill to S3 (when the SSD cache is fully occupied) was completely eliminated on 1024 RPUs compared to 512 RPUs.

Metric Improvement (percentage)
Elapsed time 60%
Queue time 23%
Runtime 59%
Compile time -8%
Planning time 64%
Lockwait time -31%
Local SSD blocks read 35%
Remote S3 blocks read 71%
Local disk spill to SSD 63%
Remote disk spill to S3 100%

The following are some run characteristic graphs captured from the Amazon Redshift console. To find these, choose Query and database monitoring and Resource monitoring under Monitoring in the navigation pane.

Thanks to the performance enhancement, queries completed sooner with 1024 RPUs than with 512 RPUs, resulting on connections ending faster.

The following graph illustrates the database connection with 512 RPUs.

Database Connections - 512 RPUs

The following graph illustrates the database connection with 1024 RPUs.

Database Connections - 1024 RPUs

Regarding query classification, there are three categories: short queries (less than 10 seconds), medium queries (10 seconds to 10 minutes), and long queries (more than 10 minutes). We observed that due to performance improvements, the 1024 RPU configuration resulted in fewer long queries compared to the 512 RPU configuration.

The following graph illustrates the queries duration with 512 RPUs.Duration of Queries (512 RPUs)

The following graph illustrates the queries duration with 1024 RPUs.

Duration of Queries (1024 RPUs)

Due to the better performance, we noticed that the number of queries handled per second is higher on 1024 RPUs.

The following graph illustrates the queries completed per second with 512 RPUs.

Queries Per Second (512 RPUs)

The following graph illustrates the queries completed per second with 1024 RPUs.

Queries Per Second (1024 RPUs)

In the following graphs, we see that although the number of queries running looks similar, the 1024 RPU endpoint ends the queries faster, which means a smaller window to run the same number of queries.

The following graph illustrates the queries running with 512 RPUs.

Queries running (512 RPUs)

The following graph illustrates the queries running with 1024 RPUs.

Queries running (1024 RPUs)

There was no queuing when we compared both tests.

The following graph illustrates the queries queued with 512 RPUs.

Queries queued (512 RPUs)

The following graph illustrates the queries queued with 1024 RPUs.

Queries queued (1024 RPUs)

The following graph illustrates the query runtime breakdown with 512 RPUs.

Query Breakdown (512 RPUs)

The following graph illustrates the query runtime breakdown with 1024 RPUs.

Query Breakdown (1024 RPUs)

Queuing was largely avoided due to the automatic scaling feature offered by Redshift Serverless. By dynamically adding more resources, we can keep queries running and match the expected performance levels, even during usage peaks. You are able to set a maximum capacity to help prevent automatic scaling from exceeding your desired resource limits.

The following graph illustrates workgroup scaling with 512 RPUs. Redshift Serverless automatically scaled to 2x/1024 RPUs and peaked at 2.5x/1280 RPUs.

Workgroup Scaling With 512 RPUs

The following graph illustrates workgroup scaling with 1024 RPUs. Redshift Serverless automatically scaled to 2x/2048 RPUs and peaked at 3x/3072 RPUs.

Workgroup Scaling With 1024 RPUs

The following graph illustrates compute consumed with 512 RPUs.

Compute Consumed - 512 RPUs

The following graph illustrates compute consumed with 1024 RPUs.

Compute Consumed - 1024 RPUs

Conclusion

The introduction of the 1024 RPUs capacity for Redshift Serverless marks a significant advancement in data warehousing capabilities, offering substantial benefits for organizations handling large-scale, complex data processing tasks. Redshift Serverless ingestion scan scales up the ingestion performance with higher capacity. As evidenced by the benchmark tests in this post using the TPC-H dataset, this higher base capacity not only accelerates processing times, but can also prove more cost-effective for workloads as described in this post, demonstrating improvements such as 44% faster data ingestion, 62% better performance in concurrent query execution, and overall cost savings of 11% for combined workloads.

Given these impressive results, it’s crucial for organizations to evaluate their current data warehousing needs and consider running a proof of concept with the 1024 RPU configuration. Analyze your workload patterns using the Amazon Redshift monitoring tools, optimize your configurations accordingly, and don’t hesitate to engage with AWS experts for personalized advice. If your company is covered by an account team, ask them for a meeting. If not, post your analysis and question to the Re:Post forum.

By taking these steps and staying informed about future developments, you can make sure that your organization fully takes advantage of Redshift Serverless, potentially unlocking new levels of performance and cost-efficiency in your data warehousing operations.


About the authors

Ricardo Serafim is a Senior Analytics Specialist Solutions Architect at AWS.

Harshida Patel is a Analytics Specialist Principal Solutions Architect, with AWS.

Milind Oke is a Data Warehouse Specialist Solutions Architect based out of New York. He has been building data warehouse solutions for over 15 years and specializes in Amazon Redshift.

[$] Maintainer opinions on Rust-for-Linux

Post Syndicated from daroc original https://lwn.net/Articles/1007921/

Miguel Ojeda gave

a keynote
at

FOSDEM 2025
about the history of the

Rust-for-Linux

project, and the current attitude of people in the kernel community toward the
experiment. Unlike his

usual talks
, this talk didn’t focus so much on the current
state of the project, but rather on discussing history
and predictions for the future. He ended up presenting quotes from more than 30
people involved in kernel development about what they thought of the project and
expected going forward.

Arti 1.4.0 released

Post Syndicated from jzb original https://lwn.net/Articles/1008866/

Version
1.4.0
of Arti, the Tor Project’s next-generation
Tor client written in Rust, has been released. Notable improvements in
this release include a new RPC
interface
, and preparatory work toward service-side onion service
denial-of-service resistance. The release is dedicated to the memory of Jérémy Bobbio,
better known by many as “Lunar”. For full details on the release, see
the changelog.

Security updates for Monday

Post Syndicated from jake original https://lwn.net/Articles/1008829/

Security updates have been issued by AlmaLinux (buildah, bzip2, galera and mariadb, keepalived, kernel, kernel-rt, mariadb:10.11, mingw-glib2, and podman), Debian (ark, firefox-esr, kernel, sssd, and thunderbird), Fedora (abseil-cpp, clevis-pin-tpm2, dbus-parsec, envision, fido-device-onboard, firefox, golang-github-nvidia-container-toolkit, gotify-desktop, jpegxl, keylime-agent-rust, keyring-ima-signer, libkrun, php-phpseclib, python-cryptography, python3-docs, python3.12, python3.13, rust-afterburn, rust-cargo-vendor-filterer, rust-coreos-installer, rust-crypto-auditing-agent, rust-eif_build, rust-gst-plugin-reqwest, rust-nu, rust-oo7-cli, rust-openssl, rust-openssl-sys, rust-pore, rust-routinator, rust-rpm-sequoia, rust-sequoia-keyring-linter, rust-sequoia-octopus-librnp, rust-sequoia-policy-config, rust-sequoia-sop, rust-sequoia-sq, rust-sequoia-sqv, rust-sevctl, rust-snphost, rust-tealdeer, rustup, s390utils, stalld, and vaultwarden), Mageia (java-1.8.0-openjdk, java-11-openjdk, java-17-openjdk & java-latest-openjdk, libtasn1, mariadb, nodejs, qtbase5 & qtbase6, rootcerts, nss & firefox, thunderbird, and xrdp), Red Hat (buildah, doxygen, podman, and thunderbird), Slackware (gnutls and openssl), SUSE (bind, chromedriver, crypto-policies, krb5, firefox, flannel, go1.22, go1.23, go1.23-1.23.6-1.1, go1.24-1.24rc3-1.1, openssl-1_1, openssl-3, python311-cryptography-vectors, python311-numba, python39, rsync, tomcat, and trivy), and Ubuntu (openrefine and rsync).

Interning at Rapid7 Prague: Meet Mko

Post Syndicated from Rapid7 original https://blog.rapid7.com/2025/02/10/interning-at-rapid7-prague-meet-mko/

Interning at Rapid7 Prague: Meet Mko

Mkrtich Hovsepyan – most people call him Mko –  is an intern at Rapid7’s fast-growing office in Prague. He graduated from the luminous Charles University in Prague, and is currently a first-year master’s student in Artificial Intelligence there. He was in our first impressive crop of interns, and is sharing his experience as we gear up for our next wave of intern hiring.

How would you summarize your internship with Rapid7?

My internship as a Data Engineering Intern at Rapid7 was an enriching experience where I learned about the processes and pipelines of how data is processed and later utilized for Business Analytics and other spheres. Many people think data engineering is just about knowing SQL, but for me, SQL was only a small part of the role. I worked on projects that . allowed me to develop my skills in creating ETL processes and other data workflows. Most importantly, I honed my soft skills, and it was easy to do so because the team and management were very supportive.

What advice would you give your past self before starting your internship?

My advice would be to communicate with as many people as possible. Since your team might be working from different parts of the globe, it can become a bit challenging to connect when you don’t have common lunches or in-person meetings. Rapid7 offers opportunities like Insight Coffees to meet different kinds of people and enhance communication. Also, a friendly tip: try not to merge PRs on a Friday!

What support have you been given while at Rapid7?

I really liked that I was seen as someone worth investing in for the future. This meant my team let me try things on my own, giving me the chance to succeed and also to fail sometimes (and yes, there were a few “interesting surprises” along the way!). They knew that making mistakes is one of the best ways to learn and get better. I’m thankful to my teammates who spent a lot of time explaining the basic processes to me.

What has been your favorite experience while at Rapid7?

We were celebrating the first anniversary of the Rapid7 office in Prague, and there was a fun challenge to gather nine signatures from nine different people. The interesting part was that each person had specific characteristics you had to find – like someone working in a specific team, someone with a sticker on their laptop, or even someone whose shoe size is a prime number! It was a great way to meet new colleagues across different teams.

How would you summarize the culture in 3 words?

Open-Minded, Innovative, Transparent.

At Rapid7, we’re working to create a secure digital world for our customers, our industry, and our communities. We give organizations command of their attack surface with the most adaptive, predictive, and responsive cybersecurity platform – and meaningful, impactful partnership.

The Rapid7 office in Prauge opened in October 2023, and has quickly grown to support all areas of our business. Learn more and browse our latest job openings here: https://careers.rapid7.com/rapid7-in-prague

QUIC action: patching a broadcast address amplification vulnerability

Post Syndicated from Josephine Chow original https://blog.cloudflare.com/mitigating-broadcast-address-attack/

Cloudflare was recently contacted by a group of anonymous security researchers who discovered a broadcast amplification vulnerability through their QUIC Internet measurement research. Our team collaborated with these researchers through our Public Bug Bounty program, and worked to fully patch a dangerous vulnerability that affected our infrastructure.

Since being notified about the vulnerability, we’ve implemented a mitigation to help secure our infrastructure. According to our analysis, we have fully patched this vulnerability and the amplification vector no longer exists. 

Summary of the amplification attack

QUIC is an Internet transport protocol that is encrypted by default. It offers equivalent features to TCP (Transmission Control Protocol) and TLS (Transport Layer Security), while using a shorter handshake sequence that helps reduce connection establishment times. QUIC runs over UDP (User Datagram Protocol).

The researchers found that a single client QUIC Initial packet targeting a broadcast IP destination address could trigger a large response of initial packets. This manifested as both a server CPU amplification attack and a reflection amplification attack.

Transport and security handshakes

When using TCP and TLS there are two handshake interactions. First, is the TCP 3-way transport handshake. A client sends a SYN packet to a server, it responds with a SYN-ACK to the client, and the client responds with an ACK. This process validates the client IP address. Second, is the TLS security handshake. A client sends a ClientHello to a server, it carries out some cryptographic operations and responds with a ServerHello containing a server certificate. The client verifies the certificate, confirms the handshake and sends application traffic such as an HTTP request.

QUIC follows a similar process, however the sequence is shorter because the transport and security handshake is combined. A client sends an Initial packet containing a ClientHello to a server, it carries out some cryptographic operations and responds with an Initial packet containing a ServerHello with a server certificate. The client verifies the certificate and then sends application data.


The QUIC handshake does not require client IP address validation before starting the security handshake. This means there is a risk that an attacker could spoof a client IP and cause a server to do cryptographic work and send data to a target victim IP (aka a reflection attack). RFC 9000 is careful to describe the risks this poses and provides mechanisms to reduce them (for example, see Sections 8 and 9.3.1). Until a client address is verified, a server employs an anti-amplification limit, sending a maximum of 3x as many bytes as it has received. Furthermore, a server can initiate address validation before engaging in the cryptographic handshake by responding with a Retry packet. The retry mechanism, however, adds an additional round-trip to the QUIC handshake sequence, negating some of its benefits compared to TCP. Real-world QUIC deployments use a range of strategies and heuristics to detect traffic loads and enable different mitigations.

In order to understand how the researchers triggered an amplification attack despite these QUIC guardrails, we first need to dive into how IP broadcast works.

Broadcast addresses

In Internet Protocol version 4 (IPv4) addressing, the final address in any given subnet is a special broadcast IP address used to send packets to every node within the IP address range. Every node that is within the same subnet receives any packet that is sent to the broadcast address, enabling one sender to send a message that can be “heard” by potentially hundreds of adjacent nodes. This behavior is enabled by default in most network-connected systems and is critical for discovery of devices within the same IPv4 network.


The broadcast address by nature poses a risk of DDoS amplification; for every one packet sent, hundreds of nodes have to process the traffic. 

Dealing with the expected broadcast

To combat the risk posed by broadcast addresses, by default most routers reject packets originating from outside their IP subnet which are targeted at the broadcast address of networks for which they are locally connected. Broadcast packets are only allowed to be forwarded within the same IP subnet, preventing attacks from the Internet from targeting servers across the world.


The same techniques are not generally applied when a given router is not directly connected to a given subnet. So long as an address is not locally treated as a broadcast address, Border Gateway Protocol (BGP) or other routing protocols will continue to route traffic from external IPs toward the last IPv4 address in a subnet. Essentially, this means a “broadcast address” is only relevant within a local scope of routers and hosts connected together via Ethernet. To routers and hosts across the Internet, a broadcast IP address is routed in the same way as any other IP.

Binding IP address ranges to hosts

Each Cloudflare server is expected to be capable of serving content from every website on the Cloudflare network. Because our network utilizes Anycast routing, each server necessarily needs to be listening on (and capable of returning traffic from) every Anycast IP address in use on our network.

To do so, we take advantage of the loopback interface on each server. Unlike a physical network interface, all IP addresses within a given IP address range are made available to the host (and will be processed locally by the kernel) when bound to the loopback interface.

The mechanism by which this works is straightforward. In a traditional routing environment, longest prefix matching is employed to select a route. Under longest prefix matching, routes towards more specific blocks of IP addresses (such as 192.0.2.96/29, a range of 8 addresses) will be selected over routes to less specific blocks of IP addresses (such as 192.0.2.0/24, a range of 256 addresses).

While Linux utilizes longest prefix matching, it consults an additional step — the Routing Policy Database (RPDB) — before immediately searching for a match. The RPDB contains a list of routing tables which can contain routing information and their individual priorities. The default RPDB looks like this:

$ ip rule show
0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default

Linux will consult each routing table in ascending numerical order to try and find a matching route. Once one is found, the search is terminated and the route immediately used.

If you’ve previously worked with routing rules on Linux, you are likely familiar with the contents of the main table. Contrary to the existence of the table named “default”, “main” generally functions as the default lookup table. It is also the one which contains what we traditionally associate with route table information:

$ ip route show table main
default via 192.0.2.1 dev eth0 onlink
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.2

This is, however, not the first routing table that will be consulted for a given lookup. Instead, that task falls to the local table:

$ ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 192.0.2.2 dev eth0 proto kernel scope host src 192.0.2.2
broadcast 192.0.2.255 dev eth0 proto kernel scope link src 192.0.2.2

Looking at the table, we see two new types of routes — local and broadcast. As their names would suggest, these routes dictate two distinctly different functions: routes that are handled locally and routes that will result in a packet being broadcast. Local routes provide the desired functionality — any prefix with a local route will have all IP addresses in the range processed by the kernel. Broadcast routes will result in a packet being broadcast to all IP addresses within the given range. Both types of routes are added automatically when an IP address is bound to an interface (and, when a range is bound to the loopback (lo) interface, the range itself will be added as a local route).

Vulnerability discovery

Deployments of QUIC are highly dependent on the load-balancing and packet forwarding infrastructure that they sit on top of. Although QUIC’s RFCs describe risks and mitigations, there can still be attack vectors depending on the nature of server deployments. The reporting researchers studied QUIC deployments across the Internet and discovered that sending a QUIC Initial packet to one of Cloudflare’s broadcast addresses triggered a flood of responses. The aggregate amount of response data exceeded the RFC’s 3x amplification limit.

Taking a look at the local routing table of an example Cloudflare system, we see a potential culprit:

$ ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 192.0.2.2 dev eth0 proto kernel scope host src 192.0.2.2
broadcast 192.0.2.255 dev eth0 proto kernel scope link src 192.0.2.2
local 203.0.113.0 dev lo proto kernel scope host src 203.0.113.0
local 203.0.113.0/24 dev lo proto kernel scope host src 203.0.113.0
broadcast 203.0.113.255 dev lo proto kernel scope link src 203.0.113.0

On this example system, the anycast prefix 203.0.113.0/24 has been bound to the loopback interface (lo) through the use of standard tooling. Acting dutifully under the standards of IPv4, the tooling has assigned both special types of routes — a local one for the IP range itself and a broadcast one for the final address in the range — to the interface.

While traffic to the broadcast address of our router’s directly connected subnet is filtered as expected, broadcast traffic targeting our routed anycast prefixes still arrives at our servers themselves. Normally, broadcast traffic arriving at the loopback interface does little to cause problems. Services bound to a specific port across an entire range will receive data sent to the broadcast address and continue as normal. Unfortunately, this relatively simple trait breaks down when normal expectations are broken.

Cloudflare’s frontend consists of several worker processes, each of which independently binds to the entire anycast range on UDP port 443. In order to enable multiple processes to bind to the same port, we use the SO_REUSEPORT socket option. While SO_REUSEPORT has additional benefits, it also causes traffic sent to the broadcast address to be copied to every listener.

Each individual QUIC server worker operates in isolation. Each one reacted to the same client Initial, duplicating the work on the server side and generating response traffic to the client’s IP address. Thus, a single packet could trigger a significant amplification. While specifics will vary by implementation, a typical one-listener-per-core stack (which sends retries in response to presumed timeouts) on a 128-core system could result in 384 replies being generated and sent for each packet sent to the broadcast address.

Although the researchers demonstrated this attack on QUIC, the underlying vulnerability can affect other UDP request/response protocols that use sockets in the same way.

Mitigation

As a communication methodology, broadcast is not generally desirable for anycast prefixes. Thus, the easiest method to mitigate the issue was simply to disable broadcast functionality for the final address in each range.

Ideally, this would be done by modifying our tooling to only add the local routes in the local routing table, skipping the inclusion of the broadcast ones altogether. Unfortunately, the only practical mechanism to do so would involve patching and maintaining our own internal fork of the iproute2 suite, a rather heavy-handed solution for the problem at hand.

Instead, we decided to focus on removing the route itself. Similar to any other route, it can be removed using standard tooling:

$ sudo ip route del 203.0.113.255 table local

To do so at scale, we made a relatively minor change to our deployment system:

  {%- for lo_route in lo_routes %}
    {%- if lo_route.type == "broadcast" %}
        # All broadcast addresses are implicitly ipv4
        {%- do remove_route({
        "dev": "lo",
        "dst": lo_route.dst,
        "type": "broadcast",
        "src": lo_route.src,
        }) %}
    {%- endif %}
  {%- endfor %}

In doing so, we effectively ensure that all broadcast routes attached to the loopback interface are removed, mitigating the risk by ensuring that the specification-defined broadcast address is treated no differently than any other address in the range.

Next steps 

While the vulnerability specifically affected broadcast addresses within our anycast range, it likely expands past our infrastructure. Anyone with infrastructure that meets the relatively narrow criteria (a multi-worker, multi-listener UDP-based service that is bound to all IP addresses on a machine with routable IP prefixes attached in such a way as to expose the broadcast address) will be affected unless mitigations are in place. We encourage network administrators and security professionals to assess their systems for configurations that may present a local amplification attack vector.

Има ли филм през 2024 г. в българското кино?

Post Syndicated from original https://www.toest.bg/ima-li-film-priez-2024-g-v-bulgharskoto-kino/

Има ли филм през 2024 г. в българското кино?

Сядам да пиша в кино „Влайкова“. Поводите са два. Първият е, че интериорът на клуба в преддверието е уютен, напомня ми на някогашните киносалони около „Славейков“, в които прекарвах свободното си време. Другият повод е оптимистичен – около Коледа адвокат Димитър Ганев, познат още като Маляка от „Войната на таралежите“, дари хонорарите от детските си роли, които от години е събирал, за каузата на читалище и кино „Влайкова“. 

Ето някои боксофис факти 

В периода ноември 2023 г. – декември 2024 г. във Facebook страницата ми @Има ли филм? бяха публикувани ревюта за 24-те български кинопремиери, гледани от 1 238 764 зрители. Те са чудесна новина за нашето кино. Може да се заключи, че салоните през миналата година са посетени от нова аудитория. 1 053 764 зрители са гледали частно продуцирани филми. Дори без „Гунди – легенда за любовта“ (отзивите ми за филма може да прочетете тук и тук, а връзките към останалите ревюта са при имената на съответните филми) – до неговия резултат в последните десетилетия се доближават само „Мисия Лондон“ и „Възвишение“ – зрителите на частно произведени филми са 333 764. Продукциите, дотирани от Националния филмов център (НФЦ), имат аудитория от 185 000 души. 

Защо държавно финансираните филми привличат шест пъти по-малко зрители? Ако отговорът е „Такова е качеството на зрителя“, то авторите на тези заглавия са загърбили основната си функция. Публиката е функция на времето, а творците имат задача да изпреварват нагласите ѝ и да я водят. Тезата ми е, че подборът на проекти в НФЦ е поставен на грешна основа от Закона за филмовата индустрия. Художествената комисия поощрява не проекти със зрителски потенциал, а тези, които биват внесени от определен кръг хора. 

Ето основните проблеми най-вече в подкрепените от НФЦ филми.

Историята и сценарият

Всяка история артикулира проблем и авторите трябва да създадат свят, разбираем за зрителя, от който тръгва пътешествието на главния герой. Като носител на значимата тема той се бори с неправда или жизненоважно за него препятствие. Темата влияе и подтиква героя към вътрешна борба, след която той променя и света около себе си. Тема се изказва с теза и послание. Ако на героя му липсват положителни качества или стремеж към тях, то киноисторията трудно стига до зрителя, той не ѝ вярва и не я съпреживява. Там се провалят филмите „Диада“, „Добрият шофьор“, „Уроците на Блага“, „Цената на властта“, „Аферата Пикасо, „Уроци по немски“, „Заведи ме вкъщи“, „Сватба“, „Без крила“. Героите лесно разрешават проблемите си, като извършват морално укорими действия или вземат такива решения. 

Слабостите на един проект са ясни още на ниво сценарий. Повечето сценарии, подкрепени от НФЦ, са неструктурирани. Липсва изграден контекст за начало на действието. Авторите знаят предисторията, но зрителят не, а той има нужда от ясен първичен свят, от който тръгва героят. Сценаристите не създават нравствено устойчиви герои, които да защитят темата.

Бърз преглед на най-гледаните в последните 30 години наши заглавия сочи, че само „Гунди – легенда за любовта“ има авторски сценарий. Другите три заглавия са написани по романи – „Мисия Лондон“ от Алек Попов, „Възвишение“ от Милен Русков и „Дзифт“ от Владислав Тодоров. При проекти като „Почивката“, създаден на основата на канала в Youtube „Светът на Ванката“, не може да се говори за добър текст. 

Сценарият за един филм отнема в най-добрия случай два-три месеца в много изтощителен режим на работа от опитен професионалист. Проучването отнема месеци. Пренаписване до работна версия отнема още толкова. Наблягам, че това е в тежък режим на работа, с над десет часа работа на ден. Предлагането му на продуцент отнема поне още няколко месеца. Сглобяването на смислен проект – още толкова. Следват месеци или години за кандидатстване. Сключване на договор и финансиране – два-три месеца. После подготовка, заснемане и монтаж – година и половина до премиера. Дотук почти пет години за проект, осъществен в най-кратки срокове от идея до салон.

Представете си в този ежедневно променящ се свят колко важен е погледът на авторите в бъдещето. Изключително трудно е да поставиш актуална тема. Затова глобални и общовалидни теми като „любовта побеждава всичко“, „човек срещу общество“, „добро срещу зло“ и др. са винаги печеливши, а само обстоятелствата, в които са поставени героите, се менят. Контекстът на идеята за филм трябва да прозира по-напред и да уцели нагласите на публиката. Пример за това са „Гунди – легенда за любовта“, „Русалки“ (само в частта с темата) и „Любен“. Негативен пример е „Уроците на Блага“ – с много добра тема, която е болезнена от десетилетия, но филмът не я поставя в нов контекст и така тя губи актуалността си.

Актьорската игра, операторската работа, музиката

Задаването на правилна актьорска задача изглежда трудно за повечето ни режисьори. Тя е обстоятелство или мотивация, които режисьорът предлага на актьора да преодолее или да постигне по свой начин. В театъра процесът е дълъг, за да се изградят трайни инстинкти за проблемите на всяка сцена, докато спектакълът се твори в реално време пред зрителя. В сценичната репетиция режисьорът вижда завършена играта на актьора.

В киното актьорът има слаба представа за крайния резултат поради липсата на хронология в снимачния процес и многото дубли. В няколко фестивално успешни наши филма героите крият емоционалността си зад непроницаема маска. Липсва вътрешен монолог, който би помогнал без думи да се предаде моментната динамика на емоцията в образа. Изпадането в такова състояние е знак, че актьорът или не може да изгради образа си, или няма добре поставена режисьорска задача. Както пътеката към върха следва спадове и изкачвания, така и пътят на героя никога не е равен.

В разкадровката (гледните точки и близостта до действието в различните кадри на сцените) липсват достатъчно установяващи мястото на действието кадри. Често покритието на сцените, тоест снимането им от различни гледни точки и с различна крупност (различни мащаби на приближение), е недостатъчно. Монтажът страда от липса на гледни точки. Изборът на план във всяка сцена трябва да следва драматургичната логика. Ако у героя назрява решение или напрежение, то движението на камерата към него е оправдано драматургично. С камера, която просто се движи насам-натам, се снимат евтините реклами и видеоклипове.

Стълб в българското кино през наблюдавания период е операторската работа. Емил Христов, Фран Гарсия Вера, Иван Вацов, Борис Славков, Вашко Виана, Александър Станишев, Симеон Кермекчиев, Румен Василев, Кирил Проданов са постигнали много в работата си по тези филми. Пожелавам им работа по добри проекти.

Забелязвам тенденция от композиторите да се изисква работата им да е самостоятелен носител на драматизъм, епичност, тревога. Това са състояния, които сценарият, режисурата, актьорската игра и операторската работа би трябвало вече да са изградили, а музиката само да акцентира върху тях.

Криворазбран „арт“ и липса на мъдрост

Някои автори са успели да пришият към филмите си етикета „арт“. Арт киното е жанр, както и драмата. Той борави с нови похвати, опитва да изкове различен от стереотипа глас, да разчупи форма и структура. Слабо изградената драма не е „арт“, нито „социално“ кино. Друг стереотип налага мнение, че жанрът „драма“ е гаранция за зрителски неуспех. Но не изборът на жанр е проблем, а качеството. „Ерин Брокович“ е социална драма, защото, докато преодолява житейските си проблеми (драма), героинята успява да разреши голям проблем и на хората около себе си (социално кино). „Уроците на Блага“ и „Уроци по немски“ не са „арт“, нито „социално“ кино, а драми със зле структурирани сценарии, защото героите им не разрешават екзистенциален проблем, свързан с тях и социума, а просто се носят по течението. Главен герой, който да противостои и да защитава темата на филма, всъщност няма.

Липсва мъдрост в работата на режисьорите по темата. Изкуството е скалпел, през чийто срез филмовият герой вниква в обществена рана, която му влияе. С усилията или с провала си той се стреми да я излекува. И ако му липсва морален компас, то филмът е обречен на зрителски бойкот въпреки фестивалните си успехи.

Често темата нищи социални недъзи, но вместо значими послания авторите просто регистрират проблем. „В България е лошо, това е системата, всеки е част от играта.“ Тези послания остават повърхностни, с герои, които лесно се предават пред препятствията. В много филми тандемът режисьор–продуцент пропуска функцията на темата като спойка. Всяко действие във филма се съотнася с темата. Игралното кино показва как главният герой се съпротивлява на това, което разтърсва света му. Колкото по-жизненоважен е залогът, толкова по-мощна е драматургията. Липсата на пари, ако не е жизненоважна, не е мотив за престъпване на морална ценност. Това е линията на „лошия“. В „Добрият шофьор“, „Диада“, „Цената на властта“, „Уроците на Блага“, „Уроци по немски“, „Аферата Пикасо“ героят много лесно избира тъмната страна. Той става активен участник в проблема и няма кой да се бори в посока на темата на филма. В „Чума“, „Заведи ме вкъщи“, „Без крила“ на героя му липсват ясни морални устои. 

Продуценти или изпълнителни директори?

В България продуценти почти няма. С добрите бюджети на „Уроците на Блага“, „Уроци по немски“ и „Клопка“ на екран се предлагат постни локации и липса на всякакъв размах и въображение във визуалната част. Наличието на бюджет би трябвало да е видимо на екрана. В повечето случаи се приема, че българските филми нямат възвръщаемост. Е, някои доказаха противното. За съжаление, при най-печелившия проект, ако гледаме съотношението между бюджета и постъпленията – „Почивката“ (тук говорим за устойчив проект, развит в „Светът на Ванката“), има творчески дефицити и филмът по-скоро влияе зле на публиката в дългосрочен план. Ако се повиши качеството на филмите, с тях ще израсне и публиката. Така зрителят сам ще започне да отсява слабите филми.

В България има изпълнителни директори. Те разпределят бюджет. За разлика от тях, продуцентът познава пазара в дългосрочен план. Той предчувства какви теми биха вълнували публиката в следващите години, защото има широк поглед върху световното развитие. В портфолиото му чакат идеи за проекти, за които времето още не е дошло, и други, които отлежават, защото е пропуснал момента. Продуцентът има глас за финалния монтаж, следи за ясно артикулиране на темата спрямо сценария. Той е гарант, че ще се създаде добър и гледаем продукт, чието място е в кината. 

Присъствие на фестивали и проблеми с подбора

Големите фестивали са огромни пазари за сключване на сделки. Но има и алтернативни, в които са добре дошли гласовете от малки кинематографии и по-непознати култури. В тях НФЦ се позиционира изключително добре. Филмите, финансирани от Центъра, печелят награди, авторите им обикалят фестивалната мрежа и подпомагат следващите си проекти. Но те не са определящи за облика на едно национално кинопроизводство. То би трябвало да е многообразно и да е огледало на обществото ни. Затова трябва да се продуцират проекти с добре структурирани сценарии и ясни теми, които да се задържат в салона. 

НФЦ изнемогва в подбора на сценарии и в режисурата. От излезлите последни 24 филма добре структурирани истории имат само четири – „Гунди – легенда за любовта“, „Любен“, „Отговор на всички въпроси“ (филмът е без написан сценарий), „Пулсът на танца“, и донякъде „Без крила“. Първите четири са отхвърлени от НФЦ. Неразбираема е липсата на подкрепа за следващия проект на „Междинна Станция“ след изумителния успех на „Гунди – легенда за любовта“. Подобен беше и случаят с „Игра на доверие“. След като „В сърцето на машината“, филм със субсидия от НФЦ, постигна 121 000 зрители за 2023 г. и беше избран за българско предложение за „Оскар“, следващият проект на същия екип не получава субсидия. Все пак продуцентите му финансират проекта с частни средства. „Игра на доверие“ е филм – пример за добро кино. Тук има структуриран сценарий, режисурата е вдъхновяваща, актьорският състав – също, а в операторската работа има недостигнати за наш филм кадри в добре пресъздадена епоха.

Накратко, основните слабости на проектите, финансирани от НФЦ, са темата, структурата на сценария и работата с актьори. Някои продуценти успяват да спечелят не един проект, което ги прави успешни в конюнктурата на НФЦ. Но филмите им не привличат публика. Работата на триото продуцент–сценарист–режисьор не е на ниво, защото не поставя ясно темите си спрямо пулса на зрителските нагласи. Много филми артикулират важни недъзи в обществото – така е в България, това са ни тежките проблеми, безпътица, мъка. Но без съпротива срещу проблема само се регистрира действителността. Ако главният герой не е носител на промяна, това е причина за зрителски неуспех.

В заключение, сценариите, които се поощряват от комисиите в НФЦ, не са пример за подражание. Някои продуценти, които работят активно с проекти, финансирани от НФЦ, нямат желание за промяна, която да създаде работеща среда, за да се издирват и финансират актуални и талантливи проекти. Така те биха се борили за финансиране с все повече творци. Това е причината все още да няма критична маса от съсловието, която да поиска реформа. Затова идеята, че реформата трябва да се инициира от хора извън гилдията, е логична. Не вярвам, че това е най-доброто, което българските творци правят. Но ако наистина е така, проблемът трябва да се сведе до ниво образование. И в двата случая е нужна реформа, а в каква посока може да се развие – на тази тема ще е посветена втората част на статията.

Руската агресия в Украйна. Защо мирът остава трудно постижим

Post Syndicated from original https://www.toest.bg/ruskata-agresiya-v-ukraina-zashto-mirut-ostava-trudno-postizhim/

Руската агресия в Украйна. Защо мирът остава трудно постижим

Tри години след началото на руската агресия срещу Украйна и повече от десетилетие след незаконната руска окупация на Крим и части от Донбас войната продължава без признаци за скорошно затихване и мир. Въпреки различните дискусии за потенциални планове за спиране на огъня, включително предложението на новия президент на САЩ Доналд Тръмп, постигането на мир остава далечна и сложна цел, а пътят към прекратяване на войната е изпълнен с предизвикателства.

Реалността зад мирните предложения

По време на предизборната кампания Доналд Тръмп заяви, че би могъл да спре войната в рамките на 24 часа, ако стане президент. Това изказване привлече внимание, но беше оценено от експертите като крайно нереалистично. Всеки план за мир между Киев и Москва трябва да бъде съобразен със сложни въпроси, включително бъдещето на окупираните от Русия украински територии, наказателна отговорност за руските военни престъпления и предоставяне на западни гаранции за сигурността на Украйна.

Русия и Украйна все още остават на двата полюса в своите цели във войната. Москва се стреми да затвърди контрола си върху завладените територии, да дестабилизира максимално Украйна и да я откъсне от близостта ѝ със Запада, докато Киев настоява за пълното възстановяване на своите граници и солидни гаранции от съюзниците си, за да се попречи на нова руска агресия.

Войната три години по-късно

През септември 2024 г. украинският президент Володимир Зеленски заяви, че Украйна е отворена за преговори, но само при условия, включващи гаранции за сигурност. В замяна на това Зеленски намекна, че би приел замразяване на фронта в сегашния му вид. В същото време Владимир Путин не показва готовност за компромиси, което допълнително усложнява ситуацията. Тази безизходица отразява различните приоритети и цели на двете страни, както и трудностите при създаването на условия за преговори.

Според експерти за постигането на устойчив мир в Украйна е необходимо страната да получи дългосрочни гаранции за сигурност срещу бъдещи руски нападения. Ясните механизми за защита на украинския суверенитет трябва да са незаобиколимо условие за начало на преговори, за да се избегне повторение на конфликта. Това включва не само военна подкрепа, но и икономически и дипломатически ангажименти от страна на международната общност. И макар че подобни мерки изискват значителни ресурси и координация, те са от изключителна важност за гарантиране на стабилността в региона и за възпиране на бъдещи агресивни действия от страна на Русия.

Скептичността на Украйна по отношение на гаранции, които не включват присъствието на западни военни части в страната, е разбираема с оглед на факта, че Русия вече на два пъти нарушава международни споразумения, специално подписани за гарантиране на украинската независимост – меморандума от Будапеща (1994 г.) и споразумението от Минск (2015 г.).

Стратегията на Русия: всичко или нищо

Подходът на Русия към войната отразява руските дългосрочни амбиции. Правителството на Владимир Путин, изглежда, няма намерение да се откаже от своите цели, които включват присъединяване на украински територии и отслабване на съюза на Киев със Запада. Докато руските сили продължават своите военни кампании, стратегията на Кремъл вероятно е удължаване на конфликта с цел изтощаване на украинската съпротива и намаляване на международната подкрепа.

В същото време руската икономика все повече се превръща в заложник на войната. Според анализ на икономисти Кремъл е изправен пред парадоксална ситуация: икономическата структура на Русия вече е толкова силно ориентирана към военни усилия, че страната не може да си позволи нито да загуби, нито да спечели войната. Загубата би отслабила легитимността на режима и би довела до още по-дълбоки икономически и социални сътресения. От друга страна, всеки мир, който Путин би могъл да представи като руска победата, би изисквал огромни ресурси за бъдеща окупация и възстановяване на анексираните украински територии, което също би било непосилно за икономиката.

Този икономически капан, съчетан с международните санкции и изолация, създава уникално предизвикателство за Русия. Макар че военната индустрия и държавните програми поддържат известна стабилност, в дългосрочен план ресурсите са ограничени. В този контекст става още по-ясно защо Русия продължава да преследва стратегия на изтощение и развиване на военната си икономика, вместо да търси скорошно прекратяване на войната.

Ролята на Европа на фона на несигурността в САЩ

Макар че Съединените щати са ключов поддръжник на Украйна, вероятността за промени в приоритетите на Вашингтон е голяма. Победата на Доналд Тръмп на президентските избори внесе допълнителна несигурност в продължаването на американската военна и финансова помощ за Украйна. Това подтикна Европа да се подготви за сценарий, при който трябва да поеме по-голяма част от тежестта.

Европейските държави с ключова подкрепа за Украйна, в това число Германия, Полша и балтийските страни, увеличиха военната помощ и финансовата подкрепа за Киев. Европейският съюз също обеща дългосрочна помощ, което даде силен сигнал за ангажимент към отбраната на Украйна, независимо от промените в политиката на САЩ. Въпреки това способността на Европа да замени американската подкрепа в такъв мащаб остава несигурна, особено с оглед на икономическите натоварвания, енергийните кризи и политическата нестабилност на Стария континент.

Допълнително Франция и Германия обсъждат нови форми на ангажимент в Украйна, включително възможност за изпращане на съюзнически войски. Президентът на Украйна Володимир Зеленски, разкри, че е водил разговори с президента на Франция Еманюел Макрон за разполагане на такива войски в Украйна като знак за подкрепа и стабилност. Макар че подобен ход е в начална фаза на обсъждане, той показва желание за по-дълбока ангажираност на европейските партньори.

Германия също обмисля изпращането на миротворчески сили в Украйна според германския министър на отбраната Борис Писториус. Това предложение обаче изисква широка международна подкрепа и може да се реализира едва след като се постигне трайно примирие. Европейските лидери осъзнават, че такъв ход крие значителни рискове, но също така може да представлява важна стъпка към дългосрочна стабилност в региона.

Защо мирът остава далечна цел

За да бъде постигнат мир, и двете страни трябва да се съгласят с условия, които удовлетворяват техните основни интереси – нещо, което изглежда почти невъзможно в момента, като се имат предвид динамиката на фронта и настроенията сред управляващите в Киев и Москва. Отказът на Украйна формално да признае промяна на международно признатите си през 1991 г. граници е в съответствие с държавния ѝ суверенитет и международното право, докато максималистичните цели на Русия не оставят място за истински преговори.

Международните медиатори, като Турция и Катар, са изправени пред допълнителното предизвикателство да преодолеят различията между воюващите страни, като същевременно запазят ниво на неутралност. По-широката геополитическа ситуация, включително ролята на НАТО за дългосрочен мир в Източна Европа и двусмислената позиция на Китай, допълнително усложнява потенциалните преговори.

Междувременно Киев и Москва, изглежда, се готвят усилено за активно продължаване на бойните действия. Украйна планира да свали възрастта за мобилизация сред гражданите си от 25 на 18 години, а новият лидер на НАТО призовава съюзниците да продължат с подкрепата си за нападнатата страна и предложи европейските държави да плащат за американски оръжия, използвани от украинската армия. В същото време изправената пред „неконтролирана финансова криза“ Русия планира да използва допълнителни севернокорейски военни в армията си, след като през последните месеци понесе големи загуби сред частите си на фронта в Донбас и Курск.

Перспективите за мир в Украйна остават далечни, тъй като Русия ще продължава своята агресия, а Киев няма друг избор, освен да се защитава. Докато международните усилия за посредничество срещат сериозни предизвикателства, дългосрочната стабилност в региона ще зависи от способността на Украйна и нейните съюзници да възпират руската ескалация. Поне докато Путин не бъде притиснат да преговаря за мир или не се стигне до политическа промяна в Москва или в Киев.

Заглавно изображение: Доналд Тръмп, Еманюел Макрон и Володимир Зеленски на тристранна среща, организирана от френския президент, декември 2024 г. Източник: President Of Ukraine from Україна, CC0, via Wikimedia Commons

Pairwise Authentication of Humans

Post Syndicated from Bruce Schneier original https://www.schneier.com/blog/archives/2025/02/pairwise-authentication-of-humans.html

Here’s an easy system for two humans to remotely authenticate to each other, so they can be sure that neither are digital impersonations.

To mitigate that risk, I have developed this simple solution where you can setup a unique time-based one-time passcode (TOTP) between any pair of persons.

This is how it works:

  1. Two people, Person A and Person B, sit in front of the same computer and open this page;
  2. They input their respective names (e.g. Alice and Bob) onto the same page, and click “Generate”;
  3. The page will generate two TOTP QR codes, one for Alice and one for Bob;
  4. Alice and Bob scan the respective QR code into a TOTP mobile app (such as Authy or Google Authenticator) on their respective mobile phones;
  5. In the future, when Alice speaks with Bob over the phone or over video call, and wants to verify the identity of Bob, Alice asks Bob to provide the 6-digit TOTP code from the mobile app. If the code matches what Alice has on her own phone, then Alice has more confidence that she is speaking with the real Bob.

Simple, and clever.

The collective thoughts of the interwebz