├── .gitignore ├── Dockerfile ├── LICENSE.md ├── README.md ├── VERSION ├── example └── agencyapp │ ├── README.md │ ├── certifications │ └── fisma-low-impact.yaml │ ├── components │ ├── CentOS-fake │ │ ├── CP-CONTINGENCY_PLANNING.yaml │ │ ├── SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml │ │ └── component.yaml │ ├── Cisco-Cloud-Rtr-fake │ │ ├── AU-AUDIT_AND_ACCOUNTABILITY.yaml │ │ ├── MA-MAINTENANCE.yaml │ │ ├── PL-PLANNING.yaml │ │ ├── SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml │ │ ├── SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml │ │ ├── SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml │ │ └── component.yaml │ ├── Cylance-fake │ │ ├── AC-ACCESS_CONTROL.yaml │ │ ├── MA-MAINTENANCE.yaml │ │ ├── PL-PLANNING.yaml │ │ ├── SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml │ │ ├── SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml │ │ └── component.yaml │ ├── GovReady-fake │ │ ├── CM-CONFIGURATION_MANAGEMENT.yaml │ │ ├── PS-PERSONNEL_SECURITY.yaml │ │ ├── SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml │ │ ├── SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml │ │ └── component.yaml │ ├── Jenkins-fake │ │ ├── IA-IDENTIFICATION_AND_AUTHENTICATION.yaml │ │ ├── MP-MEDIA_PROTECTION.yaml │ │ ├── SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml │ │ ├── SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml │ │ └── component.yaml │ ├── Keycloak-fake │ │ ├── AC-ACCESS_CONTROL.yaml │ │ ├── CP-CONTINGENCY_PLANNING.yaml │ │ ├── MA-MAINTENANCE.yaml │ │ ├── PM-PROGRAM_MANAGEMENT.yaml │ │ ├── SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml │ │ └── component.yaml │ ├── OpenLDAP-fake │ │ ├── AC-ACCESS_CONTROL.yaml │ │ ├── AU-AUDIT_AND_ACCOUNTABILITY.yaml │ │ ├── CM-CONFIGURATION_MANAGEMENT.yaml │ │ ├── SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml │ │ └── component.yaml │ └── SOC-Services-fake │ │ ├── AC-ACCESS_CONTROL.yaml │ │ ├── CA-SECURITY_ASSESSMENT_AND_AUTHORIZATION.yaml │ │ ├── CP-CONTINGENCY_PLANNING.yaml │ │ ├── IR-INCIDENT_RESPONSE.yaml │ │ ├── MA-MAINTENANCE.yaml │ │ ├── SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml │ │ └── component.yaml │ ├── lint.py │ ├── make_oc_compliant.py │ ├── opencontrol.yaml │ ├── outputs │ ├── Example-doc.md │ └── word │ │ └── Example-word-doc.docx │ ├── standards │ ├── NIST-SP-800-53-rev4.yaml │ ├── hipaa-draft.yaml │ └── opencontrol.yaml │ └── team │ └── team.yaml ├── hypergrc ├── __init__.py ├── __main__.py ├── app_yaml.py ├── csv.py ├── opencontrol.py ├── render.py ├── routes.py ├── ssp.py └── templates │ ├── all_components.html │ ├── assessments.html │ ├── base.html │ ├── component.html │ ├── component_comparison.html │ ├── component_guide.html │ ├── component_new.html │ ├── components.html │ ├── control_combined.html │ ├── control_grid.html │ ├── control_new.html │ ├── controls.html │ ├── documents.html │ ├── evidence_list.html │ ├── govready-q_format.html │ ├── index.html │ ├── login.html │ ├── poams.html │ ├── settings.html │ ├── system_new.html │ └── team.html ├── ref ├── certifications │ ├── dfars-nist-800-171.yaml │ └── fisma-low-impact.yaml └── standards │ ├── NIST-800-171r1.yaml │ ├── NIST-SP-800-53-rev4.yaml │ ├── hipaa-control-id-list.txt │ ├── hipaa-draft.yaml │ └── opencontrol.yaml ├── repos.conf.example ├── requirements.txt ├── static ├── css │ └── base.css ├── img │ └── Rocky_Mountain_National_Park.jpg └── js │ ├── autosize.js │ └── autosize.min.js └── utils ├── lines-of-code-ac.py └── lint.py /.gitignore: -------------------------------------------------------------------------------- 1 | controls/ 2 | inputs/ 3 | outputs/\~\$* 4 | .vscode/ 5 | 6 | # Python, virtual env 7 | venv 8 | *.pyc 9 | .pyc 10 | __pycache__ 11 | 12 | # hyperGRC local files 13 | repos.conf 14 | repos.conf* 15 | 16 | # misc 17 | todo_list.txt 18 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Build on Docker's official CentOS 7 image. 2 | FROM centos:7 3 | 4 | # Expose the port that hyperGRC listens on by default. 5 | EXPOSE 8000 6 | 7 | # Put the Python source code here. 8 | WORKDIR /usr/src/app 9 | 10 | # Set up the locale. Lots of things depend on this. 11 | ENV LANG en_US.UTF-8 12 | ENV LC_ALL en_US.UTF-8 13 | ENV LANGUAGE en_US:en 14 | 15 | # Install required system packages. Python 3.6 is available in IUS. 16 | RUN \ 17 | yum -y install https://centos7.iuscommunity.org/ius-release.rpm \ 18 | && yum -y update \ 19 | && yum -y install \ 20 | python36u python36u-pip \ 21 | && yum clean all && rm -rf /var/cache/yum 22 | 23 | # Copy in the Python module requirements and install them. 24 | COPY requirements.txt ./ 25 | RUN pip3.6 install --no-cache-dir -r requirements.txt 26 | 27 | # Copy in remaining source code. (We put this last because these 28 | # change most frequently, so there is less to rebuild if we put 29 | # infrequently changed steps above.) 30 | COPY VERSION VERSION 31 | COPY example example 32 | COPY hypergrc hypergrc 33 | COPY static static 34 | 35 | # Create an empty repos.conf file so the program doesn't die 36 | # when run without command-line arguments. 37 | RUN cat > repos.conf 38 | 39 | # Create a non-root user and group for the application to run as to guard against 40 | # run-time modification of the system and application. 41 | RUN groupadd application && \ 42 | useradd -g application -d /home/application -s /sbin/nologin -c "application process" application && \ 43 | chown -R application:application /home/application 44 | USER application 45 | 46 | # Add the source files to the PYTHONPATH. 47 | ENV PYTHONPATH="/usr/src/app:${PYTHONPATH}" 48 | 49 | # Set the startup command to launch hyperGRC and bind on all network interfaces 50 | # so that the host can connect. Since the end-user will not visit it at 0.0.0.0, 51 | # override the address that hyperGRC will recommend that the user visit so there 52 | # is no confusion. 53 | ENTRYPOINT [ "/usr/bin/python3.6", \ 54 | "-m", "hypergrc", \ 55 | "--bind", "0.0.0.0:8000", \ 56 | "--showaddress", "http://localhost:8000" ] 57 | 58 | # Additionally set the default command-line argument. The CMD value below is 59 | # simply appended to the ENTRYPOINT command-line to form the start command. 60 | # We'll set it to "/opencontrol" so that hyperGRC looks there for an OpenControl 61 | # repository, and then it is up to the host `docker container run` command to 62 | # mount a volume at that location. 63 | # 64 | # The advantage of using CMD separately from ENTRYPOINT is that ENTRYPOINT cannot 65 | # be changed by the `docker run` command, but CMD can be overridden simply by 66 | # adding more arguments to the run command after the image name. So e.g. 67 | # `docker container run hypergrc:latest /path1 /path2` would replace the default 68 | # `/opencontrol` argument with two other container paths, if you want hyperGRC 69 | # to read other directories. 70 | CMD ["/opencontrol"] 71 | 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hyperGRC 2 | 3 | hyperGRC is a lightweight, in-browser tool for managing compliance-as-code repositories in OpenControl format. 4 | 5 | The goal is a low-profile, hyper-useful IT GRC tool supporting compliance-as-code practices beginning with managing reusable OpenControl files for information technology systems and components. 6 | 7 | **hyperGRC uses a data format _mostly_ compatible with OpenControl. There are a few extensions to the OpeControl informal data specification. As OpenControl matures, hyperGRC will support if feasible.** 8 | 9 | ## Requirements 10 | 11 | * Python 3.5+ 12 | * A few packages listed in `requirements.txt` 13 | 14 | ## Installation and Running 15 | 16 | ### Install and run hyperGRC from source 17 | 18 | ```sh 19 | git clone https://github.com/GovReady/hyperGRC.git hypergrc 20 | cd hypergrc 21 | pip install -r requirements.txt 22 | 23 | # Start hyperGRC 24 | python -m hypergrc example/agencyapp 25 | ``` 26 | 27 | NOTES: 28 | * You may need to adjust the command for `pip` (.e.g `pip3`) depending on how Python 3 was installed on your system. 29 | * Type CTRL+C to stop 30 | 31 | ### Install and run hyperGRC with virtualenv 32 | 33 | Use virtualenv to keep the Python package dependencies for hyperGRC isolated from other Python software on your workstation. 34 | 35 | ```sh 36 | git clone https://github.com/GovReady/hyperGRC.git hypergrc 37 | cd hypergrc 38 | virtualenv venv -p python3 39 | source venv/bin/activate 40 | pip install -r requirements.txt 41 | 42 | # Activate virtualenv 43 | source venv/bin/activate 44 | 45 | # Start hyperGRC 46 | python -m hypergrc example/agencyapp 47 | ``` 48 | NOTES: 49 | * Type CTRL+C to stop 50 | * Type `deactivate` to exit virtualenv 51 | 52 | ### Install and run hyperGRC with Docker 53 | 54 | A `Dockerfile` is provided in this repository to launch hyperGRC in a Docker container. The `Dockerfile` is based on CentOS 7. 55 | 56 | ```sh 57 | git clone https://github.com/GovReady/hyperGRC.git hypergrc 58 | cd hypergrc 59 | docker image pull centos:7 60 | docker image build --tag hypergrc:latest . 61 | 62 | # Start container with mounted volume (-v) and mapped ports (-p) in ephemeral mode (--rm) and interactive mode (-it) 63 | REPOSITORY=`pwd`/example/agencyapp 64 | docker container run -v $REPOSITORY:/opencontrol -p 127.0.0.1:8000:8000 --rm -it hypergrc:latest 65 | 66 | # visit hyperGRC at `http://127.0.0.1:8000` 67 | ``` 68 | 69 | NOTES: 70 | * Provide the container with access to an OpenControl repository on your workstation by mounting a volume using the docker `-v` option. Workstation path must be an [absolute directory](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems) and container path must be `/opencontrol`. Above, we use `` `pwd` `` to help form the absolute path to the included example OpenControl files. `REPOSITORY` can be set to any absolute path on wokstation. 71 | * Map a port on your workstation to the container using the Docker `-p` option, such as `-p 127.0.0.1:8000:8000`. 72 | * Start hyperGRC in ephemeral `--rm` and interactive mode `-it` so that you can end it by typing CTRL+C. 73 | * Visit hyperGRC at `http://127.0.0.1:8000`. 74 | 75 | ## Command-line options 76 | 77 | ### OpenControl repository paths 78 | 79 | hyperGRC accepts several command-line arguments. You've already seen one: the local path to the OpenControl repository. You may specify one or more paths to OpenControl repositories to open them all up within hyperGRC. 80 | 81 | ```sh 82 | python -m hypergrc example/agencyapp path/to/project2 ... 83 | ``` 84 | 85 | If you do not specify any paths on the command line, hyperGRC reads a list of paths to repositories from a file named `repos.conf`, e.g.: 86 | 87 | ```text 88 | repos.conf 89 | --------------- 90 | example/agencyapp 91 | path/to/project2 92 | ``` 93 | 94 | Create this file if it does not exist if you would like to start hyperGRC without any command-line options. An example of such a file is in [repos.conf.example](repos.conf.example). 95 | 96 | Start as: 97 | 98 | ```bash 99 | python -m hypergrc 100 | ``` 101 | 102 | You may also specify files containing lists of paths to repositories on the command-line by preceding the listing file with an `@`-sign. The command above is equivalent to: 103 | 104 | ```bash 105 | python -m hypergrc @repos.conf 106 | ``` 107 | 108 | ### Other options 109 | 110 | To bind to a host and port other than the default `localhost:8000`, use `--bind host:port`, e.g.: 111 | 112 | ```bash 113 | python -m hypergrc --bind 0.0.0.0:80 114 | ``` 115 | 116 | ## Understanding the compliance-as-code data files 117 | 118 | OpenControl creates readable structured standard for representing component to control mappings. hyperGRC reads and writes OpenControl data YAML files, including: 119 | 120 | * A system `opencontrol.yaml` file which containins metadata about the information technology system and lists the system's components and compliance standards in use. 121 | * One or more `component.yaml` files which describe components of the information technology system. Each component has a name and other metadata and list of control implementations (i.e. control narrative texts). 122 | * Zero or more `opencontrol.yaml` files for standards, i.e. lists of compliance controls such as NIST SP 800-53, NIST SP 800-53 Appendix J Priacy Controls, HIPAA, and so on. 123 | 124 | A typical OpenControl repository contains files in the following directory layout: 125 | 126 | ``` 127 | ├── opencontrol.yaml 128 | ├── standards 129 | │ ├── opencontrol.yaml 130 | │ ├── NIST-SP-800-53-r4.yaml 131 | │ └── HIPAA.yaml 132 | └── components 133 | ├── Component 1 134 | │ └── component.yaml 135 | └── Component 2 136 | └── component.yaml 137 | ``` 138 | 139 | Although not currently conformant with the OpenControl standard, hyperGRC also allows components to be broken out into multiple files: 140 | 141 | ``` 142 | ... 143 | └── components 144 | ├── Component 1 145 | │ ├── component.yaml 146 | │ ├── AC-ACCESS_CONTROL.yaml 147 | │ ├── SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml 148 | │ ... 149 | └── Component 2 150 | ├── component.yaml 151 | ... 152 | ``` 153 | 154 | For more details, see the files in example/agencyapp. 155 | 156 | ## Generating system security plans 157 | 158 | ### From the command line 159 | 160 | hyperGRC includes a command-line tool to generate a partial system security plan in Markdown format. The tool concatenates all of the control narratives in an OpenControl system repository, adding headings and control descriptions. 161 | 162 | For example, to generate a system security plan for the example application stored in this repository, run: 163 | 164 | python3 -m hypergrc.ssp -d example/agencyapp 165 | 166 | The system security plan is printed to the console. It will look like: 167 | 168 | ```md 169 | # Agency App Example System System Security Plan 170 | 171 | # NIST SP 800-53 Revision 4 172 | 173 | ## SI: System and Information Integrity 174 | 175 | ### SI-3: Malicious Code Protection 176 | 177 | > The organization: 178 | > a. Employs malicious code protection mechanisms at information system entry 179 | > and exit points to detect and eradicate malicious code; 180 | > b. Updates... 181 | 182 | ##### OpenLDAP 183 | 184 | Destruction configuration for developer access to organization-defined... 185 | ``` 186 | 187 | You will probably want to redirect the output to a file, e.g.: 188 | 189 | python3 -m hypergrc.ssp -d example/agencyapp > ssp.md 190 | 191 | If you have [pandoc](https://pandoc.org/) installed, you could then convert the SSP into HTML or a Microsoft Word document: 192 | 193 | ```sh 194 | pandoc -t html < ssp.md > ssp.html 195 | pandoc -t docx ssp.md -o ssp.docx 196 | ``` 197 | 198 | The `-d` option instructs the SSP generator to include control descriptions. You may also add `--family XX` (e.g. `--family CP`) to output only controls for the given control family. 199 | 200 | ## Customizing project appearance 201 | 202 | The appearance of each project can be customized by adding a css file called `_extensions/hypergrc/static/css/repo.css` to the project's repository and referencing the path to the `_extensions/hypergrc` directory in the `opencontrol.yaml` file like so: 203 | 204 | ``` 205 | # ... 206 | standards: 207 | - ./standards/NIST-SP-800-53-r4.yaml 208 | - ./standards/NIST-SP-800-53-r4-privacy.yaml 209 | certifications: 210 | - ./certifications/fisma-low-impact.yaml 211 | _extensions: 212 | - ./_extensions/hypergrc 213 | ``` 214 | 215 | hyperGRC's includes `_extensions/hypergrc/static/css/repo.css` as the last css file loaded in the base template when the custom extension is specified in the `opencontrol.yaml` manifest and the file `repo.css` exists. 216 | 217 | ### Example project `repo.css` files 218 | 219 | Customize project with a background color in project's. 220 | 221 | ``` 222 | /* Custom project styles */ 223 | 224 | body { 225 | background-color: rgb(247, 247, 247); 226 | } 227 | ``` 228 | 229 | Customize project with a background image. Only URL loaded images are currently supported. Please respect creator's copyrights and only use properly-licensed images. 230 | 231 | ``` 232 | /* Custom project styles */ 233 | 234 | body { 235 | /*background-color: rgb(247, 247, 247);*/ 236 | background: url("https://upload.wikimedia.org/wikipedia/commons/f/f7/Rocky_Mountain_National_Park.jpg") no-repeat center center fixed; 237 | -webkit-background-size: cover; 238 | -moz-background-size: cover; 239 | -o-background-size: cover; 240 | background-size: cover; 241 | } 242 | ``` 243 | 244 | ## Development 245 | 246 | Development is easier if hyperGRC is run in a way that it restarts when any source code changes occur, so that you can see your changes immediately. `nodemon` from the Node package manager is a handy tool to do that. [Install Node](https://nodejs.org/en/download/) [Mac OS X users first [read this](https://gist.github.com/DanHerbert/9520689)] and then run: 247 | 248 | ```sh 249 | npm install -g nodemon 250 | nodemon -e py -x python3 -m hypergrc 251 | ``` 252 | 253 | ## Licensing 254 | 255 | hyperGRC is copyrighted 2018 by GovReady PBC and available under the open source license indicated in [LICENSE.md](LICENSE.md). 256 | 257 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | v0.5.2+dev 2 | -------------------------------------------------------------------------------- /example/agencyapp/README.md: -------------------------------------------------------------------------------- 1 | Machine readable representation of NIST SP 800-53 control implementations for Agency App. 2 | 3 | # Notes 4 | 5 | -------------------------------------------------------------------------------- /example/agencyapp/certifications/fisma-low-impact.yaml: -------------------------------------------------------------------------------- 1 | # Based off Table D-2: SECURITY CONTROL BASELINES 2 | # in NIST 800-53 3 | # Current as of 2018-JUNE-2018 4 | # 5 | # Found on Page D-2 of NIST 800-53 rev 4: 6 | # https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-53r4.pdf 7 | # 8 | name: FISMA Low Impact 9 | standards: 10 | 11 | NIST SP 800-53 Revision 4: 12 | AC-1: {} 13 | AC-2: {} 14 | AC-3: {} 15 | AC-7: {} 16 | AC-8: {} 17 | AC-14: {} 18 | AC-17: {} 19 | AC-18: {} 20 | AC-19: {} 21 | AC-20: {} 22 | AC-22: {} 23 | AT-1: {} 24 | AT-2: {} 25 | AT-3: {} 26 | AT-4: {} 27 | AU-1: {} 28 | AU-2: {} 29 | AU-3: {} 30 | AU-4: {} 31 | AU-5: {} 32 | AU-6: {} 33 | AU-8: {} 34 | AU-9: {} 35 | AU-11: {} 36 | AU-12: {} 37 | CA-1: {} 38 | CA-2: {} 39 | CA-3: {} 40 | CA-5: {} 41 | CA-6: {} 42 | CA-7: {} 43 | CA-9: {} 44 | CM-1: {} 45 | CM-2: {} 46 | CM-4: {} 47 | CM-6: {} 48 | CM-7: {} 49 | CM-8: {} 50 | CM-10: {} 51 | CM-11: {} 52 | CP-1: {} 53 | CP-2: {} 54 | CP-3: {} 55 | CP-4: {} 56 | CP-9: {} 57 | CP-10: {} 58 | IA-1: {} 59 | IA-2 (1): {} 60 | IA-2 (12): {} 61 | IA-4: {} 62 | IA-5 (1): {} 63 | IA-5 (11): {} 64 | IA-6: {} 65 | IA-7: {} 66 | IA-8 (1): {} 67 | IA-8 (2): {} 68 | IA-8 (3): {} 69 | IA-8 (4): {} 70 | IR-1: {} 71 | IR-2: {} 72 | IR-4: {} 73 | IR-5: {} 74 | IR-6: {} 75 | IR-7: {} 76 | IR-8: {} 77 | MA-1: {} 78 | MA-2: {} 79 | MA-4: {} 80 | MA-5: {} 81 | MP-1: {} 82 | MP-2: {} 83 | MP-6: {} 84 | MP-7: {} 85 | PE-1: {} 86 | PE-2: {} 87 | PE-3: {} 88 | PE-6: {} 89 | PE-8: {} 90 | PE-12: {} 91 | PE-13: {} 92 | PE-14: {} 93 | PE-15: {} 94 | PE-16: {} 95 | PL-1: {} 96 | PL-2: {} 97 | PL-4: {} 98 | PS-1: {} 99 | PS-2: {} 100 | PS-3: {} 101 | PS-4: {} 102 | PS-5: {} 103 | PS-6: {} 104 | PS-7: {} 105 | PS-8: {} 106 | RA-1: {} 107 | RA-2: {} 108 | RA-3: {} 109 | RA-5: {} 110 | SA-1: {} 111 | SA-2: {} 112 | SA-3: {} 113 | SA-4 (10): {} 114 | SA-5: {} 115 | SA-9: {} 116 | SC-1: {} 117 | SC-5: {} 118 | SC-7: {} 119 | SC-12: {} 120 | SC-13: {} 121 | SC-15: {} 122 | SC-20: {} 123 | SC-21: {} 124 | SC-22: {} 125 | SC-39: {} 126 | SI-1: {} 127 | SI-2: {} 128 | SI-3: {} 129 | SI-4: {} 130 | SI-5: {} 131 | SI-12: {} 132 | -------------------------------------------------------------------------------- /example/agencyapp/components/CentOS-fake/CP-CONTINGENCY_PLANNING.yaml: -------------------------------------------------------------------------------- 1 | name: CentOS-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CP-7 (5) 6 | control_name: Equivalent Information Security Safeguards 7 | family: CP 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Planned 12 | narrative: 13 | - text: Withdrawn assessment the enables the by of cabling. Across into of organization 14 | 2 business processes. 15 | -------------------------------------------------------------------------------- /example/agencyapp/components/CentOS-fake/SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml: -------------------------------------------------------------------------------- 1 | name: CentOS-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SC-7 (21) 6 | control_name: Isolation Of Information System Components 7 | family: SC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Or approved exception specification controls pii. 14 | -------------------------------------------------------------------------------- /example/agencyapp/components/CentOS-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: CentOS-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - CP-CONTINGENCY_PLANNING.yaml 5 | - SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml 6 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/AU-AUDIT_AND_ACCOUNTABILITY.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AU-7 6 | control_name: Audit Reduction And Report Generation 7 | family: AU 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Planned 12 | narrative: 13 | - text: Component organizational analysis information communicates assignment a. 14 | Default information assessments system the. All flow incidents the. Information 15 | contingency the the the transfer. Clearances insider mobile a enable. Frequency 16 | assignment to c reduce process. Top-Level a organization-defined the attributes 17 | organization-defined of a. The sharing/collaboration and assessment personnel 18 | system. Security and to with reported of or. System selection storage unsuccessful. 19 | Sc-4 verification to. Prohibits updates to and. Implements 1 certificate assignment. 20 | Requirements e and. Assignment certificates of develops individuals the system. 21 | Plan roles information includes updates system a. Assignment control and b to 22 | explicitly. Tool system organization-defined the employs. Information access 23 | guidance issues using assignment. 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/MA-MAINTENANCE.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: MA-4 (2) 6 | control_name: Document Nonlocal Maintenance 7 | family: MA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Telecommunications the on-demand the of. The h credentials access updates 14 | facility. Disposal information for on covert and for facilitate. Privileged 15 | the coupling 3)(c 1)(e 4. And frequency 4)(b)(2 privileges the 5)(a. The managed 16 | organization organization system. Capability employs code the. And within organization 17 | and security the. Functions deficiencies makes information the information. 18 | System the from unauthorized a information. Missions authorizations organization 19 | the organization reviews the. 20 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/PL-PLANNING.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: PL-8 (1) 6 | control_name: Defense-In-Depth 7 | family: PL 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: Needs the cycle. Monitors inspects and. Internal and from system time filling 14 | access organization-defined. Or physical to be. Flows flow in information are 15 | components policy system. Planning notification to by. And service system failed. 16 | Acceptance the coordination provides and its. Implementation the the access 17 | the. The allocates maintenance tasks the security assignment. Subjects software 18 | to. And configurations sanitized a. Organization-Defined that control management 19 | implements. Installed organization-defined addresses logs. Identifies system-wide 20 | ensures service roles. Or exceptions or piv-i organization. D information system 21 | includes and date. And internet unusual assignment. Reliability authorization 22 | organization a assets. Audit organization a the repositories of environmental. 23 | The the procedures that facilities information are. Considerations the criteria 24 | decisions hazards the. 25 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SA-15 (4) 6 | control_name: Threat Modeling / Vulnerability Analysis 7 | family: SA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: The associated storage enforces security and the. The systems approved reviews 14 | personnel security organization. B for using scheduled. Categories frequency 15 | the or 1)(a information information information. The organization-defined of 16 | mail information enhance personnel maintenance. Or information and. Organization 17 | policies tests assignment. In for have processing users. Information common 18 | to assignment 4)(a requires organization-defined. The and system information 19 | the in off-loads standards. And monitoring the by. Eliminate and organization-defined 20 | or. Controls controls assignment be of remotely more. With service purging/wiping 21 | that. Organization the employs to mobile authorized. Mechanisms entering an 22 | testing roles in. Systems firmware multifactor the accordance. Access environments 23 | implements technology incidents system organization-defined. Read-Only organization-defined 24 | information automated strategy interfaces. Takes system approved with have. 25 | Be in transfer the. And the when the organization. Facility function security 26 | threats. And overlays mechanisms provides integrity. 27 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SC-5 (1) 6 | control_name: Restrict Internal Users 7 | family: SC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: Of certificates authorization the changes implemented. Process reviews assignment 14 | receipt policies the. Or implementation process the orders. Available of system 15 | the information. 16 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SI-4 (9) 6 | control_name: Testing Of Monitoring Tools 7 | family: SI 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Power to multiple information have. Assignment integrity and are duration 14 | third-party. Team authentication responds from organization security. Tests 15 | including information that among. The records types. Installation accounts location 16 | organization detail a system. Read organization organizational. Training operations 17 | to the software for the an. Security an of after reviews. Security the organization-defined 18 | organization-wide random via the. Out-Of-Band initiates system that monitoring 19 | the. Service up-to-date and the system a changes. Organization on organization-defined 20 | mobile assessment without take storage. Functions/Mechanisms the of a. Sources 21 | f is information recorded plan. Sanitization assurance planned by special detect 22 | that. 23 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cisco-Cloud-Rtr-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: Cisco-Cloud-Rtr-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - AU-AUDIT_AND_ACCOUNTABILITY.yaml 5 | - MA-MAINTENANCE.yaml 6 | - PL-PLANNING.yaml 7 | - SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml 8 | - SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml 9 | - SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml 10 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/AC-ACCESS_CONTROL.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AC-18 (5) 6 | control_name: Antennas / Transmission Power Levels 7 | family: AC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: Limits i.e employ presence regard and. To the and the a assignment. Facility 14 | security external contingency the requirements. Mutual authentication of by 15 | improvement used. Have the g actions organization pe-3. Providers information 16 | assignment frequency controls of organization. Organization authorization safe 17 | frequency. System the information compliance the. System boot to. Integrity 18 | applications or penetration a. Access ensuring the. And users to a occur. Organization-Defined 19 | configuration/connection system assignment implements and. The organization-defined 20 | or formal information ensures tool the. Integrated the system that information 21 | and. System into reference ac-14. Techniques eliminate feasible of plan access 22 | to. To from engineering does sharing system assignment. Access analysis are 23 | remote system virtualization. Associated the procedures results to the architecture 24 | e.g. System data a full. A training inputs. Employs and the associated and. 25 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/MA-MAINTENANCE.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: MA-3 (4) 6 | control_name: Restricted Tool Use 7 | family: MA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Planned 12 | narrative: 13 | - text: Tool provision purpose use into to 4)(a. 14 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/PL-PLANNING.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: PL-4 6 | control_name: Rules Of Behavior 7 | family: PL 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Posting and with verify organization develops. Of the information organization-defined 14 | roles standards command. Techniques to the information for to the. And audit 15 | a information. Notify on within disseminates available. 16 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SA-4 (7) 6 | control_name: Niap-Approved Protection Profiles 7 | family: SA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Planned 12 | narrative: 13 | - text: The facilitate organization components accessible impacts the. The functions 14 | on number system. Subjects procedures a to that scheduled having. That boundary 15 | external of to. B system protects b. Information functions to alerts with. A 16 | to service. Reviews or verifies information the organization-defined. Other 17 | security the process timing b 4)(b. Assigned content allows assignment organization-defined 18 | and the prohibits. To approved c generates or. 19 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SI-3 (6) 6 | control_name: Testing / Verification 7 | family: SI 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: To equipment a information purposes. 14 | -------------------------------------------------------------------------------- /example/agencyapp/components/Cylance-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: Cylance-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - AC-ACCESS_CONTROL.yaml 5 | - MA-MAINTENANCE.yaml 6 | - PL-PLANNING.yaml 7 | - SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml 8 | - SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml 9 | -------------------------------------------------------------------------------- /example/agencyapp/components/GovReady-fake/CM-CONFIGURATION_MANAGEMENT.yaml: -------------------------------------------------------------------------------- 1 | name: GovReady-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CM-1 6 | control_name: Configuration Management Policy And Procedures 7 | family: CM 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: 10 | - verification_key: amcs-01 11 | security_control_type: Other 12 | implementation_status: Inherited 13 | narrative: 14 | - text: Organization-Defined 4)(b 1)(a primary and system have for. Policy measurement 15 | organization-defined of. Sessions to consistent and coordinates. Facility components 16 | and program and sufficient. Requires information or system organization routes 17 | the. Security activities processes provides system types configuration. Organization 18 | service be system remote. Role-Based simultaneously system within. To of mandates 19 | within. Of policy organization-defined information are the. Of authorized and 20 | the recorded continuity the that. Code of is associated information are analyzes. 21 | The of policies organization-defined into security the. Integral results for 22 | for. Systems organization-defined official adequate compartments. Only information 23 | on the security collected individual by. Or that controlled and systems including 24 | the. In to plan assignment. Organization of evidence and organization-defined 25 | information. Information data/information the the to 8. Implementing tools system 26 | authorization objects output. Of the organization-defined to notifies to employs. 27 | Interfaces development types. Information agent implements organization-defined 28 | notifies. 29 | summary: ~ 30 | -------------------------------------------------------------------------------- /example/agencyapp/components/GovReady-fake/PS-PERSONNEL_SECURITY.yaml: -------------------------------------------------------------------------------- 1 | name: GovReady-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: PS-7 6 | control_name: Third-Party Personnel Security 7 | family: PS 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: Disaster password the over approves into the. Cryptographic a b resulting 14 | provides connection process. Response selection and been physical. A be object 15 | detect. Value coordination organization those communications the the activated. 16 | Provider reputation and roles. Components is employs identifying to employs 17 | security. Can the corrective to. The the in for. To system via system establishes 18 | organization-defined. Time the terms information. For e that. Criticality implementation 19 | during firmware. Information the level uses authorizations event incident. Identity 20 | examines system the the configuration/connection information. Maintain centrally 21 | privacy. Reject or organizational organization-defined security. Code inactive 22 | a design. 23 | summary: ~ 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/GovReady-fake/SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml: -------------------------------------------------------------------------------- 1 | name: GovReady-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SA-5 (1) 6 | control_name: Functional Properties Of Security Controls 7 | family: SA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: In Place 12 | narrative: 13 | - text: Establishes organization external transitional the are identifies. Initiating 14 | the that information an processes. Systems potential organization security. 15 | With the logs are system assessments. Components sc-7 descriptions resulting 16 | information use the required. Contingency in 1)(a assignment. Code telecommunication 17 | personnel unauthorized senior-level policy the. Organization-Defined 1 networking 18 | to of formats. Startup indicators automatically breadth facility. Develops the 19 | and faults. Selection assignment of assignment to resolution. Information that 20 | for capability with individuals or. Or appropriate organization-defined to and 21 | security. And entities system associated change. Or organization-defined date 22 | organization-defined strategy information reflected. Conventions and humidity 23 | assignment transmit review system. For authenticates of ability. Requiring to 24 | the an documentation potential. Organization-Defined selection components organization 25 | top-level the within. Inactivity actual of private or. Planning the controls 26 | and. Or overwrite occurrence si-4 continuous system organization. 27 | -------------------------------------------------------------------------------- /example/agencyapp/components/GovReady-fake/SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml: -------------------------------------------------------------------------------- 1 | name: GovReady-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SI-4 (20) 6 | control_name: Privileged Users 7 | family: SI 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Transferred sc-13 requiring controls process redundancy actions. On system 14 | validation enforce. The organization-defined alerts system policies authentication 15 | accurate. Trustworthiness is change information auditable where sanction. Exception 16 | services to a. Analysis provides information support the developer. Information 17 | operating category. Multiple policies realistic timely. Monitoring foreign advisories 18 | organization system. Switches use basis b the. That terminated by software limits 19 | incidents. 3)(B)(2 system service organization-defined. Information the or withdrawn 20 | suspicious component and assignment. Access automatically automated a. Fire 21 | personnel have and control decisions. And and support assignment the. Information 22 | the the child 4)(b e.g. Management operations sites ra-3 known. Into attack 23 | system or the not. And service information 1)(f model description all. The organization 24 | an organization-defined. Manner organizational access to equipment. System activation 25 | mechanisms selection to. Reviews ensure employs development assignment for. 26 | Credentials failure protects or organization 2 information. Part individuals 27 | identifies. Perspective or controls characteristics/parameters. Providers need 28 | among organization employs capability a a. 29 | -------------------------------------------------------------------------------- /example/agencyapp/components/GovReady-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: GovReady-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - CM-CONFIGURATION_MANAGEMENT.yaml 5 | - PS-PERSONNEL_SECURITY.yaml 6 | - SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml 7 | - SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml 8 | verifications: 9 | - key: amcs-01 10 | name: Acquia Managed Cloud snapshots documentation snapshot 11 | path: evidence/screenshots/amcs-01.png 12 | type: image 13 | link: https://docs.acquia.com/acquia-cloud/arch/security/availability/backups/#automatic-snapshots-for-disaster-recovery 14 | - key: amcs-01 15 | name: Acquia Managed Cloud snapshots admin screen screenshot 16 | path: evidence/screenshots/amcs-01b.png 17 | type: image 18 | link: https://docs.acquia.com/acquia-cloud/arch/security/availability/backups/#automatic-snapshots-for-disaster-recovery 19 | - key: gsvcr-01 20 | name: DNFSB.gov git repository screenshot 21 | path: evidence/screenshots/gsvcr-01.png 22 | type: image 23 | link: https://git.civicactions.com/dnfsb/ssp-csv-to-yaml 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/Jenkins-fake/IA-IDENTIFICATION_AND_AUTHENTICATION.yaml: -------------------------------------------------------------------------------- 1 | name: Jenkins-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: IA-3 6 | control_name: Device Identification And Authentication 7 | family: IA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Inherited 12 | narrative: 13 | - text: The the identified fails organization. Roles where software and selected 14 | selection provides. Service information to reviews damage. Receiving acceptable 15 | marks capability organization-defined. The system or information includes. The 16 | of reviews that explicit system capability. 3 using assignment time transfer. 17 | To information activities organization privileged disclosure across. 18 | -------------------------------------------------------------------------------- /example/agencyapp/components/Jenkins-fake/MP-MEDIA_PROTECTION.yaml: -------------------------------------------------------------------------------- 1 | name: Jenkins-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: MP-4 (1) 6 | control_name: Cryptographic Protection 7 | family: MP 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Planned 12 | narrative: 13 | - text: And formal to. Jointly sanitized for identified for at suppression. System 14 | enforces information organization. Revocations entry/exit by to websites. Information 15 | assignment and. Disseminates to dynamic the information. 16 | -------------------------------------------------------------------------------- /example/agencyapp/components/Jenkins-fake/SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml: -------------------------------------------------------------------------------- 1 | name: Jenkins-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SA-17 (6) 6 | control_name: Structure For Testing 7 | family: SA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: In procedures authentication received elements of. About using system prohibit. 14 | The plan as assignment. Mobile threats policy into and. Assignment selection 15 | to to collection product. Information changes the organizational. Or and to 16 | access information. Information period located to information intrusion-monitoring. 17 | Supplemental management disaster 1 users. By operational the object. The implements 18 | and retains alternate. And additional components components flow where. Privileged 19 | describe incorporated the organization scans system. Assessment receives the 20 | system component. Organization-Defined information policies organization points 21 | activities. The identifier read security control devices. Authorizations the 22 | includes information control additional. Organization-Defined system d implement. 23 | Enforced of requires collect handling information to. Organization-Defined and 24 | purpose system support. The when operational for authorized identifying monitoring. 25 | -------------------------------------------------------------------------------- /example/agencyapp/components/Jenkins-fake/SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml: -------------------------------------------------------------------------------- 1 | name: Jenkins-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SC-42 (3) 6 | control_name: Prohibit Use Of Devices 7 | family: SC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Planned 12 | narrative: 13 | - text: Organization selection exception information. Scanning maintain process 14 | the. Protection organization of risk. Assignment officials information implemented 15 | information system only. In functions logout notification. Telecommunications 16 | and time roles suppression. Be facilitate access procedures. Malice end switches 17 | report roles. Are qualified susceptibility information and assignment due by. 18 | Traffic personal the. The harmful system organization-defined received security 19 | organizational. Sc-13 the the controls. System protect a assignment time by 20 | management. Assignment separate assignment the as organization keys access. 21 | Of established to of establishment organization 1. In the and. Assignment or 22 | for 2)(a of develops associated organization. Anomalies and incident or. 23 | -------------------------------------------------------------------------------- /example/agencyapp/components/Jenkins-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: Jenkins-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - IA-IDENTIFICATION_AND_AUTHENTICATION.yaml 5 | - MP-MEDIA_PROTECTION.yaml 6 | - SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml 7 | - SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml 8 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/AC-ACCESS_CONTROL.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AC-22 6 | control_name: Publicly Accessible Content 7 | family: AC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Users by issues and 1)(b security 3)(c the. That information of of organization 14 | controlling. A monitoring incorporated changed revoking. Information the a for. 15 | Information roles 1)(c develops. And requirements systems site service with 16 | of c. Assignment deficiencies assume. Authorizations organization-defined systems 17 | organization-defined implementing specifies. Access organization-defined off 18 | team security into. 5)(B audit recorded all and sessions organization-defined. 19 | Identifies requiring appoints reviews that role-based. Procedures consideration 20 | indicating service. Organization a system for to authorizations. Agent and a 21 | upon oversight roles additional. Missions attempts organization-defined b 13)(c 22 | security. Systems attributes security other or information roles. Support organizational 23 | are. Official development purpose and. The access which. Implementation organization 24 | enforces. Roles protection types organization-defined of. Service information 25 | the privileges behalf types. System other provides system to. 26 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/CP-CONTINGENCY_PLANNING.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CP-9 (5) 6 | control_name: Transfer To Alternate Storage Site 7 | family: CP 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: The 2 individuals the types organization-defined organization-defined time. 14 | Selection assignment requirements reviews the. Organization continue organization 15 | group. For the formerly organization protection and individuals. Defined use 16 | recovery information system frequency. And/Or consistent trust mp-7. Have b 17 | organization-defined vulnerabilities negatives of. Uses include roles users 18 | includes of. And secure connection organization the the safeguards assignment. 19 | Which to partitions user. Meet tolerance system and components. The assignment 20 | time. Integrity layers to. Developer system the component. Withdrawn provides 21 | explicit continue requirements. Automatically of to higher access provides. 22 | Supporting the protects or organization-defined of information. Organization 23 | telecommunications team part at on of. Manage or notification processes. Frequency 24 | information assignment. Security e subnetworks commercial minimize cross-organization 25 | system. Functions determines the operational selection the employs. Change assignment 26 | and identifies implement approved. System security information selection enforce 27 | to user. 28 | summary: ~ 29 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/MA-MAINTENANCE.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: MA-6 (1) 6 | control_name: Preventive Maintenance 7 | family: MA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: The 1 centrally authorizes the uniquely system of. With information system 14 | assignment unauthorized ensures of. System system procedures facilities rate 15 | to and. To upon confidentiality operational of post-employment release. Plan 16 | organization-defined that that. And control number number the source. When information 17 | organizational implementing to and the security. And security properties assignment 18 | accounts assignment assignment within. Corresponding process authorizes attacks 19 | information of and. The describes associated 4)(c. The federal process and. 20 | Modification no cryptographic information. Subset cyber-physical emergency within 21 | organization prohibits policies state. At remedial components. Organization-Defined 22 | explicit to switches the processing agency. And cm-7 of system combinations. 23 | Where organization-defined a organization vulnerability contingency organization-defined. 24 | That non-operable d access forms an named. Organization to installed address 25 | requires tools mobile. D 3)(d employs than accessible. To implements mechanisms 26 | organization-defined a. Different in-house mechanisms functionality. Security 27 | highlight component of development or. Design state to organization-defined 28 | of. Require component satisfy the. Legally to and required pki-based. Security 29 | with components the. Assignment executive formal sa-12 information an. 30 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/PM-PROGRAM_MANAGEMENT.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: PM-5 6 | control_name: Information System Inventory 7 | family: PM 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: In Place 12 | narrative: 13 | - text: Spam the the inspections organization. Nonlocal the the personnel accessing. 14 | For of 1 system as enhance. The to take configuration/connection. Controls requirements 15 | the the investigations assignment time. The the such system and. Interviews 16 | information the individual to. Roles information original the and the collaborative. 17 | 1 convenes of access organization-defined handling. 18 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SA-11 (2) 6 | control_name: Threat And Vulnerability Analyses 7 | family: SA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Inherited 12 | narrative: 13 | - text: The access person only functions/mechanisms and of evidence. Operational 14 | non-privileged organization logon plan requests within authentication. Monitoring 15 | provides of privacy. Modified and users of. 16 | -------------------------------------------------------------------------------- /example/agencyapp/components/Keycloak-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: Keycloak-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - AC-ACCESS_CONTROL.yaml 5 | - CP-CONTINGENCY_PLANNING.yaml 6 | - MA-MAINTENANCE.yaml 7 | - PM-PROGRAM_MANAGEMENT.yaml 8 | - SA-SYSTEM_AND_SERVICES_ACQUISITION.yaml 9 | -------------------------------------------------------------------------------- /example/agencyapp/components/OpenLDAP-fake/AC-ACCESS_CONTROL.yaml: -------------------------------------------------------------------------------- 1 | name: OpenLDAP-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AC-1 6 | control_name: Access Control Policy And Procedures 7 | family: AC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Inherited 12 | narrative: 13 | - text: Information organization-defined monitoring organization. Organization established 14 | list non-national information. System assessment and. Responsible reuse an to 15 | dedicated. Services reported authorized perspective. Comply the software. Security 16 | maintain performs routed. Information organization that authorizations identified 17 | identified channels organization-defined. The within information and. From reviews 18 | missions assignment. By provides of displays and the. Au-6 scanning processing 19 | roles 2 the into. That and when the information the. System sanitized security 20 | response source to of. Or organization-defined protection that. The of personnel 21 | potential the security. The organization-defined to support an the authorization. 22 | That personnel selection accounts storage recovery within. Categorization to 23 | level 3)(a assignment of an. Other the applicable. 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/OpenLDAP-fake/AU-AUDIT_AND_ACCOUNTABILITY.yaml: -------------------------------------------------------------------------------- 1 | name: OpenLDAP-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AU-3 6 | control_name: Content Of Audit Records 7 | family: AU 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: In Place 12 | narrative: 13 | - text: Component re-implements clocks organization-defined organizational to system. 14 | That from required within policy unauthorized. Policies systems contingency 15 | the. Organization-Defined assignment organization-defined information. Of indicate 16 | authorization and. 17 | -------------------------------------------------------------------------------- /example/agencyapp/components/OpenLDAP-fake/CM-CONFIGURATION_MANAGEMENT.yaml: -------------------------------------------------------------------------------- 1 | name: OpenLDAP-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CM-2 6 | control_name: Baseline Configuration 7 | family: CM 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: Assignment on exercises the develops to. Organization-Defined more organization 14 | of for a. System respond output users. 1 that organization-defined provides 15 | organization-defined system system. Facilitate isolation physically introduce. 16 | Certificate a organization information service acceptable law. To authorizations 17 | information non-privileged training servers. Identifiers risk information. Coordination 18 | incorporated organization of vulnerabilities attributes to into. 19 | -------------------------------------------------------------------------------- /example/agencyapp/components/OpenLDAP-fake/SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml: -------------------------------------------------------------------------------- 1 | name: OpenLDAP-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SI-3 6 | control_name: Malicious Code Protection 7 | family: SI 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: In as the and information from. System to access checks incorporated. Destruction 14 | configuration for developer access to organization-defined. Response capacity 15 | the sessions time flaws ac-7. Sc-28 functions/mechanisms information on on-site 16 | organization. Integrity prevents governing organizational lighting. The components 17 | organization-defined f. Frequency ensures traveling. Necessary assignment the 18 | criteria of source computerized. Identified topics that protection at system. 19 | Information backup approved risk current the. And hardware develops system organization-defined. 20 | Organization-Defined system an. Time for accept and prevents equipment. Of frequency 21 | mandates functions one organization-defined. Be installation implements and. 22 | Organization-Defined higher the non-spreading access. Tools the information 23 | scheduled the. 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/OpenLDAP-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: OpenLDAP-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - AC-ACCESS_CONTROL.yaml 5 | - AU-AUDIT_AND_ACCOUNTABILITY.yaml 6 | - CM-CONFIGURATION_MANAGEMENT.yaml 7 | - SI-SYSTEM_AND_INFORMATION_INTEGRITY.yaml 8 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/AC-ACCESS_CONTROL.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: AC-4 (16) 6 | control_name: Information Transfers On Interconnected Systems 7 | family: AC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: In Place 12 | narrative: 13 | - text: To transmitted the the tests functions. To to cycle implementation having. 14 | For stores marks regulations develops develops and. On information current authorized 15 | limits for boundary incident. If components verification processes. The to system 16 | one the essential sanitizes. Organization-Defined the to backup key. Organization 17 | identified posing including devices are. Minimizes organization domains individual 18 | organization-defined maintains. The assignment employed logon planning. On to 19 | on does the the. Frames and and/or flaws within withdrawn and. Software organization-defined 20 | organizational multi-threaded common interface. Prohibit assignment individuals 21 | attack within messages organizational. Assignment sharing a that information 22 | contained. Data undergoing and or to information settings as. Access software 23 | or the depth reviews. Risk based for data. Personnel system change accounts. 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/CA-SECURITY_ASSESSMENT_AND_AUTHORIZATION.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CA-3 (2) 6 | control_name: Classified National Security System Connections 7 | family: CA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Planned 12 | narrative: 13 | - text: To the identifies. Process reviews an of. Applicable for invalid documented 14 | maintain reference. Chain system or transmit into. Of organization-defined of 15 | analysis of. Processes to the actions remediation assignment. Requires identifies 16 | the failure or implements child prior. Determine procedures the confidentiality 17 | performed to external. Roles or and or. That one needed component monitoring. 18 | Storage receiving disables levels on. Information the system child. The persistent 19 | by develops develops. Password-Based security or system do system of. Employs 20 | information the the testing. Organization-Defined information of activity the 21 | the system developer. With behavior discovers and. That the firmware assignment 22 | and the. Roles system organizational. Acceptable or compliance identified incorporated 23 | policies be. 24 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/CP-CONTINGENCY_PLANNING.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: CP-7 (6) 6 | control_name: Inability To Return To Primary Site 7 | family: CP 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Planned 12 | narrative: 13 | - text: Prevents valid operations to. Nonsecurity authorized encrypted withdrawn. 14 | Multi-Vulnerability/Multi-Hop authorization the policy on external environmental. 15 | And piv that or the. Preclude approves identification to or credentials authorized 16 | into. Cleared a information chain-related in information. Information and/or 17 | for organization organization-defined. Authorized information demonstrated and 18 | organization-defined. Or for the system make organizational information operations. 19 | Including orders integrity readily organization containing. The access of. System 20 | decisions information system. Information the an control of. And 2 protection 21 | among or. System separated unauthorized is by or. Have standardizes assignment 22 | incident f by components. Incident of and nonlocal managers indicating before. 23 | Organization have frequency the frequency information. C facility non-national 24 | activity the. Selection organization changes the. Controlling vulnerabilities 25 | reduce the. Accounts information those information organization-defined agreements 26 | provides. Organization information system recovery. Personnel employs with the. 27 | Of information system and includes information. Previous development unclassified 28 | determine generations and. 29 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/IR-INCIDENT_RESPONSE.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: IR-1 6 | control_name: Incident Response Policy And Procedures 7 | family: IR 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Hybrid 11 | implementation_status: Inherited 12 | narrative: 13 | - text: A assignment error effects. And assignment media implements number. A tests 14 | operations management implemented logically personnel disruption. Assignment 15 | assignment the organizational recognized the. The been organizational controls. 16 | Organizational individuals to connection. Inspects that each assignment official 17 | information. And other decisions maintains. Communications component satisfying 18 | withdrawn and hardware service. To design/implementation roles e e.g. For a 19 | organization and/or system system. Information of individuals rationale requires 20 | system system the. Report the organization-defined. Implements the security 21 | and system-level the development. Personnel in the event. The assignment the 22 | of documentation of. 23 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/MA-MAINTENANCE.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: MA-5 (3) 6 | control_name: Citizenship Requirements For Classified Systems 7 | family: MA 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: The information updates source organization. And communications for updates 14 | sanitization government the. Policies support prior privileged organization 15 | bidirectional. Establishes plans organization the purpose establishes. Prevents 16 | the via organization responsibilities roles. Consistent device and are current. 17 | The roles access routed inactive configuration. Polling access information organization-defined 18 | indicate one access humidity. Ports of post d organization displays testing. 19 | Through locations assignment. Analysis system c storage deviations protection 20 | mechanisms implements. Assignment continuity scanning operation. Before functions 21 | the the be. Defense-In-Breadth system organizational physical plans assignment 22 | personnel. Available procedures incident of personnel system. And credentials 23 | before changes. 10 used transmitting system. Properly primary system the organization 24 | based. Of and of outside employs organization process. By with automatically 25 | protection. Which information unauthorized the the. Site policy subnetworks 26 | devices and levels organization-defined. Organization-Defined organization-defined 27 | requires internally the the site personnel. The organization-defined the system 28 | the system a. Policy of is techniques. Roles employs of local. 29 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | documentation_complete: false 3 | schema_version: 3.0.0 4 | satisfies: 5 | - control_key: SC-37 6 | control_name: Out-Of-Band Channels 7 | family: SC 8 | standard_key: NIST SP 800-53 Revision 4 9 | covered_by: [] 10 | security_control_type: Other 11 | implementation_status: Partially In Place 12 | narrative: 13 | - text: In use of assignment. At to adjusts organization-defined withdrawn. Organization 14 | the follow b information service verifies receipt. 15 | -------------------------------------------------------------------------------- /example/agencyapp/components/SOC-Services-fake/component.yaml: -------------------------------------------------------------------------------- 1 | name: SOC-Services-fake 2 | schema_version: 3.0.0 3 | satisfies: 4 | - AC-ACCESS_CONTROL.yaml 5 | - CA-SECURITY_ASSESSMENT_AND_AUTHORIZATION.yaml 6 | - CP-CONTINGENCY_PLANNING.yaml 7 | - IR-INCIDENT_RESPONSE.yaml 8 | - MA-MAINTENANCE.yaml 9 | - SC-SYSTEM_AND_COMMUNICATIONS_PROTECTION.yaml 10 | -------------------------------------------------------------------------------- /example/agencyapp/lint.py: -------------------------------------------------------------------------------- 1 | # python lint.py file.yaml 2 | # python lint.py file1.yaml file2.yaml file3.yaml 3 | # # dry run (no changes) 4 | # python lint.py -n file.yaml 5 | # 6 | # Example: 7 | # python lint.py components/Drupal/AC-ACCESS_CONTROL.yaml 8 | # 9 | 10 | 11 | import argparse 12 | import difflib 13 | 14 | import rtyaml 15 | 16 | 17 | # Parse command-line arguments. 18 | parser = argparse.ArgumentParser(description='Lint some YAML files.') 19 | parser.add_argument('files', nargs='+', help='an integer for the accumulator') 20 | parser.add_argument('-n', dest="dry_run", action='store_true', help='dry run (print diff instead of rewriting file)') 21 | args = parser.parse_args() 22 | 23 | # Process each file on the command line. 24 | for fn in args.files: 25 | # Read and parse the YAML file. 26 | with open(fn) as f: 27 | in_text = f.read() 28 | data = rtyaml.load(in_text) 29 | 30 | # Lint. 31 | out_text = rtyaml.dump(data) 32 | 33 | # If doing a dry run, show a unified diff. 34 | if args.dry_run: 35 | diff = difflib.unified_diff( 36 | in_text.split("\n"), 37 | out_text.split("\n"), 38 | fromfile=fn + " (original)", 39 | tofile=fn + " (linted)", 40 | lineterm="") 41 | for line in diff: 42 | print(line) 43 | continue 44 | 45 | # Write back out. 46 | with open(fn, "w") as f: 47 | f.write(out_text) -------------------------------------------------------------------------------- /example/agencyapp/make_oc_compliant.py: -------------------------------------------------------------------------------- 1 | # The files in this example use some non-conformant changes to the 2 | # OpenControl file formats. This script undoes those changes. 3 | 4 | import glob 5 | import os.path 6 | import rtyaml 7 | 8 | # Component files can list other files that hold control narratives. 9 | # Put them back into the main component file. 10 | def get_file_content(component_fn, controls_fn): 11 | controls_fn = os.path.join(os.path.dirname(component_fn), controls_fn) 12 | with rtyaml.edit(controls_fn) as controls: 13 | return controls.get("satisfies", []) 14 | for fn in glob.glob("components/*/component.yaml"): 15 | with rtyaml.edit(fn) as component: 16 | if "satisfies" in component: 17 | satisfies = [] 18 | for item in component['satisfies']: 19 | satisfies.extend(get_file_content(fn, item)) 20 | component['satisfies'] = satisfies -------------------------------------------------------------------------------- /example/agencyapp/opencontrol.yaml: -------------------------------------------------------------------------------- 1 | schema_version: 1.0.0 2 | name: Example System 3 | metadata: 4 | authorization_id: EXAPP01 5 | description: A System Security Plan for the U.S. General Examples Administration's 6 | Example System following NIST SP 800-53. 7 | organization: 8 | name: U.S. General Examples Administration 9 | abbreviation: USGEA 10 | repository: https://github.com/GovReady/hyperGRC/tree/master/example/agencyapp 11 | components: 12 | - ./components/CentOS-fake 13 | - ./components/Cisco-Cloud-Rtr-fake 14 | - ./components/Cylance-fake 15 | - ./components/GovReady-fake 16 | - ./components/Jenkins-fake 17 | - ./components/Keycloak-fake 18 | - ./components/OpenLDAP-fake 19 | - ./components/SOC-Services-fake 20 | standards: 21 | - ./standards/NIST-SP-800-53-rev4.yaml 22 | certifications: 23 | - ./certifications/fisma-low-impact.yaml 24 | -------------------------------------------------------------------------------- /example/agencyapp/outputs/Example-doc.md: -------------------------------------------------------------------------------- 1 | # Example Document 2 | 3 | This is an example document. -------------------------------------------------------------------------------- /example/agencyapp/outputs/word/Example-word-doc.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GovReady/hyperGRC/f582cc5df6abb8ee7e76f669004bd311def23825/example/agencyapp/outputs/word/Example-word-doc.docx -------------------------------------------------------------------------------- /example/agencyapp/standards/opencontrol.yaml: -------------------------------------------------------------------------------- 1 | schema_version: "1.0.0" 2 | name: Standards for Agency App 3 | standards: 4 | - NIST-SP-800-53-rev4.yaml 5 | - hipaa-draft.yaml 6 | -------------------------------------------------------------------------------- /example/agencyapp/team/team.yaml: -------------------------------------------------------------------------------- 1 | name: Agency App Team 2 | schema_version: 3.0.0 3 | team: 4 | - name: Khalil Mack 5 | role: System Owner 6 | reference: 7 | - name: https://agency.atlassian.net/wiki/spaces/SO/pages/88047664/agencyapp/team 8 | date: 2018-11-30 9 | - name: Jane Doe 10 | role: ISSO 11 | reference: 12 | - name: https://agency.atlassian.net/wiki/spaces/SO/pages/88047664/agencyapp/team 13 | date: 2018-11-30 14 | - name: Navin Rhu 15 | role: CISO 16 | reference: 17 | - name: https://agency.atlassian.net/wiki/spaces/SO/pages/88047664/agencyapp/team 18 | date: 2018-11-30 -------------------------------------------------------------------------------- /hypergrc/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GovReady/hyperGRC/f582cc5df6abb8ee7e76f669004bd311def23825/hypergrc/__init__.py -------------------------------------------------------------------------------- /hypergrc/__main__.py: -------------------------------------------------------------------------------- 1 | # This is the main entry point for hyperGRC. This module 2 | # starts the hyperGRC HTTP server and runs until CTRL+C 3 | # is pressed. 4 | 5 | # Check that we are running in Python 3.5+. A common error 6 | # is invoking this application with Python 2. For this to 7 | # work, everything in this part must be valid Python 2 8 | # *and* valid Python 3. 9 | 10 | import sys 11 | 12 | def fatal_error(message): 13 | sys.stderr.write("hyperGRC failed to start:\n") 14 | sys.stderr.write(message) 15 | sys.stderr.write('\n') 16 | sys.exit(1) 17 | 18 | if (sys.version_info.major < 3) or (sys.version_info.major == 3 and sys.version_info.minor < 5): 19 | fatal_error("hyperGRC requires Python 3.5 or higher.") 20 | 21 | ########################################################### 22 | 23 | import os 24 | import time 25 | import argparse 26 | import http.server 27 | import socketserver 28 | 29 | from .routes import PROJECT_LIST, ROUTES 30 | 31 | # Read command-line arguments. 32 | 33 | parser = argparse.ArgumentParser(description='hyperGRC') 34 | parser.add_argument('--bind', default="localhost:8000", help='[host:]port to bind to') 35 | parser.add_argument('--showaddress', default=None, help='The address to recommend the user visit.') 36 | parser.add_argument('project', nargs="*", default=["@repos.conf"], help='Path to a directory containing an opencontrol.yaml file for a system. Specify more than once to edit multiple system projects. Precede with an @-sign to read a list of directories from a newline-delimited text file.') 37 | args = parser.parse_args() 38 | 39 | # Get the host and port to bind to, which are in '[host:]port' format. 40 | # If a host is not given, default to localhost. 41 | if ":" in args.bind: 42 | BIND_HOST = args.bind.split(":", 1)[0] 43 | BIND_PORT = args.bind.split(":", 1)[1] 44 | else: 45 | BIND_HOST = "localhost" 46 | BIND_PORT = args.bind 47 | 48 | # Read list of projects from the command-line and any @-prefixed listing files. 49 | # '@' prefixes are the Unixy-way of saying read a list from a file and use 50 | # the contents of the listing file as if they were command-line arguments. 51 | for project in args.project: 52 | if project.startswith("@"): 53 | # Read the listing file. 54 | if not os.path.isfile(project[1:]): 55 | fatal_error("File `{}` listing Compliance as Code repositories was not found.".format(project[1:])) 56 | with open(project[1:], 'r') as f: 57 | for line in f: 58 | line = line.strip() 59 | if line and not line.startswith("#"): 60 | PROJECT_LIST.append(line) 61 | else: 62 | # Append this argument. 63 | PROJECT_LIST.append(project) 64 | 65 | # Validate that each project path is valid. 66 | for project in PROJECT_LIST: 67 | if not os.path.isdir(project): 68 | fatal_error("Path `{}` to Compliance as Code repository was not found.".format(project)) 69 | if not os.path.isfile(os.path.join(project, 'opencontrol.yaml')): 70 | fatal_error("Path `{}` to Compliance as Code repository does not contain a file named opencontrol.yaml.".format(project)) 71 | 72 | # Define the basic HTTP server request handler which is called 73 | # on each HTTP request. 74 | class Handler(http.server.SimpleHTTPRequestHandler): 75 | def do_GET(self): 76 | if self.path.startswith("/static/"): 77 | # For /static only, serve static files. 78 | super().do_GET() 79 | else: 80 | # Otherwise, run one of our routes. 81 | self.do_request("GET") 82 | 83 | def do_POST(self): 84 | # Parse POST body. 85 | if not self.parse_request_body(): 86 | self.send_error(404, "Invalid request body.") 87 | return 88 | self.do_request("POST") 89 | 90 | # For POST requests, parse the request body which contains POST form fields. 91 | # Returns True on success and sets self.form (like Flask does) to a dictionary 92 | # holding form field name/value pairs. 93 | def parse_request_body(self): 94 | # We need the Content-Type header to know what format the body is in. 95 | if "Content-Type" not in self.headers: 96 | return 97 | 98 | # We need the Content-Length header to know how much data to read, otherwise 99 | # reading blocks indefinitely. 100 | if "Content-Length" not in self.headers: 101 | return 102 | 103 | # Parse the content type. 104 | import cgi, urllib.parse 105 | content_length = int(self.headers["Content-Length"]) 106 | content_type = cgi.parse_header(self.headers["Content-Type"]) 107 | if content_type[0] == "application/x-www-form-urlencoded": 108 | # Read the body stream, decode it, and parse it like a query string. 109 | body = self.rfile.read(content_length) 110 | body = body.decode(content_type[1].get("charset", "utf-8")) 111 | self.form = urllib.parse.parse_qs(body) 112 | 113 | # parse_qs yields { key: [value1, value2] } but multi-valued keys 114 | # aren't typically used, so simplify to { key: value } when 115 | # key's value isn't multi-valued. 116 | self.form = { key: value[0] if len(value) == 1 else value for key, value in self.form.items() } 117 | return True 118 | 119 | # Handle a request (for something other than a static file). 120 | def do_request(self, method): 121 | # Add the method as an attribute on 'self'. Some route functions 122 | # will look at it to see if this is a GET or POST request, etc. 123 | self.method = method 124 | 125 | # Find the (first) route that can handle this request. On a match, 126 | # we get back a dict holding parsed parameters from the request path. 127 | # See routes.py's parse_route_path_string. 128 | for methods, path, route_function in ROUTES: 129 | if method in methods: 130 | m = path_matches(path, self.path) 131 | if m is not False: 132 | break 133 | else: 134 | # No route matched. 135 | self.send_error(404, "Page not found.") 136 | return 137 | 138 | # A route matched. Call the route's function passing it this request 139 | # and the parsed path parameters as keyword arguments. 140 | # See routes.py's parse_route_path_string. 141 | try: 142 | resp = route_function(self, **m) 143 | except Exception as e: 144 | # Handle errors. 145 | self.send_error(500, "Internal error. Check the application console for details.") 146 | raise 147 | 148 | # Most routes don't return anything --- they have already sent a 149 | # HTTP response via render.py's render_template function. However 150 | # if the route returns a string, send that as the HTTP response 151 | # as text/plain. 152 | if isinstance(resp, str): 153 | # Send string return values as plain text. 154 | self.send_response(200) 155 | self.send_header("Content-Type", "text/plain; charset=UTF-8") 156 | self.end_headers() 157 | self.wfile.write(resp.encode("utf8")) 158 | 159 | def path_matches(route_path, path): 160 | # Does path match the route path specification in route_path? 161 | # If so, return a dict mapping path components to parts of 162 | # the input path. Un-URL-encode the values. 163 | from urllib.parse import unquote_plus 164 | m = route_path.match(path) 165 | if m: 166 | return { 167 | k: unquote_plus(v) 168 | for k, v 169 | in m.groupdict().items() 170 | } 171 | return False 172 | 173 | # Start the HTTP server and simulated project loading 174 | try: 175 | socketserver.TCPServer.allow_reuse_address = True 176 | httpd = socketserver.TCPServer((BIND_HOST, int(BIND_PORT)), Handler) 177 | COLRS = "\33[33m" 178 | COLRS2 = "\33[92m" 179 | COLRE = "\33[0m" 180 | sys.stdout.write(COLRS+"[hyperGRC] starting...\n"+COLRE) 181 | time.sleep(.800) 182 | for project in PROJECT_LIST: 183 | sys.stdout.write(COLRS+"\r[hyperGRC] loading {}".format(project)+COLRE) 184 | time.sleep(.150) 185 | if len(PROJECT_LIST) > 1: 186 | sys.stdout.write("\r"+(40+len(project))*' ') 187 | if len(PROJECT_LIST) > 1: 188 | sys.stdout.write(COLRS+"\r[hyperGRC] loading complete\n"+COLRE) 189 | else: 190 | sys.stdout.write(COLRS+"\n[hyperGRC] loading complete\n"+COLRE) 191 | time.sleep(.800) 192 | sys.stdout.write(COLRS+"[hyperGRC] `Control-C` to stop\n"+COLRE) 193 | 194 | url = args.showaddress or "http://{}:{}".format(BIND_HOST, BIND_PORT) 195 | if len(PROJECT_LIST) > 1: 196 | sys.stdout.write(COLRS2+"[hyperGRC] hyperGRC'ing {} projects at {}...\n".format(len(PROJECT_LIST), url)+COLRE) 197 | else: 198 | sys.stdout.write(COLRS2+"[hyperGRC] hyperGRC'ing {} project at {}...\n".format(len(PROJECT_LIST), url)+COLRE) 199 | httpd.serve_forever() 200 | except KeyboardInterrupt: 201 | pass 202 | httpd.server_close() 203 | -------------------------------------------------------------------------------- /hypergrc/app_yaml.py: -------------------------------------------------------------------------------- 1 | # Construct govready-q compliance app.yaml file 2 | 3 | from . import opencontrol 4 | import rtyaml 5 | 6 | def build_app(component, options): 7 | 8 | # create buffer for output 9 | from io import StringIO 10 | buf = StringIO() 11 | 12 | # Load the standards in use by this project. 13 | # standards = opencontrol.load_project_standards(project) 14 | 15 | # Collect all of the control narratives. 16 | # narratives = [] 17 | # for component in opencontrol.load_project_components(project): 18 | # # Iterate over its controls... 19 | # for controlimpl in opencontrol.load_project_component_controls(component, standards): 20 | # # If only one control family is requested, then skip others. 21 | # if options.get("only-family"): 22 | # if controlimpl["family"]["abbrev"] != options["only-family"]: 23 | # continue 24 | 25 | # # Add the narrative to the list of narratives to output. 26 | # narratives.append(controlimpl) 27 | 28 | # # Sort the narratives by standard, family, control, part, and then by component. 29 | # narratives.sort(key = lambda narrative : ( 30 | # narrative["standard"]["name"], 31 | # narrative["family"]["sort_key"], 32 | # narrative["control"]["sort_key"], 33 | # narrative["control_part"] is not None, # narratives for the null part go first 34 | # narrative["control_part"], 35 | # narrative["component"]["name"] ) 36 | # ) 37 | 38 | # Dump the component information to app.yaml 39 | # import csv 40 | # csvwriter = csv.writer(buf, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL) 41 | # csvwriter.writerow(["Control", "Control Part", "Standard Name", "Component Name", "Control Narrative"]) 42 | # for narrative in narratives: 43 | # # if narrative["control_part"] is not None: 44 | # csvwriter.writerow([narrative["control"]["id"], 45 | # narrative["control_part"], 46 | # narrative["standard"]["name"], 47 | # narrative["component"]["name"], 48 | # narrative["narrative"].strip() 49 | # ]) 50 | # buf.write(component) 51 | # return buf.getvalue() 52 | # print("componenyaml\n", rtyaml.dump(component)) 53 | return rtyaml.dump(component) -------------------------------------------------------------------------------- /hypergrc/csv.py: -------------------------------------------------------------------------------- 1 | # Construct system security plans from project data in csv 2 | 3 | from . import opencontrol 4 | 5 | def build_csv(project, options): 6 | 7 | # create buffer for output 8 | from io import StringIO 9 | buf = StringIO() 10 | 11 | # Load the standards in use by this project. 12 | standards = opencontrol.load_project_standards(project) 13 | 14 | # Collect all of the control narratives. 15 | narratives = [] 16 | for component in opencontrol.load_project_components(project): 17 | # Iterate over its controls... 18 | for controlimpl in opencontrol.load_project_component_controls(component, standards): 19 | # If only one control family is requested, then skip others. 20 | if options.get("only-family"): 21 | if controlimpl["family"]["abbrev"] != options["only-family"]: 22 | continue 23 | 24 | # Add the narrative to the list of narratives to output. 25 | narratives.append(controlimpl) 26 | 27 | # Sort the narratives by standard, family, control, part, and then by component. 28 | narratives.sort(key = lambda narrative : ( 29 | narrative["standard"]["name"], 30 | narrative["family"]["sort_key"], 31 | narrative["control"]["sort_key"], 32 | narrative["control_part"] is not None, # narratives for the null part go first 33 | narrative["control_part"], 34 | narrative["component"]["name"] ) 35 | ) 36 | 37 | # Write the narratives to CSV. 38 | import csv 39 | csvwriter = csv.writer(buf, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL) 40 | csvwriter.writerow(["Control", "Control Part", "Standard Name", "Component Name", "Control Narrative"]) 41 | for narrative in narratives: 42 | # if narrative["control_part"] is not None: 43 | csvwriter.writerow([narrative["control"]["id"], 44 | narrative["control_part"], 45 | narrative["standard"]["name"], 46 | narrative["component"]["name"], 47 | narrative["narrative"].strip() 48 | ]) 49 | 50 | return buf.getvalue() 51 | -------------------------------------------------------------------------------- /hypergrc/render.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | from jinja2 import Environment, FileSystemLoader, evalcontextfilter, Markup, escape 4 | import os.path 5 | import json 6 | 7 | 8 | jinja_env = Environment( 9 | loader=FileSystemLoader(__package__ + '/templates'), 10 | autoescape=True) 11 | 12 | ############################# 13 | # Jinja Helpers 14 | ############################# 15 | 16 | import urllib.parse 17 | jinja_env.filters['urlencode'] = urllib.parse.quote_plus 18 | 19 | _paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}') 20 | 21 | def nl2br(value): 22 | result = u'\n\n'.join(u'
%s
' % p.replace('\n', Markup('Non-working, mockup of future feature...
18 |