![Nove principais vulnerabilidades de segurança de API: como se defender delas](https://optimuscloud.com.br/wp-content/uploads/2024/06/1718121608_Nove-principais-vulnerabilidades-de-seguranca-de-API-como-se-defender-150x150.jpg)
Nove principais vulnerabilidades de segurança de API: como se defender delas
11 de junho de 2024![A Polygon está desbloqueando US$ 640 milhões em subsídios comunitários ao longo de uma década.](https://optimuscloud.com.br/wp-content/uploads/2024/06/1718132403_Polygon-desbloqueia-subsidios-comunitarios-no-valor-de-US-640-milhoes-150x150.jpg)
Polygon desbloqueia subsídios comunitários no valor de US$ 640 milhões para construtores de blockchain
11 de junho de 2024Enquanto ajudava no estande do Cloud Foundry na KubeCon Paris 2024, percebi muito interesse em Buildpacks Cloud Native de código aberto. E faz sentido. À medida que todos embarcam no trem de engenharia da plataforma, as equipes de operação procuram os blocos de construção que lhes permitirão padronizar o ciclo de vida de seus aplicativos, independentemente da pilha. Buildpacks, hospedados pela Linux Foundation, oferecem recursos que se adaptam bem à tendência de engenharia de plataforma; eles permitirão a padronização do processo de conteinerização e fornecerão uma experiência consistente ao desenvolvedor, independentemente da pilha, ao mesmo tempo que fornecem desempenho sólido e recursos de segurança.
Buildpacks já existem há mais de uma década – com Heroku criando o conceito em 2011 – e muitos profissionais já trabalharam com eles em algum momento de suas carreiras. Uma pergunta sempre vinha dos participantes da KubeCon: ainda é difícil instalar o APM (Application Performance Monitoring)?
Quem já usa Buildpacks há algum tempo sabe que integrar um agente APM era complicado. O mantenedor do Cloud Foundry, Tim Downey, explicou que “os usuários tiveram que executar um buildpack separado – junto com o do aplicativo – que fornecia o binário APM. Este buildpack foi encadeado junto com o comando de início regular do aplicativo ou usado por processos secundários do CF”.
Mas esse não é mais o caso. Neste artigo, mostrarei como adicionar facilmente um APM – tomando OpenTelemetry como exemplo – a um aplicativo Python.
Configure um aplicativo Python
Se você já possui um aplicativo Python com o qual pode brincar, pule esta seção; se não, continue lendo.
Vamos clonar um repositório que contém vários aplicativos de exemplo e navegar até a pasta do aplicativo Python:
git clone https://github.com/sylvainkalache/sample-web-apps cd sample-web-apps/python/
Como você pode ver, é um aplicativo Flask simples.
$ cat my-app.py from flask import Flask, request, render_template import gunicorn import platform import subprocess app = Flask(__name__) @app.route("/") def hello(): return "Hello, World!n" + "Python version: " + platform.python_version() + "n"
Adicione OpenTelemetry ao nosso aplicativo
OpenTelemetry é uma estrutura de código aberto para coletar dados de telemetria, como métricas, logs e rastreamentos de qualquer aplicativo. Os dados coletados podem ser enviados para ferramentas como Prometheus para métricas, Jaeger e Zipkin para rastreamento e ELK Stack (Elasticsearch, Logstash, Kibana) para logs.
Primeiro, você precisará importar essas bibliotecas básicas do OpenTelemetry.
from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
Então, precisamos definir um rastreador e um exportador OpenTelemetry. Nesse caso, vou simplificar e exportar os dados coletados para o console para fins de demonstração.
# Set up the TracerProvider trace.set_tracer_provider(TracerProvider()) # Initialize the ConsoleSpanExporter console_exporter = ConsoleSpanExporter() # Set up SimpleSpanProcessor to use ConsoleSpanExporter span_processor = SimpleSpanProcessor(console_exporter) trace.get_tracer_provider().add_span_processor(span_processor) # Get a tracer tracer = trace.get_tracer(__name__)
Agora precisamos dizer ao OpenTelemetry para rastrear algo; adicione esta linha para iniciar um novo intervalo de rastreamento para o método hello.
with tracer.start_as_current_span("my_tracer"):
Aqui está a aparência do seu arquivo my-app.py:
from flask import Flask, request, render_template import gunicorn import platform import subprocess from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor app = Flask(__name__) # Set up the TracerProvider trace.set_tracer_provider(TracerProvider()) # Initialize the ConsoleSpanExporter console_exporter = ConsoleSpanExporter() # Set up SimpleSpanProcessor to use ConsoleSpanExporter span_processor = SimpleSpanProcessor(console_exporter) trace.get_tracer_provider().add_span_processor(span_processor) # Get a tracer tracer = trace.get_tracer(__name__) @app.route("/") def hello(): with tracer.start_as_current_span("hello_world"): return "Hello, World!n" + "Python version: " + platform.python_version() + "n"
Por último, para garantir que Buildpacks detecte e instale as bibliotecas e dependências OpenTelemetry, adicione as linhas abaixo ao seu arquivo requirements.txt.
opentelemetry-api opentelemetry-sdk opentelemetry-instrumentation opentelemetry-instrumentation-flask
Embale e execute
A beleza do Buildpack é que com um comando CLI do pacote, você criará uma imagem OCR pronta para produção a partir de nosso aplicativo. Na raiz da pasta do aplicativo Python, execute o seguinte comando pack.
pack build my-python-app --builder paketobuildpacks/builder-jammy-base
O contêiner foi criado e você pode executá-lo usando o comando docker abaixo:
docker run -ti -p 5000:8000 -e PORT=8000 my-python-app
Agora, em outra aba, consulte sua aplicação usando curl.
$ curl 0:5000 Hello, World! Python version: 3.10.14
Seu aplicativo deve gerar o seguinte e podemos ver a saída do OpenTelemetry exibida.
(2024-05-01 21:35:18 +0000) (1) (INFO) Starting gunicorn 22.0.0 (2024-05-01 21:35:18 +0000) (1) (INFO) Listening at: http://0.0.0.0:8000 (1) (2024-05-01 21:35:18 +0000) (1) (INFO) Using worker: sync (2024-05-01 21:35:18 +0000) (22) (INFO) Booting worker with pid: 22 { "name": "hello_world", "context": { "trace_id": "0xebb54bc5f7340b22c237a2c73af2a266", "span_id": "0x7a02dd7f80e16c16", "trace_state": "()" }, "kind": "SpanKind.INTERNAL", "parent_id": null, "start_time": "2024-05-01T21:35:32.803533Z", "end_time": "2024-05-01T21:35:32.803574Z", "status": { "status_code": "UNSET" }, "attributes": {}, "events": (), "links": (), "resource": { "attributes": { "telemetry.sdk.language": "python", "telemetry.sdk.name": "opentelemetry", "telemetry.sdk.version": "1.24.0", "service.name": "unknown_service" }, "schema_url": "" } }
Como você pode ver, agora é muito fácil instalar um APM em um aplicativo empacotado com Buildpack. O mesmo princípio se aplica à maioria dos APMs, incluindo New Relic e Datadog. Para aqueles que estão relutantes em usar Buildpacks de código aberto por causa disso, é hora de reconsiderar!
A postagem Integração simplificada de APM em Buildpacks nativos da nuvem apareceu pela primeira vez em The New Stack.