CRIANDO APIS SEGURAS - AWS
-
Upload
khangminh22 -
Category
Documents
-
view
1 -
download
0
Transcript of CRIANDO APIS SEGURAS - AWS
QUEM SOU EU?
VINÍCIUS CAMPITELLI
Co-fundador do Membro do GitHub e Twitter: Slides:
CurseducaPHPSP
@vcampitelliviniciuscampitelli.com
2
AGENDAAutenticação e autorizaçãoMelhores práticas com access tokensThrottling e Rate LimitingCamu�agem de IDs sequenciais
3
AGENDAAutenticação e autorizaçãoMelhores práticas com access tokensThrottling e Rate LimitingCamu�agem de IDs sequenciaisCriptografando e assinando requisições e respostas
3
AUTENTICAÇÃO
É o ato de estabelecer ou con�rmar algo (oualguém) como autêntico (...)
Fonte: Wikipedia
4 . 2
AUTENTICAÇÃO
É o ato de estabelecer ou con�rmar algo (oualguém) como autêntico (...)
Fonte: Wikipedia
4 . 2
AUTENTICAÇÃOPara autenticar algo ou alguém, precisamos de uma
credencial que o identi�que.Ela precisa ser emitida por algo (ou alguém) que o autorizador
con�e.
4 . 3
“O QUE VOCÊ SABE”Autenticação baseada no conhecimento
Exemplos:Usuário e senhaCerti�cado digitalClient ID e Client Secret
4 . 4
“O QUE VOCÊ TEM”Autenticação baseada na propriedade
Exemplos:
Token ou cartão físico Código via aplicativo
“O QUE VOCÊ É”Autenticação baseada na característica
Exemplos:Impressão digitalIdenti�cação de írisReconhecimento facialReconhecimento de voz
4 . 6
AUTORIZAÇÃOÉ garantir que apenas usuários autorizadosconsumam os recursos protegidos de umsistema computacional
Fonte: Wikipedia
4 . 7
AUTORIZAÇÃOÉ garantir que apenas usuários autorizadosconsumam os recursos protegidos de umsistema computacional
Fonte: Wikipedia
4 . 7
AUTORIZAÇÃOApós saber quem é o cliente no processo de Autenticação,
preciso agora entender o que ele pode fazer. Quais recursosele pode consumir? Por quanto tempo?
4 . 8
COMO EFETUAR AUTENTICAÇÃO EAUTORIZAÇÃO?
Para autenticação, podemos utilizar o ouimplementar nosso próprio sistema (por exemplo, através do
banco de dados).
OpenID
4 . 9
COMO EFETUAR AUTENTICAÇÃO EAUTORIZAÇÃO?
Para autenticação, podemos utilizar o ouimplementar nosso próprio sistema (por exemplo, através do
banco de dados).
OpenID
é o protocolo mais conhecido de autorização. Ele,por si só, não contempla processos de autenticação.
OAuth 2.0
4 . 9
FAMOSA TELA DE AUTORIZAÇÃO VIA OAUTH 2Utilizando o Grant de Authorization Code
(saiba como escolher o Grant Type certo )nesse link
Referência: Shotgun Debugging 4 . 10
REFERÊNCIAS
Para PHP
OpenIDAuth0OAuth 2.0
The PHP League: OAuth 2.0 ServerMeu slides sobre OAuth2
4 . 11
O QUE É UM ACCESS TOKEN?É um objeto que descreve o contexto desegurança de um processo (...)
Fonte: MSDN
5 . 2
E NO MUNDO DE APIS?O processo de autenticação e autorização pode ser caro
computacionalmente (consultas a banco de dados, servidores deautenticação externos, criptogra�a de senha etc)
5 . 3
E NO MUNDO DE APIS?Ao invés de sempre termos essa carga a cada requisição a
nossos servidores, podemos ter um único endpoint deautenticação / autorização que irá realizar essa etapa uma
vez e gerar um access token com as informações necessáriaspara autenticar e autorizar mais rapidamente o cliente nas
requisições seguintes
5 . 4
E NO MUNDO DE APIS?Esse token deve possuir um tempo de vida limitado, tantopara diminuir efeitos colaterais caso haja um vazamentoquanto porque sua informação pode �car desatualizada
5 . 5
E NO MUNDO DE APIS?Esse segundo processo pode ser automatizado através de
refresh tokens
Eles são utilizados para regerar um access tokenautomaticamente, sem necessitar da intervenção manual do
usuário
5 . 6
COMO DEIXAR OS TOKENS SEGUROS?Utilizando algoritmos de criptogra�a seguros e comassinatura;
AES-256-GCM, ChaCha20+Poly1305, Ed25519 entre outros
5 . 8
COMO DEIXAR OS TOKENS SEGUROS?Utilizando algoritmos de criptogra�a seguros e comassinatura;
AES-256-GCM, ChaCha20+Poly1305, Ed25519 entre outros
Tendo cuidado com implementações de bibliotecas comfalhas de segurança;
5 . 8
COMO DEIXAR OS TOKENS SEGUROS?Utilizando algoritmos de criptogra�a seguros e comassinatura;
AES-256-GCM, ChaCha20+Poly1305, Ed25519 entre outros
Tendo cuidado com implementações de bibliotecas comfalhas de segurança;
Exemplo: JWT com alg=none
5 . 8
COMO DEIXAR OS TOKENS SEGUROS?Não faça commit de chaves e outros segredos, nem deixe-oshardcoded na aplicação
5 . 9
COMO DEIXAR OS TOKENS SEGUROS?Não faça commit de chaves e outros segredos, nem deixe-oshardcoded na aplicaçãoNão guarde informações muito sensíveis (como senhas eoutras credenciais)
5 . 9
COMO DEIXAR OS TOKENS SEGUROS?Não faça commit de chaves e outros segredos, nem deixe-oshardcoded na aplicaçãoNão guarde informações muito sensíveis (como senhas eoutras credenciais)Se precisar armazenar do lado do cliente, utilize cookiesseguros (�ags httpOnly e secure ) ao invés do LocalStorage
5 . 9
COMO DEIXAR OS TOKENS SEGUROS?Apenas trafegue tokens no cabeçalho ou corpo darequisição, nunca na URL
5 . 10
COMO DEIXAR OS TOKENS SEGUROS?Apenas trafegue tokens no cabeçalho ou corpo darequisição, nunca na URLNão exiba informações do token em seus logs
5 . 10
EXEMPLO DE IMPLEMENTAÇÃOuse Lcobucci\JWT\Builder; $time = time(); $token = (new Builder()) ->issuedBy('http://example.com') // Configures the issuer (iss claim) ->permittedFor('http://example.org') // Configures the audience (aud claim) ->identifiedBy('4f1g23a12aa', true) // Configures the id (jti claim), replicating as ->issuedAt($time) // Configures the time that the token was issue (iat claim) ->canOnlyBeUsedAfter($time + 60) // Configures the time that the token can be used (n ->expiresAt($time + 3600) // Configures the expiration time of the token (exp claim) ->withClaim('uid', 1) // Configures a new claim, called "uid" ->getToken(); // Retrieves the generated token
lcobucci/jwt
5 . 11
BIBLIOTECAS
JSON Web Tokens: implementação mais conhecida detokens
PASETO: implementação com design "mais seguro" porpadrão
lcobucci/jwt�rebase/php-jwt
paragonie/paseto
5 . 12
REFERÊNCIAS
, biblioteca moderna decriptogra�aMeu slides sobre a libsodium
Symfony Guard
5 . 13
O QUE É THROTTLING?É a desaceleração intencional do processamento de uma
requisição para prevenir sobrecarga do servidor
6 . 2
O QUE É THROTTLING?Imagine um endpoint que consuma grande recursos
computacionais (como, por exemplo, o processo de autenticaçãoe autorização descritos anteriormente)
6 . 3
O QUE É THROTTLING?Se um agente malicioso identi�car esse recurso, ele pode setornar muito visado para ataques, causando sobrecarga no
nosso servidor e podendo gerar paralisação e até queda totaldo serviço
6 . 4
O QUE É THROTTLING?Nesses casos, podemos con�gurar que o servidor irá aceitar
somente x requisições em algum(ns) endpoint(s) por um certoperíodo de tempo
6 . 5
O QUE É THROTTLING?Após esse valor x , as requisições entrarão em uma �la para
serem processadas alguns instantes depois, assim que asprimeiras tiverem sido liberadas
6 . 6
MAS ENTÃO O QUE É RATELIMITING?
Ao contrário do Throttling, em a requisição será processadacom um atraso, Rate Limiting é fazer o servidor se recusar a
responder após um certo número de requisições
6 . 8
MAS ENTÃO O QUE É RATELIMITING?
Nesses casos, devemos emitir um status HTTP 503 ServiceUnavailable ou 429 Too Many Requests
6 . 9
COMO ESSAS DUAS PRÁTICAS SERELACIONAM ENTRE SI?
Geralmente, primeiro aplicamos uma política de Throttlingpara desacelerar o processamento nas x primeiras
requisições, e após um outro número y , iremos simplesmenteparar de responder
6 . 10
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Você deve con�gurá-las em seu servidor Web (por exemplo,Apache, IIS ou nginx) ou no seu serviço de DNS (por exemplo, o
Cloud�are)
6 . 11
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Tomando como exemplo o nginx, utilizaremos o módulongx_http_limit_req_module (que implementa o mais
conhecido algoritmo desse tipo de prática, o )Leaky Bucket
6 . 12
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
limit_req_zone $binary_remote_addr zone=login_zone:10m rate=10r/s; server { location /login { limit_req zone=login_zone burst=5; # outras configurações padrões do meu bloco location... } }
6 . 13
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
O código anterior irá proteger nosso endpoint /login ,permitindo apenas 10 requisições por segundo por IP (ou seja,
1 a cada 100ms)
6 . 14
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Mas também permitimos um burst, permitindo que 5requisições extras sejam colocadas na �la de processamento
antes de serem enviadas para o upstream
6 . 15
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Nesse caso, se recebermos de um mesmo IP 10 requisiçõesem um período de 100ms, o que ocorrerá?
6 . 16
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Nesse caso, se recebermos de um mesmo IP 10 requisiçõesem um período de 100ms, o que ocorrerá?
A 1ª requisição será processada instantaneamente
6 . 16
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Nesse caso, se recebermos de um mesmo IP 10 requisiçõesem um período de 100ms, o que ocorrerá?
A 1ª requisição será processada instantaneamenteAs 2ª, 3ª, 4ª, 5ª e 6ª requisições serão colocadas em uma �lae serão processadas sequencialmente após o término daanterior
6 . 16
ONDE E COMO CONFIGURAR ESSASPOLÍTICAS?
Nesse caso, se recebermos de um mesmo IP 10 requisiçõesem um período de 100ms, o que ocorrerá?
A 1ª requisição será processada instantaneamenteAs 2ª, 3ª, 4ª, 5ª e 6ª requisições serão colocadas em uma �lae serão processadas sequencialmente após o término daanteriorAs 7ª, 8ª, 9ª e 10ª requisições serão negadas
6 . 16
REFERÊNCIAS
Como implementar no CloudFlareComo implementar no nginx
6 . 17
O QUE É UM ID SEQUENCIAL E POR QUEESCONDÊ-LO?
Ao criarmos endpoints no formato /user/1 , /user/2 , /user/3etc, estamos fornecendo uma informação muito valiosa sobre
a quantidade de registros que possuímos daquela entidade
7 . 2
O QUE É UM ID SEQUENCIAL E POR QUEESCONDÊ-LO?
Isso pode ser utilizado tanto por alguém mal intencionadoquanto por algum competidor.
7 . 3
O QUE É UM ID SEQUENCIAL E POR QUEESCONDÊ-LO?
Isso pode ser utilizado tanto por alguém mal intencionadoquanto por algum competidor.
Cuidado com espionagem industrial!
7 . 3
VERSÃO STANDARD
COMO RESOLVER?Crie um segundo campo na tabela com um valor único paraaquele registro
7 . 4
VERSÃO STANDARD
COMO RESOLVER?Crie um segundo campo na tabela com um valor único paraaquele registro
Esse valor pode ser um , um hash do ID incremental ou um valoraleatório...
GUID
7 . 4
VERSÃO STANDARD
COMO RESOLVER?Crie um segundo campo na tabela com um valor único paraaquele registro
Esse valor pode ser um , um hash do ID incremental ou um valoraleatório...
GUID
Então, transforme o recurso /user/<IdIncremental> em/user/<Identificador>
7 . 4
VERSÃO STANDARD
COMO RESOLVER?REFERÊNCIAS
Funções para gerar valores aleatórios: para PHP 7
Para PHP 5, use o poly�ll
Funções para gerar hash:
random_bytes()paragonie/random_compat
hash_hmac()
Artigo no blog da Paragon
7 . 5
VERSÃO STANDARD
COMO NÃO RESOLVER?Funções que não devem ser utilizadas:
Para gerar valores aleatórios:rand()mt_rand()uniqid()
Para gerar hash:sha1()md5()
7 . 6
VERSÃO HARDCORE
COMO RESOLVER?Utilizando a biblioteca , que derivauma chave para cada coluna a partir de uma chave-mestra
REFERÊNCIA
paragonie/ciphersweet
Artigo no blog da Paragon
7 . 7
PRECAUÇÃO EXTRAPara usuários avançados e sistemas críticos, podemos
adicionar uma camada extra de proteção: criptografar osdados da requisição e da resposta
8 . 2
PRECAUÇÃO EXTRAMas, espera aí! Eu já uso HTTPS. Meu dadosjá estão sendo criptografados usando TLS.
8 . 3
PRECAUÇÃO EXTRAApós o estabelecimento do protocolo, realmente os dados
transitados estão criptografados, mas ainda podemos sofrerum ataque de Man in the Middle
8 . 4
MAN IN THE MIDDLEExistem diversos hops entre o cliente e o servidor. Quemgarante que todos os gateways do caminho são seguros?
8 . 6
MAN IN THE MIDDLEExistem diversos hops entre o cliente e o servidor. Quemgarante que todos os gateways do caminho são seguros?Se você não for o administrador da sua rede local, alguémpode instalar uma Autoridade Certi�cadora em suamáquina e emitir certi�cados próprios
8 . 6
MAN IN THE MIDDLENem todos os sites utilizam HSTS
8 . 7
MAN IN THE MIDDLENem todos os sites utilizam HSTS
Ou seja, pode haver uma conexão HTTP antes do redirecionamentopara HTTPS pelo servidor
8 . 7
MAN IN THE MIDDLENem todos os sites utilizam HSTS
Ou seja, pode haver uma conexão HTTP antes do redirecionamentopara HTTPS pelo servidor
Teoria da conspiração: grandes empresas possuembackdoors para bisbilhotar seu tráfego
8 . 7
PRECAUÇÃO EXTRAAntes de seguir nessa etapa, faça um e
certi�que-se que realmente valhe a penaThreat Modeling
8 . 9
PRECAUÇÃO EXTRAAntes de seguir nessa etapa, faça um e
certi�que-se que realmente valhe a penaThreat Modeling
Compensa instalar um sistema de segurança de últimageração em um depósito que não possui algo de extremo
valor dentro?
8 . 9
PRECAUÇÃO EXTRASIM! Meu sistema é crítico e preciso disso. Oueu não con�o em grandes corporações.
8 . 10
PRECAUÇÃO EXTRAVocê pode exigir que toda requisição tenha seu corpo
criptografado pelo cliente, utilizando um segredo em que sóvocês dois sabem
8 . 11
PRECAUÇÃO EXTRAPor exemplo, você pode utilizar uma terceira informação forao Client ID e o Client Secret e usá-la como chave assimétrica,
ou fornecer um certi�cado digital para seu cliente
8 . 12
PRECAUÇÃO EXTRADo lado do servidor, você utiliza essa informação sigilosa para
descriptografar o corpo da requisição - se falhar, você emiteum erro e para o processamento
8 . 13
PRECAUÇÃO EXTRAEntretanto, esse processo de descriptogra�a pode ser muitocustoso operacionalmente, podendo ser um outro ponto de
ataque DoS (lembre-se do que falamos na seção de Throttling eRate Limiting). Você pode, então, utilizar um processo de
assinatura digital além da criptogra�a.
8 . 14
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciais
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dados
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinatura
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinaturaEnvia a requisição somente com os dados criptografados
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinaturaEnvia a requisição somente com os dados criptografados
Para cada resposta seguinte, ele deve:
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinaturaEnvia a requisição somente com os dados criptografados
Para cada resposta seguinte, ele deve:Veri�car a assinatura
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAO cliente...
Autentica na sua API fornecendo as credenciaisPara cada requisição, assina e criptografa os dados(combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinaturaEnvia a requisição somente com os dados criptografados
Para cada resposta seguinte, ele deve:Veri�car a assinaturaDescriptografar o corpo
8 . 15
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinatura
8 . 16
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinaturaDescriptografar o corpo
8 . 16
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinaturaDescriptografar o corpoAo responder à requisição, deve assinar e criptografar osdados (combinação do corpo da requisição + URL);
8 . 16
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinaturaDescriptografar o corpoAo responder à requisição, deve assinar e criptografar osdados (combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dados
8 . 16
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinaturaDescriptografar o corpoAo responder à requisição, deve assinar e criptografar osdados (combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinatura
8 . 16
FLUXO DE CRIPTOGRAFIA E ASSINATURAA cada requisição recebida, o servidor deve...
Veri�car a assinaturaDescriptografar o corpoAo responder à requisição, deve assinar e criptografar osdados (combinação do corpo da requisição + URL);
Utiliza um algoritmo de hash para assinar os dadosCriptografa os dados mais a assinaturaEnvia a requisição somente com os dados criptografados
8 . 16
CONCLUINDO...Segurança não é trivialSegurança não é fácilSegurança não é para leigosNenhum sistema operante é invencível
9
CONCLUINDO...Segurança não é trivialSegurança não é fácilSegurança não é para leigosNenhum sistema operante é invencível,mas você deve di�cultar o trabalho de atacantes
9
CONCLUINDO...Segurança não é trivialSegurança não é fácilSegurança não é para leigosNenhum sistema operante é invencível,mas você deve di�cultar o trabalho de atacantesSaiba equilibrar e avaliar a relação de custo-benefício entresegurança e usabilidade
9
OBRIGADO!SLIDES CONTATO
GitHub e Twitter
viniciuscampitelli.com
@vcampitelli
10