octool 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 776fce8b2089c05dcaf562c769ab2c65a81a3887977390a75e3fadda41c2ffe8
4
+ data.tar.gz: 107d9de9a54bac2b28bac82f26f10be04a28786bce24673b8ddd3cc6fe5afadd
5
+ SHA512:
6
+ metadata.gz: 1c864f87036e072690a9fe2645aa95eb0a50b3e51011bb23e3fc3c5e3cf4efd27b8b999098e2a1b2792af90aeaf35f88d79aaea3e2506cb970f89e167b196e23
7
+ data.tar.gz: 5e99234200a87b85a7b4de20da9196f3c72814f520bdc0329e8fc47b670b2064e2e5a2b950a11f76954c9becf29ef4d737eb01dde1b29eee49dada9fb329d674
@@ -0,0 +1,3 @@
1
+ = octool
2
+
3
+ :include:octool.rdoc
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gli'
3
+ require 'octool'
4
+
5
+ # Entrypoint and argument parser for the application.
6
+ class App
7
+ extend GLI::App
8
+
9
+ program_desc 'Open Compliance Tool'
10
+ version OCTool::VERSION
11
+
12
+ subcommand_option_handling :normal
13
+ arguments :strict
14
+
15
+ desc 'Check sanity of configuration'
16
+ command :validate do |v|
17
+ v.desc 'validate data'
18
+ v.arg_name 'path/to/system/config.yaml'
19
+ v.command :data do |vd|
20
+ vd.action do |global_options, options, args|
21
+ config_file = find_config(args)
22
+ OCTool::Parser.new(config_file).validate_data
23
+ end
24
+ end
25
+
26
+ v.desc 'validate schemas'
27
+ v.command :schemas do |vs|
28
+ vs.action do |global_options, options, args|
29
+ OCTool::Parser.validate_schemas
30
+ end
31
+ end
32
+
33
+ v.default_command :data
34
+ end
35
+
36
+ desc 'generate System Security Plan'
37
+ arg_name 'path/to/system/config.yaml'
38
+ command :ssp do |s|
39
+ s.desc 'where to store outputs'
40
+ s.default_value Dir.tmpdir
41
+ s.long_desc 'Default output directory respects env vars TMPDIR, TMP, TEMP'
42
+ s.arg_name 'path/to/output/dir'
43
+ s.flag [:d, :dir]
44
+
45
+ s.action do |global_options, options, args|
46
+ export_dir = options[:dir]
47
+ FileUtils.mkdir_p export_dir unless File.directory?(export_dir)
48
+ config_file = find_config(args)
49
+ system = OCTool::Parser.new(config_file).load_system
50
+ Dir.chdir File.dirname(config_file) do
51
+ OCTool::SSP.new(system, export_dir)
52
+ end
53
+ end
54
+ end
55
+
56
+ pre do |global, command, options, args|
57
+ # Pre logic here
58
+ #
59
+ # Return true to proceed;
60
+ # false to abort and not call the chosen command
61
+ #
62
+ # Use skips_pre before a command
63
+ # to skip this block on that command only.
64
+ true
65
+ end
66
+
67
+ post do |global, command, options, args|
68
+ # Post logic here
69
+ # Use skips_post before a command
70
+ # to skip this block on that command only.
71
+ puts 'OK'
72
+ end
73
+
74
+ on_error do |exception|
75
+ # Error logic here
76
+ # Return false to skip default error handling.
77
+ if ENV['DEBUG']
78
+ puts exception.backtrace
79
+ pp exception
80
+ false
81
+ else
82
+ true
83
+ end
84
+ end
85
+ end
86
+
87
+ def find_config(args)
88
+ path = args.first || OCTool::DEFAULT_CONFIG_FILENAME
89
+ path = File.join(path, OCTool::DEFAULT_CONFIG_FILENAME) if File.directory?(path)
90
+ path
91
+ end
92
+
93
+ exit App.run(ARGV)
@@ -0,0 +1,27 @@
1
+ require 'octool/version.rb'
2
+
3
+ # Built-ins.
4
+ require 'pp'
5
+ require 'tmpdir'
6
+
7
+ # 3rd-party libs.
8
+ require 'kwalify'
9
+ require 'kwalify/util/hashlike'
10
+ require 'paru/pandoc'
11
+
12
+ # OCTool libs.
13
+ require 'octool/constants'
14
+ require 'octool/parser'
15
+ require 'octool/ssp'
16
+ require 'octool/system'
17
+
18
+ # Generated libs.
19
+ require 'octool/generated/certification'
20
+ require 'octool/generated/component'
21
+ require 'octool/generated/config'
22
+ require 'octool/generated/standard'
23
+
24
+ # Mixins.
25
+ module OCTool
26
+ include Kwalify::Util::HashLike # defines [], []=, and keys?
27
+ end
@@ -0,0 +1,6 @@
1
+ module OCTool
2
+ LATEST_SCHEMA_VERSION = 'v1.0.0'.freeze
3
+ BASE_SCHEMA_DIR = File.join(File.dirname(__FILE__), '..', '..', 'schemas').freeze
4
+ ERB_DIR = File.join(File.dirname(__FILE__), '..', '..', 'templates').freeze
5
+ DEFAULT_CONFIG_FILENAME = 'config.yaml'.freeze
6
+ end
@@ -0,0 +1,35 @@
1
+ require 'kwalify/util/hashlike'
2
+
3
+ module OCTool
4
+
5
+
6
+ class Certification
7
+ include Kwalify::Util::HashLike
8
+ def initialize(hash=nil)
9
+ if hash.nil?
10
+ return
11
+ end
12
+ @certification_key = hash['certification_key']
13
+ @name = hash['name']
14
+ @requires = (v=hash['requires']) ? v.map!{|e| e.is_a?(ControlID) ? e : ControlID.new(e)} : v
15
+ end
16
+ attr_accessor :certification_key # str
17
+ attr_accessor :name # str
18
+ attr_accessor :requires # seq
19
+ end
20
+
21
+
22
+ class ControlID
23
+ include Kwalify::Util::HashLike
24
+ def initialize(hash=nil)
25
+ if hash.nil?
26
+ return
27
+ end
28
+ @standard_key = hash['standard_key']
29
+ @control_key = hash['control_key']
30
+ end
31
+ attr_accessor :standard_key # str
32
+ attr_accessor :control_key # str
33
+ end
34
+
35
+ end
@@ -0,0 +1,57 @@
1
+ require 'kwalify/util/hashlike'
2
+
3
+ module OCTool
4
+
5
+
6
+ class Component
7
+ include Kwalify::Util::HashLike
8
+ def initialize(hash=nil)
9
+ if hash.nil?
10
+ return
11
+ end
12
+ @name = hash['name']
13
+ @component_key = hash['component_key']
14
+ @description = hash['description']
15
+ @attestations = (v=hash['attestations']) ? v.map!{|e| e.is_a?(Attestation) ? e : Attestation.new(e)} : v
16
+ end
17
+ attr_accessor :name # str
18
+ attr_accessor :component_key # str
19
+ attr_accessor :description # str
20
+ attr_accessor :attestations # seq
21
+ end
22
+
23
+
24
+ class Attestation
25
+ include Kwalify::Util::HashLike
26
+ def initialize(hash=nil)
27
+ if hash.nil?
28
+ return
29
+ end
30
+ @summary = hash['summary']
31
+ @status = hash['status']
32
+ @date_verified = hash['date_verified']
33
+ @satisfies = (v=hash['satisfies']) ? v.map!{|e| e.is_a?(ControlID) ? e : ControlID.new(e)} : v
34
+ @narrative = hash['narrative']
35
+ end
36
+ attr_accessor :summary # str
37
+ attr_accessor :status # str
38
+ attr_accessor :date_verified # date
39
+ attr_accessor :satisfies # seq
40
+ attr_accessor :narrative # str
41
+ end
42
+
43
+
44
+ class ControlID
45
+ include Kwalify::Util::HashLike
46
+ def initialize(hash=nil)
47
+ if hash.nil?
48
+ return
49
+ end
50
+ @standard_key = hash['standard_key']
51
+ @control_key = hash['control_key']
52
+ end
53
+ attr_accessor :standard_key # text
54
+ attr_accessor :control_key # text
55
+ end
56
+
57
+ end
@@ -0,0 +1,55 @@
1
+ require 'kwalify/util/hashlike'
2
+
3
+ module OCTool
4
+
5
+
6
+ class Config
7
+ include Kwalify::Util::HashLike
8
+ def initialize(hash=nil)
9
+ if hash.nil?
10
+ return
11
+ end
12
+ @schema_version = hash['schema_version']
13
+ @name = hash['name']
14
+ @overview = hash['overview']
15
+ @maintainers = hash['maintainers']
16
+ @metadata = (v=hash['metadata']) && v.is_a?(Hash) ? Metadata.new(v) : v
17
+ @includes = (v=hash['includes']) ? v.map!{|e| e.is_a?(Include) ? e : Include.new(e)} : v
18
+ end
19
+ attr_accessor :schema_version # str
20
+ attr_accessor :name # str
21
+ attr_accessor :overview # str
22
+ attr_accessor :maintainers # seq
23
+ attr_accessor :metadata # map
24
+ attr_accessor :includes # seq
25
+ end
26
+
27
+ ## Optional metadata.
28
+ class Metadata
29
+ include Kwalify::Util::HashLike
30
+ def initialize(hash=nil)
31
+ if hash.nil?
32
+ return
33
+ end
34
+ @abstract = hash['abstract']
35
+ @description = hash['description']
36
+ end
37
+ attr_accessor :abstract # str
38
+ attr_accessor :description # str
39
+ end
40
+
41
+
42
+ class Include
43
+ include Kwalify::Util::HashLike
44
+ def initialize(hash=nil)
45
+ if hash.nil?
46
+ return
47
+ end
48
+ @type = hash['type']
49
+ @path = hash['path']
50
+ end
51
+ attr_accessor :type # str
52
+ attr_accessor :path # str
53
+ end
54
+
55
+ end
@@ -0,0 +1,55 @@
1
+ require 'kwalify/util/hashlike'
2
+
3
+ module OCTool
4
+
5
+
6
+ class Standard
7
+ include Kwalify::Util::HashLike
8
+ def initialize(hash=nil)
9
+ if hash.nil?
10
+ return
11
+ end
12
+ @name = hash['name']
13
+ @standard_key = hash['standard_key']
14
+ @families = (v=hash['families']) ? v.map!{|e| e.is_a?(ControlFamily) ? e : ControlFamily.new(e)} : v
15
+ @controls = (v=hash['controls']) ? v.map!{|e| e.is_a?(Control) ? e : Control.new(e)} : v
16
+ end
17
+ attr_accessor :name # str
18
+ attr_accessor :standard_key # str
19
+ attr_accessor :families # seq
20
+ attr_accessor :controls # seq
21
+ end
22
+
23
+
24
+ class ControlFamily
25
+ include Kwalify::Util::HashLike
26
+ def initialize(hash=nil)
27
+ if hash.nil?
28
+ return
29
+ end
30
+ @family_key = hash['family_key']
31
+ @name = hash['name']
32
+ end
33
+ attr_accessor :family_key # str
34
+ attr_accessor :name # str
35
+ end
36
+
37
+
38
+ class Control
39
+ include Kwalify::Util::HashLike
40
+ def initialize(hash=nil)
41
+ if hash.nil?
42
+ return
43
+ end
44
+ @control_key = hash['control_key']
45
+ @family_key = hash['family_key']
46
+ @name = hash['name']
47
+ @description = hash['description']
48
+ end
49
+ attr_accessor :control_key # str
50
+ attr_accessor :family_key # str
51
+ attr_accessor :name # str
52
+ attr_accessor :description # str
53
+ end
54
+
55
+ end
@@ -0,0 +1,103 @@
1
+ module OCTool
2
+ # Custom error to show validation errors.
3
+ class ValidationError < StandardError
4
+ attr_reader :errors
5
+ def initialize(path, errors)
6
+ @path = path
7
+ @errors = errors
8
+ end
9
+
10
+ def message
11
+ msg = ["[ERROR] #{@path}"]
12
+ @errors.each do |e|
13
+ msg << "line #{e.linenum} col #{e.column} [#{e.path}] #{e.message}"
14
+ end
15
+ msg.join("\n")
16
+ end
17
+ end
18
+
19
+ # Logic to wrap the kwalify parser.
20
+ class Parser
21
+ def initialize(path)
22
+ @config_file = path
23
+ die "#{File.expand_path(path)} not readable" unless File.readable?(path)
24
+ end
25
+
26
+ # Class method: check that schemas are valid.
27
+ def self.validate_schemas
28
+ metavalidator = Kwalify::MetaValidator.instance
29
+ kwalify = Kwalify::Yaml::Parser.new(metavalidator)
30
+ Dir.glob("#{BASE_SCHEMA_DIR}/**/*.yaml").each do |schema|
31
+ kwalify.parse_file(schema)
32
+ end
33
+ end
34
+
35
+ def die(message = nil)
36
+ puts '[FAIL] ' + message if message
37
+ exit(1)
38
+ end
39
+
40
+ def validate_file(path, type)
41
+ parser = kwalify_parser(type)
42
+ data = parser.parse_file(path)
43
+ errors = parser.errors
44
+ raise ValidationError.new(path, errors) unless errors.empty?
45
+
46
+ data
47
+ rescue SystemCallError, Kwalify::SyntaxError, ValidationError => e
48
+ die e.message
49
+ end
50
+
51
+ def kwalify_parser(type)
52
+ schema_file = File.join(schema_dir, "#{type}.yaml")
53
+ schema = Kwalify::Yaml.load_file(schema_file)
54
+ validator = Kwalify::Validator.new(schema)
55
+ Kwalify::Yaml::Parser.new(validator) { |p| p.data_binding = true }
56
+ end
57
+
58
+ def schema_dir
59
+ @schema_dir ||= begin
60
+ File.join(BASE_SCHEMA_DIR, schema_version).freeze
61
+ end
62
+ end
63
+
64
+ def schema_version
65
+ @schema_version ||= Kwalify::Yaml.load_file(@config_file)['schema_version']
66
+ rescue StandardError
67
+ warn "Setting schema_version to #{LATEST_SCHEMA_VERSION}"
68
+ LATEST_SCHEMA_VERSION
69
+ end
70
+
71
+ # Check that all data files are valid.
72
+ def validate_data
73
+ base_dir = File.dirname(@config_file)
74
+ config = validate_file(@config_file, 'config')
75
+ config['includes'].each do |inc|
76
+ path = File.join(base_dir, inc['path'])
77
+ type = inc['type']
78
+ validate_file(path, type)
79
+ end
80
+ config
81
+ end
82
+
83
+ def load_system
84
+ base_dir = File.dirname(@config_file)
85
+ config = load_file(@config_file, 'config')
86
+ system = System.new(config)
87
+ config.includes.each do |inc|
88
+ path = File.join(base_dir, inc.path)
89
+ system.data << load_file(path, inc.type)
90
+ end
91
+ system
92
+ end
93
+
94
+ def load_file(path, type)
95
+ die "#{File.expand_path(path)} not readable" unless File.readable?(path)
96
+ klass = Object.const_get("OCTool::#{type.capitalize}")
97
+ ydoc = Kwalify::Yaml.load_file(path)
98
+ klass.new(ydoc)
99
+ rescue SystemCallError, Kwalify::SyntaxError => e
100
+ die e.message
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,47 @@
1
+ require 'erb'
2
+
3
+ module OCTool
4
+ # Build DB, CSV, and markdown.
5
+ class SSP
6
+ def initialize(system, output_dir)
7
+ @system = system
8
+ @output_dir = output_dir
9
+ render_template
10
+ write
11
+ end
12
+
13
+ def render_template
14
+ print "Building markdown #{md_path} ... "
15
+ template_path = File.join(ERB_DIR, 'ssp.erb')
16
+ template = File.read(template_path)
17
+ output = ERB.new(template, nil, '-').result(binding)
18
+ File.open(md_path, 'w') { |f| f.puts output }
19
+ puts 'done'
20
+ end
21
+
22
+ def write
23
+ print "Building #{pdf_path} ... "
24
+ pandoc = Paru::Pandoc.new
25
+ converter = pandoc.configure do
26
+ from 'markdown'
27
+ to 'pdf'
28
+ pdf_engine 'lualatex'
29
+ toc
30
+ toc_depth 3
31
+ number_sections
32
+ highlight_style 'pygments'
33
+ end
34
+ output = converter << File.read(md_path)
35
+ File.new(pdf_path, 'wb').write(output)
36
+ puts 'done'
37
+ end
38
+
39
+ def md_path
40
+ @md_path ||= File.join(@output_dir, 'ssp.md')
41
+ end
42
+
43
+ def pdf_path
44
+ @pdf_path ||= File.join(@output_dir, 'ssp.pdf')
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,77 @@
1
+ module OCTool
2
+ # Representation of a system
3
+ class System
4
+ attr_accessor :config
5
+ attr_accessor :data
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ @data = []
10
+ end
11
+
12
+ def certifications
13
+ @certifications ||= @data.select { |e| e.is_a?(OCTool::Certification) }
14
+ end
15
+
16
+ def components
17
+ @components ||= @data.select { |e| e.is_a?(OCTool::Component) }
18
+ end
19
+
20
+ def standards
21
+ @standards ||= @data.select { |e| e.is_a?(OCTool::Standard) }
22
+ end
23
+
24
+ # List of all attestations claimed by components in the system.
25
+ def attestations
26
+ @attestations ||= begin
27
+ @attestations = []
28
+ components.each do |c|
29
+ # Add a "component_key" field to each attestation.
30
+ c.attestations.map! { |e| e['component_key'] = c.component_key; e }
31
+ @attestations << c.attestations
32
+ end
33
+ @attestations.flatten!
34
+ end
35
+ end
36
+
37
+ # List of all coverages.
38
+ def satisfies
39
+ @satisfies ||= begin
40
+ @satisfies = []
41
+ attestations.each do |a|
42
+ # Add an "attestation_key" field to each cover.
43
+ a.satisfies.map! { |e| e['component_key'] = a.commponent_key; e }
44
+ a.satisfies.map! { |e| e['attestation_key'] = a.attestation_summary; e }
45
+ @satisfies << a.satisfies
46
+ end
47
+ @satisfies.flatten!
48
+ end
49
+ end
50
+
51
+ # List of all controls defined by standards in the system.
52
+ def controls
53
+ @controls || begin
54
+ @controls = []
55
+ standards.each do |s|
56
+ # Add a "standard_key" field to each control.
57
+ s.controls.map! { |e| e['standard_key'] = s.standard_key; e }
58
+ @controls << s.controls
59
+ end
60
+ @controls.flatten!
61
+ end
62
+ end
63
+
64
+ # List of all families defined by standards in the system.
65
+ def families
66
+ @families || begin
67
+ @families = []
68
+ standards.each do |s|
69
+ # Add a "standard_key" field to each family.
70
+ s.families.map! { |e| e['standard_key'] = s.standard_key; e }
71
+ @families << s.families
72
+ end
73
+ @families.flatten!
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module OCTool
2
+ VERSION = '0.0.1'.freeze
3
+ end
@@ -0,0 +1,52 @@
1
+ == octool - Open Compliance Tool
2
+
3
+ v0.0.1
4
+
5
+ === Global Options
6
+ === --help
7
+ Show this message
8
+
9
+
10
+
11
+ === --version
12
+ Display the program version
13
+
14
+
15
+
16
+ === Commands
17
+ ==== Command: <tt>help command</tt>
18
+ Shows a list of commands or help for one command
19
+
20
+ Gets help for the application or its commands. Can also list the commands in a way helpful to creating a bash-style completion function
21
+ ===== Options
22
+ ===== -c
23
+ List commands one per line, to assist with shell completion
24
+
25
+
26
+
27
+ ==== Command: <tt>ssp path/to/system/config.yaml</tt>
28
+ generate System Security Plan
29
+
30
+
31
+ ===== Options
32
+ ===== -d|--dir path/to/output/dir
33
+
34
+ where to store outputs
35
+
36
+ [Default Value] /tmp
37
+ Default output directory respects env vars TMPDIR, TMP, TEMP
38
+
39
+ ==== Command: <tt>validate </tt>
40
+ Check sanity of configuration
41
+
42
+
43
+ ===== Commands
44
+ ====== Command: <tt>data path/to/system/config.yaml</tt>
45
+ validate data
46
+
47
+
48
+ ====== Command: <tt>schemas </tt>
49
+ validate schemas
50
+
51
+
52
+ [Default Command] data
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: map
3
+ class: Certification
4
+ mapping:
5
+ certification_key:
6
+ desc: A short, unique identifier for this certification.
7
+ required: true
8
+ type: str
9
+ unique: true
10
+ name:
11
+ desc: A human-friendly name for the certification.
12
+ required: true
13
+ type: str
14
+ requires:
15
+ desc: List of control IDs required by the certification.
16
+ required: true
17
+ type: seq
18
+ sequence:
19
+ - type: map
20
+ class: ControlID
21
+ mapping:
22
+ standard_key:
23
+ required: true
24
+ type: str
25
+ control_key:
26
+ required: true
27
+ type: str
@@ -0,0 +1,60 @@
1
+ ---
2
+ type: map
3
+ class: Component
4
+ mapping:
5
+ name:
6
+ desc: Human-friendly name to appear in the SSP.
7
+ type: str
8
+ required: true
9
+ component_key:
10
+ desc: Unique identifier for referential integrity.
11
+ type: str
12
+ required: true
13
+ description:
14
+ desc: A paragraph or two that describes the component.
15
+ type: str
16
+ required: true
17
+ attestations:
18
+ desc: List of attestations.
19
+ type: seq
20
+ sequence:
21
+ - type: map
22
+ class: Attestation
23
+ mapping:
24
+ summary:
25
+ desc: Arbitrary verbiage to appear in SSP as a TLDR.
26
+ type: str
27
+ required: true
28
+ status:
29
+ desc: To what extent is this attestation "done"?
30
+ type: str
31
+ required: true
32
+ enum:
33
+ - partial
34
+ - complete
35
+ - planned
36
+ - none
37
+ date_verified:
38
+ desc: When was this last verified?
39
+ type: date
40
+ required: false
41
+ satisfies:
42
+ desc: List of control IDs covered by this attestation.
43
+ type: seq
44
+ required: false
45
+ sequence:
46
+ - type: map
47
+ class: ControlID
48
+ mapping:
49
+ standard_key:
50
+ type: text
51
+ required: true
52
+ control_key:
53
+ type: text
54
+ required: true
55
+ narrative:
56
+ desc: |
57
+ Explain how attestation satisfies the indicated controls.
58
+ The content should be in markdown format.
59
+ type: str
60
+ required: true
@@ -0,0 +1,64 @@
1
+ ---
2
+ type: map
3
+ class: Config
4
+ mapping:
5
+ schema_version:
6
+ desc: |
7
+ Must match one of the schema directories in the octool source.
8
+ required: true
9
+ type: str
10
+
11
+ name:
12
+ desc: Human-friendly to appear in the SSP.
13
+ required: true
14
+ type: str
15
+
16
+ overview:
17
+ desc: Human-friendly description to appear in the SSP.
18
+ required: true
19
+ type: str
20
+
21
+ maintainers:
22
+ desc: Who should somebody contact for questions about this SSP?
23
+ required: true
24
+ type: seq
25
+ sequence:
26
+ - type: str
27
+
28
+ metadata:
29
+ desc: Optional metadata.
30
+ required: false
31
+ type: map
32
+ class: Metadata
33
+ mapping:
34
+ abstract:
35
+ desc: Abstract appears in document metadata.
36
+ required: false
37
+ type: str
38
+ description:
39
+ desc: Description appears in document metadata.
40
+ required: false
41
+ type: str
42
+ '=':
43
+ desc: Arbitrary key:value pair of strings.
44
+ type: str
45
+
46
+ includes:
47
+ desc: Additional files to include from the system repo.
48
+ required: true
49
+ type: seq
50
+ sequence:
51
+ - type: map
52
+ class: Include
53
+ mapping:
54
+ type:
55
+ required: true
56
+ type: str
57
+ enum:
58
+ - certification
59
+ - component
60
+ - standard
61
+ path:
62
+ desc: Path must be relative within the repo.
63
+ required: true
64
+ type: str
@@ -0,0 +1,50 @@
1
+ ---
2
+ type: map
3
+ class: Standard
4
+ mapping:
5
+ name:
6
+ desc: Human-friendly name to appear in SSP.
7
+ type: str
8
+ required: true
9
+
10
+ standard_key:
11
+ desc: Unique ID to use within YAML files.
12
+ type: str
13
+ required: true
14
+
15
+ families:
16
+ desc: Optional list of control families.
17
+ type: seq
18
+ required: false
19
+ sequence:
20
+ - type: map
21
+ class: ControlFamily
22
+ mapping:
23
+ family_key:
24
+ desc: Unique ID of the family
25
+ type: str
26
+ unique: true
27
+ name:
28
+ desc: Human-friendly name of the family
29
+ type: str
30
+ controls:
31
+ desc: Mandatory list of controls defined by the standard.
32
+ required: true
33
+ type: seq
34
+ sequence:
35
+ - type: map
36
+ class: Control
37
+ mapping:
38
+ control_key:
39
+ type: str
40
+ unique: true
41
+ required: true
42
+ family_key:
43
+ type: str
44
+ required: false
45
+ name:
46
+ type: str
47
+ required: true
48
+ description:
49
+ type: str
50
+ required: true
@@ -0,0 +1,120 @@
1
+ ---
2
+ title: "<%= @system.config.name -%>"
3
+ subtitle: "System Security Plan"
4
+
5
+ author:
6
+ <% @system.config.maintainers.each do |maintainer| %>
7
+ - <%= maintainer -%>
8
+ <% end %>
9
+
10
+ absract: |
11
+ <%= @system.config.metadata.abstract rescue 'None' %>
12
+
13
+ description: |
14
+ <%= @system.config.metadata.description rescue 'None' %>
15
+
16
+ fontsize: 11pt
17
+ mainfont: NotoSans
18
+ #monofont: NotoSansMono-ExtraCondensedLight
19
+ monofont: NotoSansMono-ExtraCondensed
20
+ mainfontoptions:
21
+ - Numbers=Lowercase
22
+ - Numbers=Proportional
23
+ - UprightFont=*
24
+ - ItalicFont=*-Italic
25
+ - BoldFont=*-Bold
26
+ - BoldItalicFont=*-BoldItalic
27
+
28
+ lof: false
29
+ lot: false
30
+ colorlinks: true
31
+ linkcolor: blue
32
+ urlcolor: blue
33
+
34
+ documentclass: report
35
+ classoption:
36
+ - onecolumn
37
+ - oneside
38
+ - portrait
39
+
40
+ pagestyle: headings
41
+ papersize: letter
42
+ geometry:
43
+ - top=2cm
44
+ - left=2cm
45
+ - right=2cm
46
+ - bottom=2cm
47
+ ---
48
+
49
+ # <%= @system.config.name %>
50
+
51
+ ## Overview
52
+
53
+ <%= @system.config.overview %>
54
+
55
+ ## Standards
56
+
57
+ This System Security Plan (SSP) addresses these standards:
58
+
59
+ <% @system.standards.each do |s| -%>
60
+ - <%= s.name %>
61
+ <% end %>
62
+
63
+ The full copy of each standard is included in the appendix.
64
+
65
+
66
+ ## Components
67
+
68
+ <% @system.components.each do |c| %>
69
+ ### <%= c.name %>
70
+
71
+ <%= c.description %>
72
+
73
+ <% if c.attestations.empty? %>
74
+ _The organization has not yet documented attestations for this component_.
75
+ <% else %>
76
+ The organization offers the following attestations for this component.
77
+ <% end %>
78
+
79
+ <% c.attestations.each do |a| %>
80
+ #### <%= a.summary %>
81
+
82
+ Status: <%= a.status %>
83
+
84
+ Date verified: <%= a.date_verified if a.date_verified %>
85
+
86
+ Satisfies:
87
+
88
+ <% a.satisfies.each do |cid| -%>
89
+ - <%= cid.standard_key %> control <%= cid.control_key %>
90
+ <% end -%>
91
+
92
+ <%= a.narrative %>
93
+
94
+ <% end %>
95
+ <% end %>
96
+
97
+
98
+ # Appendix: Standards
99
+
100
+ <% @system.standards.each do |s| %>
101
+ ## <%=s.name %>
102
+
103
+ <% if s.families and !s.families.empty? %>
104
+ ### Families
105
+
106
+ <% s.families.each do |family| %>
107
+ - <%= family.family_key -%>: <%= family.name %>
108
+ <% end %>
109
+
110
+ <% end %>
111
+
112
+ ### Controls
113
+
114
+ <% s.controls.each do |c| %>
115
+ #### Control <%= c.control_key -%>: <%= c.name %>
116
+
117
+ <%= c.description %>
118
+
119
+ <% end %>
120
+ <% end %>
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: octool
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Paul Morgan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-05-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '13.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '13.1'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '13.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rdoc
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '6.2'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '6.3'
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '6.2'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '6.3'
53
+ - !ruby/object:Gem::Dependency
54
+ name: daru
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '='
58
+ - !ruby/object:Gem::Version
59
+ version: 0.2.2
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '='
65
+ - !ruby/object:Gem::Version
66
+ version: 0.2.2
67
+ - !ruby/object:Gem::Dependency
68
+ name: gli
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '='
72
+ - !ruby/object:Gem::Version
73
+ version: 2.19.0
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '='
79
+ - !ruby/object:Gem::Version
80
+ version: 2.19.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: kwalify
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '='
86
+ - !ruby/object:Gem::Version
87
+ version: 0.7.2
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '='
93
+ - !ruby/object:Gem::Version
94
+ version: 0.7.2
95
+ - !ruby/object:Gem::Dependency
96
+ name: pandoc-ruby
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 2.1.4
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '='
107
+ - !ruby/object:Gem::Version
108
+ version: 2.1.4
109
+ - !ruby/object:Gem::Dependency
110
+ name: paru
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '='
114
+ - !ruby/object:Gem::Version
115
+ version: 0.4.0.1
116
+ type: :runtime
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '='
121
+ - !ruby/object:Gem::Version
122
+ version: 0.4.0.1
123
+ description:
124
+ email: jumanjiman@gmail.com
125
+ executables:
126
+ - octool
127
+ extensions: []
128
+ extra_rdoc_files:
129
+ - README.rdoc
130
+ - octool.rdoc
131
+ files:
132
+ - README.rdoc
133
+ - bin/octool
134
+ - lib/octool.rb
135
+ - lib/octool/constants.rb
136
+ - lib/octool/generated/certification.rb
137
+ - lib/octool/generated/component.rb
138
+ - lib/octool/generated/config.rb
139
+ - lib/octool/generated/standard.rb
140
+ - lib/octool/parser.rb
141
+ - lib/octool/ssp.rb
142
+ - lib/octool/system.rb
143
+ - lib/octool/version.rb
144
+ - octool.rdoc
145
+ - schemas/v1.0.0/certification.yaml
146
+ - schemas/v1.0.0/component.yaml
147
+ - schemas/v1.0.0/config.yaml
148
+ - schemas/v1.0.0/standard.yaml
149
+ - templates/ssp.erb
150
+ homepage: https://github.com/jumanjiman/octool
151
+ licenses:
152
+ - GPL-3.0
153
+ metadata: {}
154
+ post_install_message:
155
+ rdoc_options:
156
+ - "--title"
157
+ - octool
158
+ - "--main"
159
+ - README.rdoc
160
+ - "-ri"
161
+ require_paths:
162
+ - lib
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubygems_version: 3.1.2
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Open Compliance Toolkit
179
+ test_files: []