aboutsummaryrefslogtreecommitdiff
path: root/aulas/seguranca.rst
blob: f7c4e91c96eed8d20eeef6d63d0184e2de67e462 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
6. Segurança e privacidade
==========================

6.1 - Segurança da informação
-----------------------------

É a hora de falar sobre segurança e privacidade no desenvolvimento. Grosso
modo, podemos dividir a segurança da informação em algumas propriedades, como
por exemplo:

1. Confidencialidade: é a garantia de que apenas a comunicação poderá
   ser interpretada pelas partes envolvidas, isto é, mesmo havendo interceptação
   por terceiros o conteúdo da comunicação estará protegido.

2. Integridade: é a garantia de que o conteúdo da comunicação não foi
   adulterado por terceiros.

3. Disponibilidade: garantia de que o sistema de comunicação estará acessível
   sempre que necessário.

4. Autenticidade: garante que cada uma das partes possa verificar se está de
   fato se comunicando com quem pensa estar se comunicando, isto é, a garantia
   de que não há um impostor do outro lado da comunicação.

Opcionalmente também podemos falar de:

5. Não-repúdio: garantir que as partes envolvidas na comunicação não possam negar
   ter participado da comunicação.

6. Anonimato: garantia de de as partes envolvidas na comunicação não possam ser
   identificadas.

Nem sempre os sistemas satisfazem todas essas propriedades!

6.2 - Segurança começa no desenvolvimento
-----------------------------------------

* Segurança: para fins do nosso curso, é a proteção da aplicação.
* Privacidade: proteção dos dados em poder da aplicação.
* Criptografia é só uma parte das práticas seguras.
* Obscuridade não é segurança: disclosures são saudáveis no desenvolvimento.

6.3 - Modelagem de ameaças e auditoria
--------------------------------------

* É fácil (e barato) produzir e difícil (e caro) encontrar vulnerabilidades.
* Modelagem de ameaças (teoria) e testes de penetração (prática): inverta os papéis: e se você fosse o/a atacante?
* Segurança por isolamento ajuda, mas botar a aplicação dentro de um cordão sanitário protege mais o ambiente de hospedagem do que a aplicação.

6.4 - Exemplo de ameaça: princípio das permissões mínimas
---------------------------------------------------------

* Exemplo de ameaça: o(a) atacante tem permissão de escrita no código da aplicação.
* Mitigação: forneça o mínimo de permissões necessárias para a sua aplicação e libere o acesso conforme necessário.
* Atenção! Permissões de arquivos são propriedades no sistema de arquivo!
* Elas não são necessariamente preservadas com a cópia de arquivos entre sistemas!

Roteiro do screencast:

::

  # Vendo as permissões e a posse de arquivos e pastas
  ls -l projetos

  # Mudando as permissões de um arquivo
  touch cofrinho
  chmod 000 cofrinho
  chmod 600 cofrinho

  # Mudando a posse de arquivos e pastas
  chown

6.5 - Criptografia básica
-------------------------

* Criptografia não é tudo em segurança, porém é o requisito básico e essencial.
* Ameaça: machine-in-the-middle.
* Mitigação:
  * Comunicação cifrada: HTTPS.
  * Checagem de integridade de código no git e em geral (assinaturas e checksums).

6.6 - Use bibliotecas criptográficas consolidadas!
--------------------------------------------------

* Erros de implementação são grandes fontes de brechas de segurança.
* Caso você precise implementar primitivas criptográficas no seu código, use bibliotecas existentes!
* Encapsule as conexões das suas aplicações em canais criptografados.
* TLS é o protocolo mais consolidado e adequado, apesar de não ser perfeito.

6.7 - HTTPS
-----------

6.7 - O que é
~~~~~~~~~~~~~

* HTTPS: HTTP em cima de uma conexão SSL/TLS.
* Padrão dos anos 90 e melhorado desde então.
* Se bem implementado: oferece segurança da informação num nível aceitável, porém não oferece anonimato.
* Se mal implementado: só oferece ilusão de segurança.
* Movimento crescente para tornar HTTPS padrão em todos os sites!

6.7 - Certificados para HTTPS
-----------------------------

* No HTTPS, a autenticidade é obtida usando uma "cadeia de certificação" provida por autoridades certificadoras.
* Checagem feita no navegador.
* É um esquema altamente vulnerável: a qualquer momento o castelo de cartas pode ruir.
* As alternativas a esse modelo ainda são incipientes.

6.8 - Atividades
----------------

#. Faça um pequeno documento de modelagem de ameaças para o seu projeto. Coloque-o na forma de "ameaça/mitigação". Organize cada par ameaça/mitigação segundo probabilidade decrescente de ocorrência e custo crescente de implementação, facilitando a implementação de cada medida de segurança.
#. Desafio: caso seu projeto seja uma aplicação web, obtenha um certificado e configure uma conexão HTTPS.

6.9 - Referências
-----------------

* Imagens usadas nos vídeos?
* `Let's Encrypt <https://letsencrypt.org>`_.
* `Segurança da informação – Wikipédia, a enciclopédia livre <https://pt.wikipedia.org/wiki/Seguran%C3%A7a_da_informa%C3%A7%C3%A3o>`_.