mirror of
https://github.com/strongdm/comply
synced 2025-12-16 03:04:24 +00:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ec70a67d1 | ||
|
|
096ad03ee1 | ||
|
|
5d67d60fd4 | ||
|
|
8e3ebdc94a | ||
|
|
39fd371c4e | ||
|
|
1e5383eb01 | ||
|
|
49e950c3c0 | ||
|
|
ff350a2b89 | ||
|
|
82baa57684 | ||
|
|
bb4200ff43 | ||
|
|
1b807da10e | ||
|
|
57a617abd5 | ||
|
|
1170ad6a92 | ||
|
|
b81d8388ef | ||
|
|
36331849c8 | ||
|
|
1d3dcc8f54 | ||
|
|
9309194a40 | ||
|
|
a37e8dc233 | ||
|
|
bef531973f | ||
|
|
a025ea5e39 | ||
|
|
cee7553319 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
comply
|
comply
|
||||||
output
|
output
|
||||||
dist
|
dist
|
||||||
|
.envrc
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
# Authors in alphabetical order:
|
# Authors in alphabetical order:
|
||||||
|
|
||||||
Justin McCarthy <justin@strongdm.com>
|
Justin McCarthy <justin@strongdm.com>
|
||||||
|
Manisha Singh <manisha@strongdm.com>
|
||||||
|
|||||||
8
Makefile
8
Makefile
@@ -62,7 +62,6 @@ export-example:
|
|||||||
|
|
||||||
docker:
|
docker:
|
||||||
cd build && docker build -t strongdm/pandoc .
|
cd build && docker build -t strongdm/pandoc .
|
||||||
docker tag jagregory/pandoc:latest strongdm/pandoc:latest
|
|
||||||
docker push strongdm/pandoc
|
docker push strongdm/pandoc
|
||||||
|
|
||||||
cleanse:
|
cleanse:
|
||||||
@@ -78,6 +77,9 @@ release-env:
|
|||||||
ifndef GH_LOGIN
|
ifndef GH_LOGIN
|
||||||
$(error GH_LOGIN must be set to a valid GitHub token)
|
$(error GH_LOGIN must be set to a valid GitHub token)
|
||||||
endif
|
endif
|
||||||
|
ifndef COMPLY_TAPDIR
|
||||||
|
$(error COMPLY_TAPDIR must be set to the path of the comply homebrew tap repo)
|
||||||
|
endif
|
||||||
|
|
||||||
release: release-env dist release-deps
|
release: release-env dist release-deps
|
||||||
$(eval VERSION := $(shell git describe --tags --always --dirty="-dev"))
|
$(eval VERSION := $(shell git describe --tags --always --dirty="-dev"))
|
||||||
@@ -105,9 +107,9 @@ release: release-env dist release-deps
|
|||||||
--file dist/comply-$(VERSION)-linux-amd64.tgz
|
--file dist/comply-$(VERSION)-linux-amd64.tgz
|
||||||
|
|
||||||
@echo "Update homebrew formula with the following: "
|
@echo "Update homebrew formula with the following: "
|
||||||
$(eval SHA := $(shell curl -s -L https://github.com/strongdm/comply/archive/$(VERSION).tar.gz |shasum -a 256|awk '{print $1}'))
|
$(eval SHA := $(shell curl -s -L https://github.com/strongdm/comply/archive/$(VERSION).tar.gz |shasum -a 256|cut -d" " -f1))
|
||||||
@echo "version $(VERSION) sha $(SHA)"
|
@echo "version $(VERSION) sha $(SHA)"
|
||||||
|
cd $$COMPLY_TAPDIR && ./update.sh $(VERSION) $(SHA)
|
||||||
|
|
||||||
patch-release: release-env push-assets patch release
|
patch-release: release-env push-assets patch release
|
||||||
$(eval VERSION := $(shell git describe --tags --always --dirty="-dev"))
|
$(eval VERSION := $(shell git describe --tags --always --dirty="-dev"))
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -1,4 +1,4 @@
|
|||||||
# Comply
|

|
||||||
|
|
||||||
Comply is a SOC2-focused compliance automation tool:
|
Comply is a SOC2-focused compliance automation tool:
|
||||||
|
|
||||||
@@ -12,6 +12,10 @@ macOS:
|
|||||||
|
|
||||||
`brew tap strongdm/comply; brew install comply`
|
`brew tap strongdm/comply; brew install comply`
|
||||||
|
|
||||||
|
Linux:
|
||||||
|
|
||||||
|
[Download latest release](https://github.com/strongdm/comply/releases)
|
||||||
|
|
||||||
Go users:
|
Go users:
|
||||||
|
|
||||||
`go get github.com/strongdm/comply`
|
`go get github.com/strongdm/comply`
|
||||||
@@ -34,6 +38,8 @@ Join us in [Comply Users](https://join.slack.com/t/comply-users/shared_invite/en
|
|||||||
|
|
||||||
# Screenshots
|
# Screenshots
|
||||||
|
|
||||||
|
[Demo video](https://vimeo.com/270257486)
|
||||||
|
|
||||||
## Start a Project
|
## Start a Project
|
||||||

|

|
||||||
|
|
||||||
@@ -48,6 +54,10 @@ Join us in [Comply Users](https://join.slack.com/t/comply-users/shared_invite/en
|
|||||||
## Dashboard
|
## Dashboard
|
||||||

|

|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Comply relies on [pandoc](https://pandoc.org/), which can be installed directly as an OS package or invoked via Docker.
|
||||||
|
|
||||||
## CLI
|
## CLI
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,3 +1,28 @@
|
|||||||
FROM scratch
|
FROM haskell:latest
|
||||||
|
|
||||||
MAINTAINER strongDM Comply <comply@strongdm.com>
|
# based on implementation by James Gregory <james@jagregory.com>
|
||||||
|
MAINTAINER Comply <comply@strongdm.com>
|
||||||
|
|
||||||
|
# install latex packages
|
||||||
|
RUN apt-get update -y \
|
||||||
|
&& apt-get install -y -o Acquire::Retries=10 --no-install-recommends \
|
||||||
|
texlive-latex-base \
|
||||||
|
texlive-xetex \
|
||||||
|
latex-xcolor \
|
||||||
|
texlive-latex-extra \
|
||||||
|
fontconfig \
|
||||||
|
unzip \
|
||||||
|
lmodern
|
||||||
|
|
||||||
|
# will ease up the update process
|
||||||
|
# updating this env variable will trigger the automatic build of the Docker image
|
||||||
|
ENV PANDOC_VERSION "2.2.1"
|
||||||
|
|
||||||
|
# install pandoc
|
||||||
|
RUN cabal update && cabal install pandoc-${PANDOC_VERSION}
|
||||||
|
|
||||||
|
WORKDIR /source
|
||||||
|
|
||||||
|
ENTRYPOINT ["/root/.cabal/bin/pandoc"]
|
||||||
|
|
||||||
|
CMD ["--help"]
|
||||||
@@ -9,5 +9,49 @@ majorRevisions:
|
|||||||
- date: Jun 1 2018
|
- date: Jun 1 2018
|
||||||
comment: Initial document
|
comment: Initial document
|
||||||
---
|
---
|
||||||
|
# Purpose and Scope
|
||||||
|
|
||||||
|
a. The purpose of this policy to define procedures to onboard and offboard users to technical infrastructure in a manner that minimizes the risk of information loss or exposure.
|
||||||
|
|
||||||
|
a. This policy applies to all technical infrastructure within the organization.
|
||||||
|
|
||||||
|
a. This policy applies to all full-time and part-time employees and contractors.
|
||||||
|
|
||||||
|
# Background
|
||||||
|
|
||||||
|
a. In order to minimize the risk of information loss or exposure (from both inside and outside the organization), the organization is reliant on the principle of least privilege. Account creation and permission levels are restricted to only the resources absolutely needed to perform each person’s job duties. When a user’s role within the organization changes, those accounts and permission levels are changed/revoked to fit the new role and disabled when the user leaves the organization altogether.
|
||||||
|
|
||||||
|
# Policy
|
||||||
|
|
||||||
|
a. *During onboarding:*
|
||||||
|
|
||||||
|
i. Hiring Manager informs HR upon hire of a new employee.
|
||||||
|
|
||||||
|
i. HR emails IT to inform them of a new hire and their role.
|
||||||
|
|
||||||
|
i. IT creates a checklist of accounts and permission levels needed for that role.
|
||||||
|
|
||||||
|
i. The owner of each resource reviews and approves account creation and the
|
||||||
|
associated permissions.
|
||||||
|
|
||||||
|
i. IT works with the owner of each resource to set up the user.
|
||||||
|
|
||||||
|
a. *During offboarding:*
|
||||||
|
|
||||||
|
i. Hiring Manager notifies HR when an employee has been terminated.
|
||||||
|
|
||||||
|
i. HR sends a weekly email report to IT summarizing list of users terminated and instructs IT to disable their access.
|
||||||
|
|
||||||
|
i. IT terminates access within five business days from receipt of notification.
|
||||||
|
|
||||||
|
a. *When an employee changes roles within the organization:*
|
||||||
|
|
||||||
|
i. Hiring Manager will inform HR of a change in role.
|
||||||
|
|
||||||
|
i. HR and IT will follow the same steps as outlined in the onboarding and offboarding procedures.
|
||||||
|
|
||||||
|
a. *Review of accounts and permissions:*
|
||||||
|
|
||||||
|
i. Each month, IT and HR will review accounts and permission levels for accuracy.
|
||||||
|
|
||||||
|
|
||||||
# Coming Soon
|
|
||||||
@@ -7,7 +7,10 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -96,6 +99,54 @@ func ticketingMustBeConfigured(c *cli.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pandocMustExist(c *cli.Context) error {
|
||||||
|
eitherMustExistErr := fmt.Errorf("Please install either Docker or the pandoc package and re-run `%s`", c.Command.Name)
|
||||||
|
|
||||||
|
pandocExistErr := pandocBinaryMustExist(c)
|
||||||
|
dockerExistErr := dockerMustExist(c)
|
||||||
|
config.SetPandoc(pandocExistErr == nil, dockerExistErr == nil)
|
||||||
|
|
||||||
|
if pandocExistErr != nil && dockerExistErr != nil {
|
||||||
|
return eitherMustExistErr
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func pandocBinaryMustExist(c *cli.Context) error {
|
||||||
|
cmd := exec.Command("pandoc", "-v")
|
||||||
|
outputRaw, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "error calling pandoc")
|
||||||
|
}
|
||||||
|
|
||||||
|
output := strings.TrimSpace((string(outputRaw)))
|
||||||
|
versionErr := errors.New("cannot determine pandoc version")
|
||||||
|
if !strings.HasPrefix(output, "pandoc") {
|
||||||
|
return versionErr
|
||||||
|
}
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`pandoc (\d+)\.(\d+)`)
|
||||||
|
result := re.FindStringSubmatch(output)
|
||||||
|
if len(result) != 3 {
|
||||||
|
return versionErr
|
||||||
|
}
|
||||||
|
|
||||||
|
major, err := strconv.Atoi(result[1])
|
||||||
|
if err != nil {
|
||||||
|
return versionErr
|
||||||
|
}
|
||||||
|
minor, err := strconv.Atoi(result[2])
|
||||||
|
if err != nil {
|
||||||
|
return versionErr
|
||||||
|
}
|
||||||
|
|
||||||
|
if major < 2 || minor < 1 {
|
||||||
|
return errors.New("pandoc 2.1 or greater required")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func dockerMustExist(c *cli.Context) error {
|
func dockerMustExist(c *cli.Context) error {
|
||||||
dockerErr := fmt.Errorf("Docker must be available in order to run `%s`", c.Command.Name)
|
dockerErr := fmt.Errorf("Docker must be available in order to run `%s`", c.Command.Name)
|
||||||
|
|
||||||
@@ -146,12 +197,17 @@ func dockerMustExist(c *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cleanContainers(c *cli.Context) error {
|
func cleanContainers(c *cli.Context) error {
|
||||||
dockerErr := fmt.Errorf("Docker must be available in order to run `%s`", c.Command.Name)
|
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
cli, err := client.NewEnvClient()
|
cli, err := client.NewEnvClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return dockerErr
|
// no Docker? nothing to clean.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = cli.Ping(ctx)
|
||||||
|
if err != nil {
|
||||||
|
// no Docker? nothing to clean.
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{All: true})
|
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{All: true})
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var buildCommand = cli.Command{
|
|||||||
ShortName: "b",
|
ShortName: "b",
|
||||||
Usage: "generate a static website summarizing the compliance program",
|
Usage: "generate a static website summarizing the compliance program",
|
||||||
Action: buildAction,
|
Action: buildAction,
|
||||||
Before: beforeAll(dockerMustExist, cleanContainers),
|
Before: beforeAll(pandocMustExist, cleanContainers),
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildAction(c *cli.Context) error {
|
func buildAction(c *cli.Context) error {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ var serveCommand = cli.Command{
|
|||||||
Name: "serve",
|
Name: "serve",
|
||||||
Usage: "live updating version of the build command",
|
Usage: "live updating version of the build command",
|
||||||
Action: serveAction,
|
Action: serveAction,
|
||||||
Before: beforeAll(dockerMustExist, cleanContainers),
|
Before: beforeAll(pandocMustExist, cleanContainers),
|
||||||
}
|
}
|
||||||
|
|
||||||
func serveAction(c *cli.Context) error {
|
func serveAction(c *cli.Context) error {
|
||||||
|
|||||||
@@ -10,6 +10,15 @@ import (
|
|||||||
|
|
||||||
var projectRoot string
|
var projectRoot string
|
||||||
|
|
||||||
|
var dockerAvailable, pandocAvailable bool
|
||||||
|
|
||||||
|
const (
|
||||||
|
// UseDocker invokes pandoc within Docker
|
||||||
|
UseDocker = "docker"
|
||||||
|
// UsePandoc invokes pandoc directly
|
||||||
|
UsePandoc = "pandoc"
|
||||||
|
)
|
||||||
|
|
||||||
// SetProjectRoot is used by the test suite.
|
// SetProjectRoot is used by the test suite.
|
||||||
func SetProjectRoot(dir string) {
|
func SetProjectRoot(dir string) {
|
||||||
projectRoot = dir
|
projectRoot = dir
|
||||||
@@ -17,10 +26,32 @@ func SetProjectRoot(dir string) {
|
|||||||
|
|
||||||
type Project struct {
|
type Project struct {
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
|
Pandoc string `yaml:"pandoc,omitempty"`
|
||||||
FilePrefix string `yaml:"filePrefix"`
|
FilePrefix string `yaml:"filePrefix"`
|
||||||
Tickets map[string]interface{} `yaml:"tickets"`
|
Tickets map[string]interface{} `yaml:"tickets"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetPandoc records pandoc availability during initialization
|
||||||
|
func SetPandoc(pandoc bool, docker bool) {
|
||||||
|
pandocAvailable = pandoc
|
||||||
|
dockerAvailable = docker
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhichPandoc indicates which pandoc invocation path should be used
|
||||||
|
func WhichPandoc() string {
|
||||||
|
cfg := Config()
|
||||||
|
if cfg.Pandoc == UsePandoc {
|
||||||
|
return UsePandoc
|
||||||
|
}
|
||||||
|
if cfg.Pandoc == UseDocker {
|
||||||
|
return UseDocker
|
||||||
|
}
|
||||||
|
if pandocAvailable {
|
||||||
|
return UsePandoc
|
||||||
|
}
|
||||||
|
return UseDocker
|
||||||
|
}
|
||||||
|
|
||||||
// YAML is the parsed contents of ProjectRoot()/config.yml.
|
// YAML is the parsed contents of ProjectRoot()/config.yml.
|
||||||
func YAML() map[interface{}]interface{} {
|
func YAML() map[interface{}]interface{} {
|
||||||
m := make(map[interface{}]interface{})
|
m := make(map[interface{}]interface{})
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package render
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@@ -12,9 +11,6 @@ import (
|
|||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/client"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/strongdm/comply/internal/config"
|
"github.com/strongdm/comply/internal/config"
|
||||||
"github.com/strongdm/comply/internal/model"
|
"github.com/strongdm/comply/internal/model"
|
||||||
@@ -28,75 +24,19 @@ func renderNarrativeToDisk(wg *sync.WaitGroup, errOutputCh chan error, data *ren
|
|||||||
}
|
}
|
||||||
recordModified(narrative.FullPath, narrative.ModifiedAt)
|
recordModified(narrative.FullPath, narrative.ModifiedAt)
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
cli, err := client.NewEnvClient()
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to read Docker environment")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
pwd, err := os.Getwd()
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to get workding directory")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
hc := &container.HostConfig{
|
|
||||||
Binds: []string{pwd + ":/source"},
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func(p *model.Narrative) {
|
go func(p *model.Narrative) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
outputFilename := p.OutputFilename
|
outputFilename := p.OutputFilename
|
||||||
// save preprocessed markdown
|
// save preprocessed markdown
|
||||||
err = preprocessNarrative(data, p, filepath.Join(".", "output", outputFilename+".md"))
|
err := preprocessNarrative(data, p, filepath.Join(".", "output", outputFilename+".md"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errOutputCh <- errors.Wrap(err, "unable to preprocess")
|
errOutputCh <- errors.Wrap(err, "unable to preprocess")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := []string{"--smart", "--toc", "-N", "--template=/source/templates/default.latex", "-o",
|
pandoc(outputFilename, errOutputCh)
|
||||||
fmt.Sprintf("/source/output/%s", outputFilename),
|
|
||||||
fmt.Sprintf("/source/output/%s.md", outputFilename)}
|
|
||||||
|
|
||||||
resp, err := cli.ContainerCreate(ctx, &container.Config{
|
|
||||||
Image: "strongdm/pandoc",
|
|
||||||
Cmd: cmd},
|
|
||||||
hc, nil, "")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to create Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
timeout := 2 * time.Second
|
|
||||||
cli.ContainerStop(ctx, resp.ID, &timeout)
|
|
||||||
err := cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to remove container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to start Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = cli.ContainerWait(ctx, resp.ID)
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "error awaiting Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "error reading Docker container logs")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove preprocessed markdown
|
// remove preprocessed markdown
|
||||||
err = os.Remove(filepath.Join(".", "output", outputFilename+".md"))
|
err = os.Remove(filepath.Join(".", "output", outputFilename+".md"))
|
||||||
|
|||||||
100
internal/render/pandoc.go
Normal file
100
internal/render/pandoc.go
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
package render
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/types"
|
||||||
|
"github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/strongdm/comply/internal/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func pandoc(outputFilename string, errOutputCh chan error) {
|
||||||
|
if config.WhichPandoc() == config.UsePandoc {
|
||||||
|
err := pandocPandoc(outputFilename)
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dockerPandoc(outputFilename, errOutputCh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dockerPandoc(outputFilename string, errOutputCh chan error) {
|
||||||
|
// TODO: switch to new args once docker image is updated
|
||||||
|
// cmd21 := []string{"-f", "markdown+smart", "--toc", "-N", "--template", "templates/default.latex", "-o", fmt.Sprintf("output/%s", outputFilename), fmt.Sprintf("output/%s.md", outputFilename)}
|
||||||
|
cmd19 := []string{"--smart", "--toc", "-N", "--template=/source/templates/default.latex", "-o",
|
||||||
|
fmt.Sprintf("/source/output/%s", outputFilename),
|
||||||
|
fmt.Sprintf("/source/output/%s.md", outputFilename)}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
cli, err := client.NewEnvClient()
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "unable to read Docker environment")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "unable to get workding directory")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
hc := &container.HostConfig{
|
||||||
|
Binds: []string{pwd + ":/source"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := cli.ContainerCreate(ctx, &container.Config{
|
||||||
|
Image: "strongdm/pandoc",
|
||||||
|
Cmd: cmd19},
|
||||||
|
hc, nil, "")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "unable to create Docker container")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
timeout := 2 * time.Second
|
||||||
|
cli.ContainerStop(ctx, resp.ID, &timeout)
|
||||||
|
err := cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "unable to remove container")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "unable to start Docker container")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = cli.ContainerWait(ctx, resp.ID)
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "error awaiting Docker container")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
|
||||||
|
if err != nil {
|
||||||
|
errOutputCh <- errors.Wrap(err, "error reading Docker container logs")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 🐼
|
||||||
|
func pandocPandoc(outputFilename string) error {
|
||||||
|
// -f markdown+smart --toc -N --template=templates/default.latex -o output/%s output/%s.md
|
||||||
|
cmd := exec.Command("pandoc", "-f", "markdown+smart", "--toc", "-N", "--template", "templates/default.latex", "-o", fmt.Sprintf("output/%s", outputFilename), fmt.Sprintf("output/%s.md", outputFilename))
|
||||||
|
outputRaw, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(string(outputRaw))
|
||||||
|
return errors.Wrap(err, "error calling pandoc")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ package render
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@@ -12,9 +11,6 @@ import (
|
|||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/client"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/strongdm/comply/internal/config"
|
"github.com/strongdm/comply/internal/config"
|
||||||
"github.com/strongdm/comply/internal/model"
|
"github.com/strongdm/comply/internal/model"
|
||||||
@@ -28,73 +24,19 @@ func renderPolicyToDisk(wg *sync.WaitGroup, errOutputCh chan error, data *render
|
|||||||
}
|
}
|
||||||
recordModified(policy.FullPath, policy.ModifiedAt)
|
recordModified(policy.FullPath, policy.ModifiedAt)
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
cli, err := client.NewEnvClient()
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to read Docker environment")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
pwd, err := os.Getwd()
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to get workding directory")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
hc := &container.HostConfig{
|
|
||||||
Binds: []string{pwd + ":/source"},
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func(p *model.Policy) {
|
go func(p *model.Policy) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
outputFilename := p.OutputFilename
|
outputFilename := p.OutputFilename
|
||||||
// save preprocessed markdown
|
// save preprocessed markdown
|
||||||
err = preprocessPolicy(data, p, filepath.Join(".", "output", outputFilename+".md"))
|
err := preprocessPolicy(data, p, filepath.Join(".", "output", outputFilename+".md"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errOutputCh <- errors.Wrap(err, "unable to preprocess")
|
errOutputCh <- errors.Wrap(err, "unable to preprocess")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := cli.ContainerCreate(ctx, &container.Config{
|
pandoc(outputFilename, errOutputCh)
|
||||||
Image: "strongdm/pandoc",
|
|
||||||
Cmd: []string{"--smart", "--toc", "-N", "--template=/source/templates/default.latex", "-o",
|
|
||||||
fmt.Sprintf("/source/output/%s", outputFilename),
|
|
||||||
fmt.Sprintf("/source/output/%s.md", outputFilename),
|
|
||||||
},
|
|
||||||
}, hc, nil, "")
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to create Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
timeout := 2 * time.Second
|
|
||||||
cli.ContainerStop(ctx, resp.ID, &timeout)
|
|
||||||
err := cli.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{Force: true})
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to remove container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "unable to start Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = cli.ContainerWait(ctx, resp.ID)
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "error awaiting Docker container")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
|
|
||||||
if err != nil {
|
|
||||||
errOutputCh <- errors.Wrap(err, "error reading Docker container logs")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove preprocessed markdown
|
// remove preprocessed markdown
|
||||||
err = os.Remove(filepath.Join(".", "output", outputFilename+".md"))
|
err = os.Remove(filepath.Join(".", "output", outputFilename+".md"))
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ func complyBlankReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-blank/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-blank/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -157,7 +157,7 @@ func complyBlankTodoMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-blank/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-blank/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -277,7 +277,7 @@ func complyBlankTemplatesDefaultLatex() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-blank/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-blank/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ func complyBlankTemplatesIndexAce() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-blank/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-blank/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -317,7 +317,7 @@ func complySoc2ReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/README.md", size: 1965, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -337,7 +337,7 @@ func complySoc2TodoMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/TODO.md", size: 1429, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -357,7 +357,7 @@ func complySoc2NarrativesReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/README.md", size: 96, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/README.md", size: 96, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -377,7 +377,7 @@ func complySoc2NarrativesControlMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/control.md", size: 387, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/control.md", size: 387, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -397,7 +397,7 @@ func complySoc2NarrativesOrganizationalMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/organizational.md", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/organizational.md", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -417,7 +417,7 @@ func complySoc2NarrativesProductsMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/products.md", size: 232, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/products.md", size: 232, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -437,7 +437,7 @@ func complySoc2NarrativesSecurityMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/security.md", size: 327, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/security.md", size: 327, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -457,7 +457,7 @@ func complySoc2NarrativesSystemMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/narratives/system.md", size: 257, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/narratives/system.md", size: 257, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -477,12 +477,12 @@ func complySoc2PoliciesReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/README.md", size: 71, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/README.md", size: 71, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var _complySoc2PoliciesAccessMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\x8e\x31\x6a\xc4\x30\x10\x45\x7b\x9d\xe2\x43\x6a\x85\xd8\x81\x10\xd4\x19\x55\x49\x63\x13\xfb\x02\x13\x49\xbb\xcc\x62\xcd\x80\x24\x2f\xf8\xf6\x8b\x5d\xb9\xfa\x8f\x0f\x0f\x9e\x50\x4e\x0e\x43\x08\xa9\x56\x8c\xf2\xaf\x54\x22\xcb\x1d\x24\x11\x4b\x2a\x99\x85\x1a\xab\x60\xd2\x95\xc3\x6e\x28\x14\x95\x3d\x3b\x0c\xe3\x32\x99\x4a\x8d\xeb\x8d\x53\x75\x06\x58\x66\x7f\x0c\x60\xe1\xfd\xd7\x7b\x77\xe1\xfe\xc2\x9f\x26\xd3\x43\xcb\x5f\x7a\x72\x65\x95\x53\xb5\x88\xd4\x92\xc3\xef\x26\xe8\xd0\x7f\x74\xdf\xa7\x10\x34\xe7\x24\xcd\xe1\x47\xb8\x31\xad\x88\x1a\xb6\xe3\x31\xd6\x5a\x63\xde\xe0\x35\x1f\xad\xb3\xaa\xbc\x02\x00\x00\xff\xff\xcd\x46\x92\x04\xc8\x00\x00\x00")
|
var _complySoc2PoliciesAccessMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x55\xc1\x6e\x1b\x47\x0c\xbd\xeb\x2b\x08\xe4\xd2\x1a\x91\x5a\xa7\x40\x51\xe8\x96\xba\x05\xec\x02\x45\x0c\x45\x40\xce\xd4\x2c\x57\xcb\x68\x76\xb8\x20\x67\xa5\xca\xa7\xfe\x46\x7f\xaf\x5f\x52\x70\x66\x25\xcb\x6e\xec\xe4\xa4\xdd\x19\x91\x7c\x8f\xef\x91\x9b\xb0\xa7\x25\xbc\x0f\x81\xcc\xe0\x43\xda\x08\x6a\xc3\x69\x0b\x98\x1a\x58\x93\xf6\x9c\x30\xb3\x24\xb8\x97\xc8\xe1\x38\xc3\xa0\x92\x8e\xfd\x12\xde\x7f\x58\xdf\xcf\x0c\x33\x5b\xcb\x64\xcb\x19\xc0\xfa\xe3\x8d\xff\x00\xcc\xe1\xe6\xe6\xe7\xc5\xf5\xc5\xf3\xbb\x8b\xe7\x9f\x66\x3d\x7e\x16\x5d\xd1\x9e\x8d\x25\x95\xd0\x39\x34\x98\x69\x09\x7f\x8c\x09\xae\xe1\xdd\x8f\xd7\xbf\x94\x80\x20\x7d\x4f\x29\x2f\xe1\x2e\x71\x66\x8c\xd0\x48\x18\xfd\x64\x36\x9f\xcf\x67\x6f\xe0\x7e\xd4\x41\x8c\x0a\xd6\x8f\x41\x06\x9a\xcd\x70\x01\xeb\x8e\x60\x98\x6e\xa4\x85\xdc\xb1\xc1\x50\xd0\x43\x16\x68\xa8\xe5\x44\x30\xa8\x04\x6a\x46\x25\xf3\x43\xa9\xbc\x4b\x22\x69\xdb\xfa\x32\x1a\x69\xb9\xcd\x14\xba\xc4\x01\x23\x70\x6a\x15\x2d\xeb\x18\xf2\xa8\x04\x9c\x00\xa1\xc7\x94\x48\x21\x77\x98\xa1\xe7\xc4\x3d\x3f\x78\xd2\x8e\x40\xd9\x76\x8e\x80\x53\x2b\xda\xd7\x36\x46\x31\x03\x51\xa0\xbf\x06\xb1\x51\x69\x01\x13\xe6\x47\x90\x38\x0c\x91\x2b\x2e\x8c\xf1\xe5\xea\x07\xce\x1d\xa7\x52\x49\x74\x8b\x89\x1f\x4a\x89\xaf\x67\x6c\xc7\x18\xe7\x99\xfb\xda\xb8\x01\x35\xd7\x37\xea\x87\x28\x47\x22\x2b\xe7\x41\x52\x56\x0c\x59\xd4\x3c\xe5\x1b\xf8\x15\xc3\x6e\xab\x32\xa6\xa6\x14\xb8\x4b\x20\xda\x38\x73\x39\xf3\xfe\x66\xda\xf0\x5d\xab\xd2\xc3\x46\x72\x07\x9c\x8c\x9b\x8a\x45\xc6\x5c\x9e\x9f\x73\xfa\xfe\xed\xff\x8e\x80\x0d\x94\x22\x63\xca\x20\xb5\x0b\x83\x72\x0a\x3c\xc4\x22\x7b\x24\xb4\xec\x47\x7b\x8e\xb4\xa5\x85\x5b\x5c\xc6\x94\x21\x28\xd5\x04\x85\xbc\x3b\xdc\xac\x40\xa4\x3d\x45\x03\x54\x02\x25\xcb\xca\x21\x53\x53\xcd\x11\x8f\x95\x18\x99\x8c\x1a\xbc\x3f\x1b\x93\x38\x66\x8a\x47\x48\x44\x4d\xfd\xdf\x40\xea\x84\x81\x30\x74\xfe\x62\x92\xfe\xfd\xfb\x1f\x83\xcf\xb2\x81\x66\xcc\x4c\xb6\x80\x4f\x1d\xb9\x67\xdc\x5a\xe5\x4e\x25\xbe\x28\x24\x84\x0e\xd3\x96\xcc\xb9\x17\x97\x57\x02\xf6\x0a\xf0\x1a\xd1\xfc\xa0\xb4\x97\x5d\x45\xd5\x72\x2e\x99\x13\x1d\x6a\x35\x8f\x6e\xd8\x70\x13\xa9\x81\x83\xe3\xf1\x6b\x47\xe4\x3d\xdb\x4f\xde\x7d\x02\x04\x63\x96\x2d\xe5\x8e\xb4\x3a\x61\xda\x05\xee\x82\xab\xdf\x46\xf5\x75\x21\xe7\xcd\xb1\xbc\x9a\x95\xe1\xe5\x05\xdc\x72\xb9\xfb\x13\x13\x6e\x49\x27\x43\x18\xdc\xae\x60\x1c\x24\x41\xc7\x5a\xa4\xc2\x02\xee\xe4\xbe\xc5\x63\xf8\x0a\xa8\x47\x8e\x06\x77\x6b\xa7\x52\xe3\x1d\x5e\xff\x18\x56\x92\x38\xa7\xdc\x11\x6b\xa1\xe8\x20\xa7\x14\x77\xeb\xaa\xb7\x6b\x06\xa1\xa3\xb0\x8b\x6c\xb9\x44\xbf\xde\xcd\x49\xd6\x56\xa6\xc9\x7e\x96\xd7\x77\x8c\x1c\x7c\xee\xa5\xad\x82\x9f\xcc\x01\x4a\x7b\xa6\x43\xcd\x8b\xc3\xa0\xe2\x2d\xc5\x2f\x99\xcf\xfb\x3c\x43\x33\x09\x8c\xee\xb5\x47\x14\xf6\x94\xc2\x41\x74\x67\xc5\x26\x55\x9b\x2f\x17\xce\x02\x46\x19\xc6\xe1\x2c\xe8\xb4\x0a\xce\x1a\x4d\x9b\xed\x55\x91\x92\x64\xf6\x8d\xee\xdd\x2f\xee\xc0\x74\x96\x06\x3a\x34\xd8\x90\x5b\x66\xfa\x32\x50\x73\x81\xf4\x76\x05\x46\xa9\xf1\x56\x1f\x88\x76\xf1\x58\xe5\x03\xa5\x41\x34\x3b\xbe\xbb\x35\xd8\xd8\xf7\xa8\xfc\xe0\x35\x4f\x5a\x4c\x9b\xf6\x9c\xb3\x74\x87\x53\x5d\x75\x27\xf5\x27\xcf\x4e\x3a\x63\xf9\x60\x3d\x6d\xd3\x39\x81\x4d\xd7\xa7\xc9\x6a\x79\x4f\xb0\x19\x8d\x93\x1f\x36\x78\x34\x28\xeb\x47\x29\x10\x0f\x05\x42\xa5\x1d\x2e\x37\xe8\xd5\xa7\xe7\xf4\xa7\x81\x2c\x66\xb0\x97\xc6\xf6\xe5\xd6\x1e\x38\xc6\x93\x89\x6f\x57\xd5\xc2\x35\xa5\x7f\x49\x8a\xc3\x4a\xe4\x45\x3f\xbd\x11\x6e\x00\x8f\x6c\x25\x46\x39\x94\x7a\x86\x3d\x81\x65\x1a\x0c\xd0\x7c\x6b\x46\x4e\xe4\x2d\xab\x68\x9e\x7e\xc5\x2f\x64\xbf\xf8\xec\x9d\x48\xae\x8a\x5d\x5f\x99\x08\xbb\x20\xf4\xbb\x1b\xae\x97\x94\xbb\xb7\x0e\xcb\xff\xe8\x36\x71\x74\xd5\xf6\x5f\x1b\x2b\x9f\x27\x0c\x61\x54\x0c\x47\x47\x30\xfb\x2f\x00\x00\xff\xff\x29\x19\x25\xcc\x7f\x08\x00\x00")
|
||||||
|
|
||||||
func complySoc2PoliciesAccessMdBytes() ([]byte, error) {
|
func complySoc2PoliciesAccessMdBytes() ([]byte, error) {
|
||||||
return bindataRead(
|
return bindataRead(
|
||||||
@@ -497,7 +497,7 @@ func complySoc2PoliciesAccessMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/access.md", size: 200, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/access.md", size: 2175, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -517,7 +517,7 @@ func complySoc2PoliciesApplicationMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/application.md", size: 8377, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/application.md", size: 8377, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -537,7 +537,7 @@ func complySoc2PoliciesAvailabilityMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/availability.md", size: 7019, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/availability.md", size: 7019, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -557,7 +557,7 @@ func complySoc2PoliciesChangeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/change.md", size: 2793, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/change.md", size: 2793, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -577,7 +577,7 @@ func complySoc2PoliciesClassificationMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/classification.md", size: 14376, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/classification.md", size: 14376, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -597,7 +597,7 @@ func complySoc2PoliciesConductMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/conduct.md", size: 4492, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/conduct.md", size: 4492, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -617,7 +617,7 @@ func complySoc2PoliciesConfidentialityMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/confidentiality.md", size: 3653, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/confidentiality.md", size: 3653, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -637,7 +637,7 @@ func complySoc2PoliciesContinuityMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/continuity.md", size: 5043, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/continuity.md", size: 5043, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -657,7 +657,7 @@ func complySoc2PoliciesCyberMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/cyber.md", size: 4805, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/cyber.md", size: 4805, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -677,7 +677,7 @@ func complySoc2PoliciesDatacenterMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/datacenter.md", size: 3014, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/datacenter.md", size: 3014, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -697,7 +697,7 @@ func complySoc2PoliciesDevelopmentMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/development.md", size: 8933, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/development.md", size: 8933, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -717,7 +717,7 @@ func complySoc2PoliciesDisasterMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/disaster.md", size: 10315, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/disaster.md", size: 10315, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -737,7 +737,7 @@ func complySoc2PoliciesEncryptionMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/encryption.md", size: 5381, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/encryption.md", size: 5381, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -757,7 +757,7 @@ func complySoc2PoliciesIncidentMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/incident.md", size: 8552, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/incident.md", size: 8552, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -777,7 +777,7 @@ func complySoc2PoliciesInformationMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/information.md", size: 5359, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/information.md", size: 5359, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -797,7 +797,7 @@ func complySoc2PoliciesLogMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/log.md", size: 4307, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/log.md", size: 4307, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -817,7 +817,7 @@ func complySoc2PoliciesMediaMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/media.md", size: 8819, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/media.md", size: 8819, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -837,7 +837,7 @@ func complySoc2PoliciesOfficeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/office.md", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/office.md", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -857,7 +857,7 @@ func complySoc2PoliciesPasswordMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/password.md", size: 1796, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/password.md", size: 1796, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -877,7 +877,7 @@ func complySoc2PoliciesPolicyMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/policy.md", size: 892, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/policy.md", size: 892, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -897,7 +897,7 @@ func complySoc2PoliciesPrivacyMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/privacy.md", size: 346, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/privacy.md", size: 346, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -917,7 +917,7 @@ func complySoc2PoliciesProcessingMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/processing.md", size: 210, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/processing.md", size: 210, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -937,7 +937,7 @@ func complySoc2PoliciesRemoteMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/remote.md", size: 4119, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/remote.md", size: 4119, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -957,7 +957,7 @@ func complySoc2PoliciesRetentionMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/retention.md", size: 6811, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/retention.md", size: 6811, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -977,7 +977,7 @@ func complySoc2PoliciesRiskMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/risk.md", size: 10486, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/risk.md", size: 10486, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -997,7 +997,7 @@ func complySoc2PoliciesVendorMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/vendor.md", size: 3139, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/vendor.md", size: 3139, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1017,7 +1017,7 @@ func complySoc2PoliciesWorkstationMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/policies/workstation.md", size: 1791, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/policies/workstation.md", size: 1791, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1037,7 +1037,7 @@ func complySoc2ProceduresReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/procedures/README.md", size: 92, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/procedures/README.md", size: 92, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1057,7 +1057,7 @@ func complySoc2ProceduresOffboardingMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/procedures/offboarding.md", size: 358, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/procedures/offboarding.md", size: 358, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1077,7 +1077,7 @@ func complySoc2ProceduresOnboardingMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/procedures/onboarding.md", size: 495, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/procedures/onboarding.md", size: 495, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1097,7 +1097,7 @@ func complySoc2ProceduresPatchMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/procedures/patch.md", size: 380, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/procedures/patch.md", size: 380, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1117,7 +1117,7 @@ func complySoc2ProceduresWorkstationMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/procedures/workstation.md", size: 1081, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/procedures/workstation.md", size: 1081, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1137,7 +1137,7 @@ func complySoc2StandardsReadmeMd() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/standards/README.md", size: 282, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/standards/README.md", size: 282, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1157,7 +1157,7 @@ func complySoc2StandardsTsc2017Yml() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/standards/TSC-2017.yml", size: 16305, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/standards/TSC-2017.yml", size: 16305, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1177,7 +1177,7 @@ func complySoc2TemplatesDefaultLatex() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/templates/default.latex", size: 7649, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
@@ -1197,7 +1197,7 @@ func complySoc2TemplatesIndexAce() (*asset, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "comply-soc2/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1526687060, 0)}
|
info := bindataFileInfo{name: "comply-soc2/templates/index.ace", size: 7596, mode: os.FileMode(420), modTime: time.Unix(1527121005, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,5 +9,49 @@ majorRevisions:
|
|||||||
- date: Jun 1 2018
|
- date: Jun 1 2018
|
||||||
comment: Initial document
|
comment: Initial document
|
||||||
---
|
---
|
||||||
|
# Purpose and Scope
|
||||||
|
|
||||||
|
a. The purpose of this policy to define procedures to onboard and offboard users to technical infrastructure in a manner that minimizes the risk of information loss or exposure.
|
||||||
|
|
||||||
|
a. This policy applies to all technical infrastructure within the organization.
|
||||||
|
|
||||||
|
a. This policy applies to all full-time and part-time employees and contractors.
|
||||||
|
|
||||||
|
# Background
|
||||||
|
|
||||||
|
a. In order to minimize the risk of information loss or exposure (from both inside and outside the organization), the organization is reliant on the principle of least privilege. Account creation and permission levels are restricted to only the resources absolutely needed to perform each person’s job duties. When a user’s role within the organization changes, those accounts and permission levels are changed/revoked to fit the new role and disabled when the user leaves the organization altogether.
|
||||||
|
|
||||||
|
# Policy
|
||||||
|
|
||||||
|
a. *During onboarding:*
|
||||||
|
|
||||||
|
i. Hiring Manager informs HR upon hire of a new employee.
|
||||||
|
|
||||||
|
i. HR emails IT to inform them of a new hire and their role.
|
||||||
|
|
||||||
|
i. IT creates a checklist of accounts and permission levels needed for that role.
|
||||||
|
|
||||||
|
i. The owner of each resource reviews and approves account creation and the
|
||||||
|
associated permissions.
|
||||||
|
|
||||||
|
i. IT works with the owner of each resource to set up the user.
|
||||||
|
|
||||||
|
a. *During offboarding:*
|
||||||
|
|
||||||
|
i. Hiring Manager notifies HR when an employee has been terminated.
|
||||||
|
|
||||||
|
i. HR sends a weekly email report to IT summarizing list of users terminated and instructs IT to disable their access.
|
||||||
|
|
||||||
|
i. IT terminates access within five business days from receipt of notification.
|
||||||
|
|
||||||
|
a. *When an employee changes roles within the organization:*
|
||||||
|
|
||||||
|
i. Hiring Manager will inform HR of a change in role.
|
||||||
|
|
||||||
|
i. HR and IT will follow the same steps as outlined in the onboarding and offboarding procedures.
|
||||||
|
|
||||||
|
a. *Review of accounts and permissions:*
|
||||||
|
|
||||||
|
i. Each month, IT and HR will review accounts and permission levels for accuracy.
|
||||||
|
|
||||||
|
|
||||||
# Coming Soon
|
|
||||||
Reference in New Issue
Block a user