
O Secure Coding Dojo é uma plataforma para fornecer conhecimento de codificação segura.
# Sobre o Secure Coding Dojo
O Secure Coding Dojo é uma plataforma para fornecer treinamento em codificação segura.
Embora venha com seu próprio aplicativo de treinamento vulnerável (o site Insecure.Inc), o portal de treinamento pode ser usado em conjunto com outros aplicativos de treinamento.
A força da plataforma está na sua extensibilidade e na integração com a plataforma de colaboração de desenvolvimento comumente usada, o Slack.
O portal de treinamento pode ser facilmente configurado na nuvem e as instruções para a configuração no AWS Elastic Beanstalk estão disponíveis abaixo.
Não deixe de verificar também a [wiki](https://github.com/OWASP/SecureCodingDojo/wiki) para mais detalhes sobre a implantação e instalação do Dojo.
# Demo
Baixe a [demo](https://github.com/OWASP/SecureCodingDojo/blob/main/demo/Secure%20Coding%20Dojo%20Demo.mp4) para ter uma noção do portal de treinamento e do aplicativo Insecure.Inc.
Dê uma olhada também em /screenshots

# Experimente
Os passos a seguir fornecem a configuração básica do Dojo. Para configuração avançada e integrações, consulte a [wiki](https://github.com/OWASP/SecureCodingDojo/wiki/Deploying-with-Docker)
- Instale a versão mais recente do Docker.
- Faça um git clone do repositório
- Mude o diretório para a raiz do repositório
- Configure uma variável de ambiente DATA_DIR como ponto de montagem para os arquivos do dojo. Em *nix/mac, modifique o .bash_profile da seguinte forma:
`export DATA_DIR="/YOUR_DATA_DIR"`
- No Mac, você deve permitir que o Docker acesse este diretório em Docker > Preferences > File Sharing
- Reinicie o terminal
- Execute com:
`docker-compose up`
# Por que Outro Site de Treinamento em Segurança?
Embora sites de treinamento de código aberto para ensinar conceitos de segurança de aplicações não sejam novidade, o público-alvo desses sites tem sido pentesters e hackers éticos.
O Secure Coding Dojo é pensado principalmente como uma plataforma de treinamento para desenvolvedores, e aqui está o porquê:
- Integra-se com o Slack para autenticação
- Permite agrupar os participantes de acordo com suas equipes de desenvolvimento
- Permite que as equipes acompanhem o progresso e compitam entre si
- Cada lição é construída como um par ataque/defesa. Os desenvolvedores podem observar as fraquezas do software conduzindo o ataque e, após resolverem o desafio, aprendem sobre as defesas de software associadas (blocos de código)
- As lições predefinidas são baseadas nos erros de software mais perigosos do MITRE (também conhecidos como SANS 25), portanto o foco está nos erros de software, e não nas técnicas de ataque
- Os desafios de hacking predefinidos são criados para o nível iniciante e mantêm os desenvolvedores engajados
* Em outros sites de treinamento ou CTFs, há um aspecto de quebra-cabeça nos desafios, ótimo para o público pentester, mas que pode fazer alguns desenvolvedores perderem o interesse. No Secure Coding Dojo, o foco é demonstrar a vulnerabilidade.
* Existem dicas que ajudam os desenvolvedores enquanto exploram o problema para não ficarem travados
# SecureCodingDojo e Requisitos de Conformidade
Embora não garantamos conformidade, o treinamento pode ser usado para atender a requisitos de conformidade como PCI 6.5.a. Consulte o documento de currículo do Insecure.Inc sobre o mapeamento para SANS 25/ OWASP Top 10 / PCI 6.5
# Pré-requisitos de Desenvolvimento
Portal de treinamento
- Instale o VS Code
- node/npm (desenvolvido com v10)
- OPCIONAL: servidor MySQL + MySQL Workbench (desenvolvido com MySQL 5.7)
Insecure.Inc
- Desenvolvido em Java EE
- Versão mais recente do Eclipse Java EE (desenvolvido com Neon) + Java 1.8 + Tomcat 8 para o aplicativo de treinamento do Insecure.Inc
# Instruções de Configuração do Ambiente de Desenvolvimento
Portal de treinamento
- Mais detalhes na [wiki](https://github.com/OWASP/SecureCodingDojo/wiki/Development-Setup-for-Training-Portal)
Insecure.inc
- Mais detalhes na [wiki](https://github.com/OWASP/SecureCodingDojo/wiki/Development-Setup-for-Insecure.Inc)
# Compilação
Portal de treinamento
- Execute o script ./buildTrainingPortal.sh. Ele criará uma imagem docker e um pacote AWS Elastic Beanstalk
Insecure.Inc
- Clique com o botão direito no projeto para exportar como um arquivo .war e coloque-o na pasta /webapps da sua instalação do Tomcat 8.
# Hospedando o Insecure.Inc
Consulte a [wiki](https://github.com/OWASP/SecureCodingDojo/wiki/Running-Insecure.Inc).
# Implantando o Portal de Treinamento
Mais informações na [wiki](https://github.com/OWASP/SecureCodingDojo/wiki/Running-the-training-portal).
# Instruções de Configuração do Slack
Você precisará criar um aplicativo Slack para autenticação.
- Acesse https://api.slack.com/
- Clique em Start Building e siga as instruções para criar um Slack App em sua equipe Slack de desenvolvimento
- Depois que seu aplicativo for criado, você poderá obter suas credenciais do aplicativo para configurar seu config.json
- Configure as URLs de redirecionamento em OAuth & Permissions. Por exemplo, para uma configuração localhost, a URL de redirecionamento seria: http://localhost:8081/public/slack/callback
# Instruções de Configuração do Google
A autenticação do Google também pode ser configurada no config.json. Você precisará de uma conta de desenvolvedor do Google e obter as credenciais OAuth no console da API do Google: https://console.developers.google.com
No mesmo local, você configurará seu domínio e as URIs de redirecionamento autorizadas. Por exemplo, para uma configuração localhost, a URL de redirecionamento seria: http://localhost:8081/public/google/callback
# Instruções de Configuração de Autenticação Local
Para equipes pequenas ou imagens pré-configuradas, a autenticação via Slack ou Google pode não ser uma opção. Nesse cenário, você pode configurar a autenticação usando um arquivo local simples.
Consulte a wiki para mais informações.
- Copie localUsers.json.sample para localUsers.json
- Adicione a linha no config.json que especifica o localUsersPath
- Existem várias ressalvas com a autenticação local, como ausência de bloqueio de conta, expiração de senha etc.
# Instruções de Configuração do Banco de Dados
Se você não configurar um banco de dados, o portal de treinamento usará apenas um banco de dados SQLite local.
Você também pode instalar o MySQL e criar um banco de dados e credenciais para esse banco. Anote seu nome de usuário e senha, pois precisará deles mais tarde.
# Sementes de Chave de Criptografia e Variáveis de Ambiente
Você precisará configurar chaves de criptografia como variáveis de ambiente do sistema operacional. Em *nix/mac, modifique o .bash_profile da seguinte forma:
export ENC_KEY="put something random here"
export ENC_KEY_IV="put something random here"
O seguinte serve para impedir que os participantes gerem seus próprios códigos de desafio.
export CHALLENGE_MASTER_SALT="put something random here"
# Estendendo o Secure Coding Dojo
Você pode adicionar novas lições seguindo o modelo das existentes.
## Desafios
Os desafios são definidos em ./trainingportal/static/lessons
O arquivo definitions.json aponta para a descrição html do desafio correspondente, o link de execução e os blocos de código correspondentes pelo id do bloco de código.
Siga os exemplos já definidos para criar um novo.
.
+-- /trainingportal/static/lessons
| +-- modules.json //configuration file where lesson modules are defined
| +-- /attack-grams //visual representations of attacks included in challenge descriptions
| +-- /blackBelt //lesson module
| +--definitions.json //individual lesson definitions
| +--cwe494.md // html or markdown file including the lesson description
| +--cwe494.sol.md //solution for the lesson
| ....
| +--quiz.html
| +-- /secondDegreeBlackBelt
## Blocos de Código
Os blocos de código são definidos em ./trainingportal/static/codeBlocks. Esta pasta tem uma estrutura semelhante, com um json de definição e vários arquivos html para cada desafio.
.
+-- /trainingportal/static/codeBlocks
| +-- codeBlocksDefinitions.json //configuration file where code blocks are defined
| +-- authenticationByDefault.html //code block description html
| ...
| +-- useStrongDataEncryption.html