Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ coverage.xml
# Django stuff:
*.log
*.pot
tracker/settings.py
dojo/settings.py

# Vim swapfiles
*.swp
Expand All @@ -60,11 +60,11 @@ docs/_build/
*.crt
*.csr
*.key
tracker/migrations
tracker/static/img/threat/*
tracker/uploads/risk/*
tracker/scans/scan*
tracker/uploads/threat/*
dojo/migrations
dojo/static/img/threat/*
dojo/uploads/risk/*
dojo/scans/scan*
dojo/uploads/threat/*
.idea

weekly.txt
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Description

![Screenshot of TestTrack](./doc/img/screenshot1.png)
![Screenshot of DefectDojo](./doc/img/screenshot1.png)

TestTrack is a tool created by the Security Engineering team at Rackspace to
DefectDojo is a tool created by the Security Engineering team at Rackspace to
track testing efforts. It attempts to streamline the testing process by
offering features such as templating, report generation, metrics, and baseline
self-service tools. Though it was designed with security folks in mind, there
Expand All @@ -21,7 +21,7 @@ For more information, please see [the doc folder](./doc)

# About Us

TestTrack is maintained by:
DefectDojo is maintained by:

- Greg Anderson ([@\_GRRegg](https://twitter.com/_GRRegg))
- Charles Neill ([@ccneill](https://twitter.com/ccneill))
Expand All @@ -34,4 +34,4 @@ With past contributions from:

# License

<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">TestTrack</span> created by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Greg Anderson, Charles Neill, and Jay Paz</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">DefectDojo</span> created by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Greg Anderson, Charles Neill, and Jay Paz</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
4 changes: 2 additions & 2 deletions Vagrantfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.ssh.forward_agent = true

config.vm.hostname = "tt"
config.vm.hostname = "dd"
config.vm.network :private_network, ip: "192.168.13.37"
config.vm.define "tt" do |tt|
config.vm.define "dd" do |dd|
end

config.vm.provision "ansible" do |ansible|
Expand Down
2 changes: 1 addition & 1 deletion ansible/main.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
- name: TestTrack
- name: DefectDojo
hosts: servers
roles:
- webserver
Expand Down
76 changes: 38 additions & 38 deletions ansible/roles/webserver/tasks/app.yml
Original file line number Diff line number Diff line change
@@ -1,141 +1,141 @@
---
- name: Create TestTrack directory
file: path={{ tt_install_dir }} state=directory owner={{ tt_user }} group=www-data
- name: Create DefectDojo directory
file: path={{ dd_install_dir }} state=directory owner={{ dd_user }} group=www-data

- name: Download TestTrack
git: repo={{ tt_git_repo }} dest={{ tt_install_dir }} accept_hostkey=yes version=master force=yes recursive=no key_file=/home/{{ tt_user }}/.ssh/id_rsa
- name: Download DefectDojo
git: repo={{ dd_git_repo }} dest={{ dd_install_dir }} accept_hostkey=yes version=master force=yes recursive=no key_file=/home/{{ dd_user }}/.ssh/id_rsa

- name: Give ownership to tt_user
file: path={{ tt_install_dir }} recurse=yes owner={{ tt_user }} group=www-data state=directory
- name: Give ownership to dd_user
file: path={{ dd_install_dir }} recurse=yes owner={{ dd_user }} group=www-data state=directory

- name: Check if gunicorn log file exists
stat: path={{ gunicorn_log_file }}
register: glf

- name: Create gunicorn log file
file: path={{ gunicorn_log_file }} state=touch owner={{ tt_user }} group=www-data
file: path={{ gunicorn_log_file }} state=touch owner={{ dd_user }} group=www-data
when: glf.stat.exists == False

- name: Generate Django secret
shell: 'cat /dev/urandom | tr -dc "a-zA-Z0-9" | head -c 128'
args:
creates: '{{ tt_install_dir }}/tracker/settings.py'
creates: '{{ dd_install_dir }}/dojo/settings.py'
register: django_secret

- name: Populate TestTrack settings file
template: src=settings.j2 dest={{ tt_install_dir }}/tracker/settings.py owner={{ tt_user }} group=www-data
- name: Populate DefectDojo settings file
template: src=seddings.j2 dest={{ dd_install_dir }}/dojo/settings.py owner={{ dd_user }} group=www-data

- name: Install virtualenv
pip: name=virtualenv

- name: Setup virtualenv
shell: virtualenv {{ venv_dir }} creates={{ venv_dir }}/bin/activate
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install Django
pip: name=Django version=1.6.10 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install MySQL-Python
pip: name=MySQL-python virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install Pillow
pip: name=Pillow version=2.3.0 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install South
pip: name=South version=0.8.4 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install django-secure
pip: name=django-secure version=1.0 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install django-tastypie
pip: name=django-tastypie version=0.11.1 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install gunicorn
pip: name=gunicorn version=19.1.1 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install Python-nmap
pip: name=python-nmap version=0.3.4 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install pytz
pip: name=pytz version=2013.9 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install requests
pip: name=requests version=2.2.1 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install wsgiref
pip: name=wsgiref version=0.1.2 virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install django-tastypie-swagger
pip: name=django-tastypie-swagger virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install django-filter
pip: name=django-filter virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install supervisor
pip: name=supervisor state=present virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Install humanize
pip: name=humanize state=present virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Run Django 'syncdb' command
django_manage: command=syncdb app_path={{ tt_install_dir }} virtualenv={{ venv_dir }}
django_manage: command=syncdb app_path={{ dd_install_dir }} virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Create Django superuser
shell: echo "from django.contrib.auth.models import User; User.objects.create_superuser('{{ tt_super_user }}', '{{ tt_super_user_email }}', '{{ tt_super_user_pass }}')" | {{ venv_dir }}/bin/python {{ tt_install_dir }}/manage.py shell && touch /home/{{ tt_user }}/.supercreated
shell: echo "from django.contrib.auth.models import User; User.objects.create_superuser('{{ dd_super_user }}', '{{ dd_super_user_email }}', '{{ dd_super_user_pass }}')" | {{ venv_dir }}/bin/python {{ dd_install_dir }}/manage.py shell && touch /home/{{ dd_user }}/.supercreated
args:
creates: /home/{{ tt_user }}/.supercreated
creates: /home/{{ dd_user }}/.supercreated
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Run Django 'migrate' command
django_manage: command=migrate app_path={{ tt_install_dir }} virtualenv={{ venv_dir }}
django_manage: command=migrate app_path={{ dd_install_dir }} virtualenv={{ venv_dir }}
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'

- name: Find any running TT instances on our gunicorn port
- name: Find any running DD instances on our gunicorn port
shell: "ps aux | grep '[r]unserver' | grep '{{ gunicorn_port }}' | awk '{print $2}'"
register: instances
ignore_errors: True

- name: Kill any TT instances on our gunicorn port
- name: Kill any DD instances on our gunicorn port
shell: "kill {{ instances.stdout }}"
when: instances.stdout
ignore_errors: True

- name: Start TT
shell: 'nohup {{ venv_dir }}/bin/python {{ tt_install_dir }}/manage.py runserver 0.0.0.0:{{ gunicorn_port }} >>{{ gunicorn_log_file }} 2>&1 &'
- name: Start DD
shell: 'nohup {{ venv_dir }}/bin/python {{ dd_install_dir }}/manage.py runserver 0.0.0.0:{{ gunicorn_port }} >>{{ gunicorn_log_file }} 2>&1 &'
sudo: yes
sudo_user: '{{ tt_user }}'
sudo_user: '{{ dd_user }}'
4 changes: 2 additions & 2 deletions ansible/roles/webserver/tasks/os.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
- name: Create www-data group
group: name=www-data state=present

- name: Create TestTrack user
user: name={{ tt_user }} groups=sudo,www-data append=yes state=present generate_ssh_key=yes ssh_key_comment="Generated by ansible for TT"
- name: Create DefectDojo user
user: name={{ dd_user }} groups=sudo,www-data append=yes state=present generate_ssh_key=yes ssh_key_comment="Generated by ansible for DD"
8 changes: 4 additions & 4 deletions ansible/roles/webserver/tasks/sql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
- name: Start MySQL server
service: name=mysql state=started enabled=true

- name: Create MySQL DB for TestTrack
mysql_db: name={{ tt_sql_db }} state=present collation=utf8_general_ci
- name: Create MySQL DB for DefectDojo
mysql_db: name={{ dd_sql_db }} state=present collation=utf8_general_ci

- name: Create MySQL User for TestTrack
mysql_user: name={{ tt_sql_user }} password={{ tt_sql_pass }} priv={{ tt_sql_db }}.*:ALL host=localhost state=present
- name: Create MySQL User for DefectDojo
mysql_user: name={{ dd_sql_user }} password={{ dd_sql_pass }} priv={{ dd_sql_db }}.*:ALL host=localhost state=present

20 changes: 10 additions & 10 deletions ansible/roles/webserver/templates/settings.j2
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Django settings for tracker project.
# Django settings for dojo project.
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG
Expand All @@ -16,16 +16,16 @@ ADMINS = (

MANAGERS = ADMINS

TRACKER_ROOT = '{{ tt_install_dir }}/tracker'
DOJO_ROOT = '{{ dd_install_dir }}/dojo'

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2',
# 'mysql','sqlite3' or 'oracle'.
'NAME': '{{ tt_sql_db }}', # Or path to database file if using sqlite3.
'NAME': '{{ dd_sql_db }}', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': '{{ tt_sql_user }}',
'PASSWORD': '{{ tt_sql_pass }}',
'USER': '{{ dd_sql_user }}',
'PASSWORD': '{{ dd_sql_pass }}',
'HOST': 'localhost', # Empty for localhost through domain sockets
# or '127.0.0.1' for localhost through TCP.
'PORT': '3306', # Set to empty string for default.
Expand Down Expand Up @@ -61,7 +61,7 @@ USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = '{{ tt_install_dir }}/media/'
MEDIA_ROOT = '{{ dd_install_dir }}/media/'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
Expand Down Expand Up @@ -119,10 +119,10 @@ MIDDLEWARE_CLASSES = (
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'tracker.middleware.LoginRequiredMiddleware',
'dojo.middleware.LoginRequiredMiddleware',
)

ROOT_URLCONF = 'tracker.urls'
ROOT_URLCONF = 'dojo.urls'
LOGIN_URL = '/login'
LOGIN_EXEMPT_URLS = (
r'^static/',
Expand All @@ -133,7 +133,7 @@ LOGIN_EXEMPT_URLS = (
)

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'tracker.wsgi.application'
WSGI_APPLICATION = 'dojo.wsgi.application'

TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates"
Expand All @@ -150,7 +150,7 @@ INSTALLED_APPS = (
'django.contrib.messages',
'django.contrib.staticfiles',
'south',
'tracker',
'dojo',
'django.contrib.admin',
'gunicorn',
'tastypie',
Expand Down
36 changes: 18 additions & 18 deletions ansible/vars.yml
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
---
application_name: 'TestTrack'
application_name: 'DefectDojo'
root_pass: 'r00tr00t'

# The Linux user account that TestTrack will run under
tt_user: 'tt'
tt_user_pass: 'th1sisasup3rs3cur3passw0rd12345'
# The Linux user account that DefectDojo will run under
dd_user: 'dd'
dd_user_pass: 'th1sisasup3rs3cur3passw0rd12345'

# MySQL settings
tt_sql_user: 'tt'
tt_sql_pass: 'pl34se$replace@these^stupid&passwords'
tt_sql_db: 'tt'
dd_sql_user: 'dd'
dd_sql_pass: 'pl34se$replace@these^stupid&passwords'
dd_sql_db: 'dd'

# Defines where the TestTrack application will be installed
tt_install_dir: /usr/share/django-TestTrack
# Defines where the DefectDojo application will be installed
dd_install_dir: /usr/share/django-DefectDojo

# Defines the folder where TestTrack's virtualenv will be stored
venv_dir: /home/{{ tt_user }}/.venvs/{{ application_name }}
# Defines the folder where DefectDojo's virtualenv will be stored
venv_dir: /home/{{ dd_user }}/.venvs/{{ application_name }}

# Set up the Django/TestTrack superuser
tt_super_user: 'root'
tt_super_user_pass: 'An0th3r@SuPeR@Secure@PASSWORD'
tt_super_user_email: 'root@localhost'
# Set up the Django/DefectDojo superuser
dd_super_user: 'root'
dd_super_user_pass: 'An0th3r@SuPeR@Secure@PASSWORD'
dd_super_user_email: 'root@localhost'

# Repo link for TestTrack
tt_git_repo: 'https://github.com/rackerlabs/django-TestTrack.git'
# Repo link for DefectDojo
dd_git_repo: 'https://github.com/rackerlabs/django-DefectDojo.git'

# Gunicorn settings
gunicorn_num_workers: 3
gunicorn_timeout: 120
gunicorn_port: 9999
gunicorn_log_file: '{{ tt_install_dir }}/gunicorn.log'
gunicorn_log_file: '{{ dd_install_dir }}/gunicorn.log'
Loading