PageRenderTime 59ms CodeModel.GetById 29ms RepoModel.GetById 1ms app.codeStats 0ms

/pt-br/advanced/best-practice-security.md

https://gitlab.com/HDworley/expressjs.com
Markdown | 299 lines | 241 code | 58 blank | 0 comment | 0 complexity | 1d62dc10aa59f3793469e3d51517963d MD5 | raw file
  1. ---
  2. layout: page
  3. title: Melhores Práticas de Segurança para o Express em Produção
  4. menu: advanced
  5. lang: pt-br
  6. ---
  7. # Melhores Práticas em Produção: Segurança
  8. ## Visão Geral
  9. O termo *"produção"* refere-se ao estágio no ciclo de vida do software onde um aplicativo ou API está geralmente
  10. disponível para os seus usuários finais ou consumidores. Em contrapartida, no estágio de *"desenvolvimento"*,
  11. você ainda está ativamente escrevendo e testando o código, e o aplicativo não está aberto para acesso externo. Os ambiente de sistema correspondentes são conhecidos como ambientes de *produção* e *desenvolvimento*,
  12. respectivamente.
  13. Os ambientes de desenvolvimento e produção são geralmente
  14. configurados de forma diferente e possuem requisitos completamente
  15. diferentes. O que é bom em desenvolvimento pode não ser aceitável na produção. Por exemplo, em um ambiente de desenvolvimento você pode
  16. desejar registros detalhados de erros para depuração, enquanto o
  17. mesmo comportamento pode se tornar um risco de segurança em um
  18. ambiente de produção. E em desenvolvimento, você não precisa se
  19. preocupar com a escalabilidade, confiabilidade, e desempenho,
  20. enquanto estas preocupações se tornam críticas na produção.
  21. Este artigo discute algumas melhores práticas de segurança para
  22. aplicativos do Express implementadas na produção.
  23. ## Não use versões descontinuadas ou vulneráveis do Express
  24. Os Express 2.x e 3.x não são mais mantidos. Problemas de
  25. segurança e desempenho nestas versões não serão corrigidos. Não use-as! Se
  26. não tiver migrado para a versão 4, siga o [guia de migração](/{{ page.lang }}/guide/migrating-4.html).
  27. Assegure-se também de que não esteja usando nenhuma das versões
  28. vulneráveis do Express listadas na [Página de
  29. atualizações de segurança](/{{ page.lang }}/advanced/security-updates.html). Se estiver, atualize para uma das
  30. liberações estáveis, preferivelmente a mais recente.
  31. ## Use TLS
  32. Se o seu aplicativo negocia com ou transmite dados sensíveis,
  33. use a [Segurança
  34. da Camada de Transporte](https://en.wikipedia.org/wiki/Transport_Layer_Security) (TLS) para proteger a conexão e os
  35. dados. Esta tecnologia criptografa os dados antes deles serem
  36. enviados do cliente para o servidor, assim evitando alguns ataques
  37. comuns (e fáceis). Apesar de solicitações Ajax e POST não parecerem
  38. visivelmente óbvias e parecerem "ocultas" em navegadores, o seu
  39. tráfego de rede é vulnerável a [sniffing de pacotes](https://en.wikipedia.org/wiki/Packet_analyzer) e
  40. [ataques man-in-the-middle ](https://en.wikipedia.org/wiki/Man-in-the-middle_attack).
  41. Você pode estar familiarizado com a criptografia Secure Sockets Layer(SSL). [O
  42. TLS é simplesmente a próxima progressão do](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380515(v=vs.85).aspx). Em outras palavras, se você estava usando o SSL antes, considere fazer o
  43. upgrade para o TLS. Em geral, recomendamos o Nginx para lidar com o TLS. Para
  44. obter uma boa referência para configurar o TLS no Nginx (e outros servidores), consulte
  45. [Configurações
  46. Recomendadas de Servidores (Mozilla Wiki)](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations).
  47. Além disso, uma ferramenta útil para obter um certificado TLS
  48. gratuito é a [Let's
  49. Encrypt](https://letsencrypt.org/about/), uma autoridade de certificação (CA) gratuita,
  50. automatizada, e aberta fornecida pelo
  51. [Grupo de Pesquisas de
  52. Segurança da Internet (ISRG)](https://letsencrypt.org/isrg/).
  53. ## Use Helmet
  54. O [Helmet](https://www.npmjs.com/package/helmet) pode
  55. ajudar a proteger o seu aplicativo de algumas vulnerabilidades da web
  56. bastante conhecidas configurando os cabeçalhos HTTP adequadamente.
  57. O Helmet é na realidade apenas uma coleção de nove funções de
  58. middlewares menores que configuram cabeçalhos HTTP relacionados à
  59. segurança:
  60. * A [csp](https://github.com/helmetjs/csp) configura o cabeçalho `Content-Security-Policy` para ajudar a evitar ataques de cross-site scripting e outras injeções cross-site.
  61. * A [hidePoweredBy](https://github.com/helmetjs/hide-powered-by) remove o cabeçalho `X-Powered-By`.
  62. * A [hpkp](https://github.com/helmetjs/hpkp) inclui os cabeçalhos [Public Key Pinning](https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning) para evitar ataques man-in-the-middle com certificados falsificados.
  63. * A [hsts](https://github.com/helmetjs/hsts) configura o cabeçalho `Strict-Transport-Security`
  64. que impinge conexões seguras (HTTP sobre SSL/TLS) com o servidor.
  65. * A [ieNoOpen](https://github.com/helmetjs/ienoopen) configura o `X-Download-Options` para o IE8+.
  66. * A [noCache](https://github.com/helmetjs/nocache) configura os cabeçalhos `Cache-Control` e Pragma
  67. para desativar o armazenamento em cache no lado do cliente.
  68. * A [noSniff](https://github.com/helmetjs/dont-sniff-mimetype)
  69. configura o `X-Content-Type-Options` para evitar que os navegadores procurem por MIME uma resposta a partir do
  70. content-type declarado.
  71. * A [frameguard](https://github.com/helmetjs/frameguard)
  72. configura o cabeçalho `X-Frame-Options` para fornecer proteção [clickjacking](https://www.owasp.org/index.php/Clickjacking).
  73. * A [xssFilter](https://github.com/helmetjs/x-xss-protection)
  74. configura o `X-XSS-Protection` para ativar o filtro
  75. de Cross-site scripting (XSS) nos navegadores da web mais recentes.
  76. Instale o Helmet como qualquer outro módulo:
  77. <pre>
  78. <code class="language-sh" translate="no">
  79. $ npm install --save helmet
  80. </code>
  81. </pre>
  82. Em seguida use-o no seu código:
  83. <pre>
  84. <code class="language-javascript" translate="no">
  85. ...
  86. var helmet = require('helmet');
  87. app.use(helmet());
  88. ...
  89. </code>
  90. </pre>
  91. ### No mínimo, desative o cabeçalho X-Powered-By
  92. Se não desejar usar o Helmet, então pelo menos desative o
  93. cabeçalho `X-Powered-By`. Invasores podem utilizar
  94. este cabeçalho (que fica ativado por padrão) para detectar
  95. aplicativos executando o Express e então iniciar ataques
  96. especificamente direcionados a eles.
  97. Portanto, a melhor prática é desligar o cabeçalho com o método
  98. `app.disable()`:
  99. <pre>
  100. <code class="language-javascript" translate="no">
  101. app.disable('x-powered-by');
  102. </code>
  103. </pre>
  104. Se usar o `helmet.js`, ele cuida disso por você.
  105. ## Use cookies de maneira segura
  106. Para assegurar que os cookies não deixem o seu aplicativo
  107. aberto a ataques, não use o cookie de sessão padrão e configure as
  108. opções de segurança de cookies adequadamente.
  109. Existem dois módulos de middleware principais para sessão de
  110. cookies:
  111. * [express-session](https://www.npmjs.com/package/express-session)
  112. que substitui o middleware `express.session`
  113. integrado no Express 3.x.
  114. * [cookie-session](https://www.npmjs.com/package/cookie-session)
  115. que substitui o middleware `express.cookieSession` integrado no Express 3.x.
  116. A principal diferença entre esses dois módulos é como eles salvam os dados de cookies de sessão. O middleware [express-session](https://www.npmjs.com/package/express-session)
  117. armazena os dados da sessão no servidor; ele salva apenas o ID da
  118. sessão no cookie, não os dados da sessão. Por padrão, ele usa
  119. armazenamento em memória e não é projetado para um ambiente de
  120. produção. Em produção, será necessário configurar um armazenamento de
  121. sessão escalável; consulte a lista de [armazenamentos
  122. de sessão compatíveis](https://github.com/expressjs/session#compatible-session-stores).
  123. Em contrapartida, o middleware [cookie-session](https://www.npmjs.com/package/cookie-session)
  124. implementa um armazenamento apoiado em cookies: ele serializa a sessão inteira para o cookie, ao invés de apenas a chave da sessão. Use apenas quando os dados da sessão são relativamente pequenos e facilmente codificados como números primitivos(ao invés de objetos). Apesar de navegadores supostamente suportarem pelo menos 4096 bytes por cookie, para assegurar que você não exceda o limite, não exceda
  125. um tamanho de 4093 bytes por domínio. Além disso, esteja ciente de que os dados do cookie serão visíveis para o cliente, portanto se
  126. houver razão para mantê-los seguros ou obscuros, então o express-session pode ser uma escolha melhor.
  127. ### Não use o nome do cookie da sessão padrão
  128. Usando o nome do cookie da sessão padrão pode deixar o seu
  129. aplicativo aberto a ataques. O problema de segurança levantado é
  130. parecido ao do `X-Powered-By`: um invasor em
  131. potencial poderia usá-lo para identificar o servidor e direcionar
  132. ataques de acordo com ele.
  133. Para evitar este problema, use nomes de cookie genéricos; por
  134. exemplo usando o middleware [express-session](https://www.npmjs.com/package/express-session):
  135. <pre>
  136. <code class="language-javascript" translate="no">
  137. var session = require('express-session');
  138. app.set('trust proxy', 1) // trust first proxy
  139. app.use( session({
  140. secret : 's3Cur3',
  141. name : 'sessionId',
  142. })
  143. );
  144. </code>
  145. </pre>
  146. ### Configure as opções de segurança de cookie
  147. Configure as seguintes opções de cookie para aprimorar a
  148. segurança:
  149. * `secure` - Assegura que o navegador envie o cookie por HTTPS.
  150. * `httpOnly` - Assegura que o cookie seja enviado apenas por HTTP(S), não por cliente JavaScript, ajudando
  151. assim a se proteger contra ataques de cross-site scripting.
  152. * `domain` - indica o domínio do cookie; use-o para comparação contra o domínio do servidor em que a URL está
  153. sendo solicitada. Se elas corresponderem, verifique o atributo de caminho em seguida.
  154. * `path` - indica o caminho do cookie; use-o para comparação contra o caminho da solicitação. Se este e o domínio corresponderem, então envie o cookie na solicitação.
  155. * `expires` - use para configurar uma data de
  156. expiração para cookies persistentes.
  157. Aqui está um exemplo usando o middleware [cookie-session](https://www.npmjs.com/package/cookie-session):
  158. <pre>
  159. <code class="language-javascript" translate="no">
  160. var session = require('cookie-session');
  161. var express = require('express');
  162. var app = express();
  163. var expiryDate = new Date( Date.now() + 60 * 60 * 1000 ); // 1 hour
  164. app.use(session({
  165. name: 'session',
  166. keys: ['key1', 'key2'],
  167. cookie: { secure: true,
  168. httpOnly: true,
  169. domain: 'example.com',
  170. path: 'foo/bar',
  171. expires: expiryDate
  172. }
  173. })
  174. );
  175. </code>
  176. </pre>
  177. ## Assegure que suas dependências sejam seguras
  178. Usar o npm para gerenciar as dependências do aplicativo é
  179. poderoso e conveniente. Mas os pacotes utilizados podem conter
  180. vulnerabilidades críticas de segurança que poderiam afetar também o
  181. seu aplicativo. A segurança do seu aplicativo é tão forte quanto o
  182. "elo mais fraco" em suas dependências.
  183. Use uma ou ambas das duas seguintes ferramentas para auxiliá-lo
  184. a assegurar a segurança de pacotes de terceiros utilizados por você:
  185. [nsp](https://www.npmjs.com/package/nsp) e [requireSafe](https://requiresafe.com/). Essas
  186. duas ferramentas fazem em grande parte a mesma coisa.
  187. [nsp](https://www.npmjs.com/package/nsp) é uma
  188. ferramenta de linha de comandos que verifica o banco de dados de
  189. vulnerabilidades do [Node
  190. Security Project](https://nodesecurity.io/) para determinar se o seu aplicativo utiliza
  191. pacotes com vulnerabilidades conhecidas. Instale-a como segue:
  192. <pre>
  193. <code class="language-sh" translate="no">
  194. $ npm i nsp -g
  195. </code>
  196. </pre>
  197. Use este comando para enviar o arquivo `npm-shrinkwrap.json` para validação para o [nodesecurity.io](https://nodesecurity.io/):
  198. <pre>
  199. <code class="language-sh" translate="no">
  200. $ nsp audit-shrinkwrap
  201. </code>
  202. </pre>
  203. Use este comando para enviar o arquivo `package.json` para validação para o [nodesecurity.io](https://nodesecurity.io/):
  204. <pre>
  205. <code class="language-sh" translate="no">
  206. $ nsp audit-package
  207. </code>
  208. </pre>
  209. Aqui está como usar o [requireSafe](https://requiresafe.com/) para auditar seus módulos Node:
  210. <pre>
  211. <code class="language-sh" translate="no">
  212. $ npm install -g requiresafe
  213. $ cd your-app
  214. $ requiresafe check
  215. </code>
  216. </pre>
  217. ## Considerações adicionais
  218. Aqui estão algumas recomendações adicionais da excelente [Lista
  219. de Verificação de Segurança do Node.js](https://blog.risingstack.com/node-js-security-checklist/). Refira-se a esta postagem do blog para obter todos os detalhes destas recomendações:
  220. * Implemente limitações de tráfego para evitar ataques de força
  221. bruta contra a autenticação. Uma forma de fazer isso é usar o [Gateway
  222. da API do StrongLoop](https://strongloop.com/node-js/api-gateway/) para impingir políticas de limitação de tráfego. Alternativamente,
  223. é possível usar um middleware como o [express-limiter](https://www.npmjs.com/package/express-limiter),
  224. mas fazer isso irá requerer que você modifique seu código de alguma forma.
  225. * Use o middleware [csurf](https://www.npmjs.com/package/csurf) para se proteger contra falsificações de solicitação cross-site (CSRF).
  226. * Sempre filtrar e limpar a entrada do usuário para se proteger de ataques de cross-site scripting (XSS) e injeção de comando.
  227. * Proteja-se contra ataques de injeção de SQLs usando consultas parametrizadas ou instruções preparadas.
  228. * Use a ferramenta de software livre [sqlmap](http://sqlmap.org/) para detectar
  229. vulnerabilidades de injeção de SQL no seu aplicativo.
  230. * Use as ferramentas [nmap](https://nmap.org/) e [sslyze](https://github.com/nabla-c0d3/sslyze) para
  231. testar a configuração das suas cifras SSL, chaves, e renegociação, bem como a validade do seu certificado.
  232. * Use o [safe-regex](https://www.npmjs.com/package/safe-regex) para assegurar que suas expressões regulares não estejam suscetíveis
  233. a ataques [negação de serviço de expressões regulares](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).
  234. ## Evitar outras vulnerabilidades conhecidas
  235. Fique atento às recomendações do
  236. [Node Security
  237. Project](https://nodesecurity.io/advisories) que podem afetar o Express ou outros módulos usados
  238. pelo seu aplicativo. Em geral, o Node Security Project é um excelente
  239. recurso para conhecimento e ferramentas sobre segurança do Node.
  240. Finalmente, os aplicativos do Express - como outros aplicativos web - podem estar vulneráveis a uma variedade de ataques baseados na
  241. web. Familiarize-se com [vulnerabilidades web](https://www.owasp.org/index.php/Top_10_2013-Top_10) conhecidas e tome precauções para evitá-las.