Compare commits

...

286 Commits

Author SHA256 Message Date
aa94c53d65 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@aef00ec at 2025-10-26T18:19:48Z on 6f8f9a786bfa

Generated at : 2025-10-26T18:19:48Z
Runner Host  : 6f8f9a786bfa
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : aef00ec HEAD -> master
2025-10-26 18:19:48 +00:00
aef00ec63d V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m59s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 18:17:28 +00:00
71d189e2c7 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@403a70a at 2025-10-26T17:24:00Z on 8f92a12ee776

Generated at : 2025-10-26T17:24:00Z
Runner Host  : 8f92a12ee776
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 403a70a HEAD -> master
2025-10-26 17:24:00 +00:00
403a70a886 Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m49s
2025-10-26 17:22:09 +00:00
3d39f44c75 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 17:21:58 +00:00
28b246d280 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@25e230a at 2025-10-26T17:21:53Z on 2cb42c1f329c

Generated at : 2025-10-26T17:21:53Z
Runner Host  : 2cb42c1f329c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 25e230a HEAD -> master
2025-10-26 17:21:53 +00:00
25e230ace4 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m6s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 17:19:26 +00:00
893740c2bf DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@85c46f3 at 2025-10-26T16:50:37Z on 1d5ebfdde700

Generated at : 2025-10-26T16:50:37Z
Runner Host  : 1d5ebfdde700
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 85c46f3 HEAD -> master
2025-10-26 16:50:37 +00:00
85c46f3c4c V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 16:48:17 +00:00
1c83813ec4 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0023ceb at 2025-10-26T16:27:39Z on 4f47e3dfaa73

Generated at : 2025-10-26T16:27:39Z
Runner Host  : 4f47e3dfaa73
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0023ceb HEAD -> master
2025-10-26 16:27:39 +00:00
0023ceb83e V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m42s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 16:25:44 +00:00
d54ca7c415 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@6254d98 at 2025-10-26T16:13:03Z on 8e8821304879

Generated at : 2025-10-26T16:13:03Z
Runner Host  : 8e8821304879
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 6254d98 HEAD -> master
2025-10-26 16:13:03 +00:00
6254d988e6 Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m2s
2025-10-26 16:10:58 +00:00
3fb9ebe556 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 16:10:48 +00:00
8f3763950a DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@54e72c0 at 2025-10-26T16:06:58Z on 7888ef2e57e4

Generated at : 2025-10-26T16:06:58Z
Runner Host  : 7888ef2e57e4
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 54e72c0 HEAD -> master
2025-10-26 16:06:58 +00:00
54e72c014b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 16:05:01 +00:00
a5282fa305 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0bde766 at 2025-10-26T15:56:46Z on 5447d238476c

Generated at : 2025-10-26T15:56:46Z
Runner Host  : 5447d238476c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0bde766 HEAD -> master
2025-10-26 15:56:46 +00:00
0bde766c8c Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m1s
2025-10-26 15:54:42 +00:00
01275e130e V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:54:33 +00:00
a60a1c44ad DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4fc97f6 at 2025-10-26T15:53:14Z on 354c2474ff0d

Generated at : 2025-10-26T15:53:14Z
Runner Host  : 354c2474ff0d
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4fc97f6 HEAD -> master
2025-10-26 15:53:14 +00:00
4fc97f6988 Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m0s
2025-10-26 15:51:11 +00:00
ab326392e4 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:51:02 +00:00
7920f41bd8 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9928148 at 2025-10-26T15:50:54Z on ba42564d5f6a

Generated at : 2025-10-26T15:50:54Z
Runner Host  : ba42564d5f6a
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9928148 HEAD -> master
2025-10-26 15:50:54 +00:00
9928148850 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:48:56 +00:00
693f3252ab DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@bd099f5 at 2025-10-26T15:46:52Z on b01ff1809bf2

Generated at : 2025-10-26T15:46:52Z
Runner Host  : b01ff1809bf2
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : bd099f5 HEAD -> master
2025-10-26 15:46:52 +00:00
bd099f5cec V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m44s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:44:59 +00:00
dc9521bac8 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f927caf at 2025-10-26T15:33:02Z on 558d44a1dd91

Generated at : 2025-10-26T15:33:02Z
Runner Host  : 558d44a1dd91
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f927caf HEAD -> master
2025-10-26 15:33:02 +00:00
f927caf036 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m42s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:31:13 +00:00
9d0b956ece V8.00.000.2025.06.17
Some checks failed
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Has been cancelled
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:29:47 +00:00
def3971add DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@a9a7db7 at 2025-10-26T15:18:45Z on cabf48d956c9

Generated at : 2025-10-26T15:18:45Z
Runner Host  : cabf48d956c9
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : a9a7db7 HEAD -> master
2025-10-26 15:18:45 +00:00
a9a7db7c6b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:16:37 +00:00
a2b1fcb457 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 15:11:48 +00:00
5eadfa9b00 V8.00.000.2025.06.17
Some checks failed
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Failing after 2m1s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-26 10:27:49 +00:00
09e808fb85 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@37f89fe at 2025-10-25T05:15:06Z on a702815198f9

Generated at : 2025-10-25T05:15:06Z
Runner Host  : a702815198f9
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 37f89fe HEAD -> master
2025-10-25 05:15:06 +00:00
37f89fee08 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-25 06:13:07 +01:00
3af306ca6e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@d2598e4 at 2025-10-24T21:31:04Z on 37c9b2f8d14b

Generated at : 2025-10-24T21:31:04Z
Runner Host  : 37c9b2f8d14b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : d2598e4 HEAD -> master
2025-10-24 21:31:04 +00:00
d2598e40db V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m57s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 22:29:00 +01:00
5f6cf4f16d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@06b5914 at 2025-10-24T21:23:03Z on 3294b5a1b351

Generated at : 2025-10-24T21:23:03Z
Runner Host  : 3294b5a1b351
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 06b5914 HEAD -> master
2025-10-24 21:23:03 +00:00
06b59142c3 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m12s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 22:20:46 +01:00
c150e90579 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f3340c5 at 2025-10-24T21:16:40Z on 2fd00192ea83

Generated at : 2025-10-24T21:16:40Z
Runner Host  : 2fd00192ea83
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f3340c5 HEAD -> master
2025-10-24 21:16:40 +00:00
f3340c5f5e Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m3s
2025-10-24 22:14:34 +01:00
2e57644a6d V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 22:14:25 +01:00
3521edb436 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e06932c at 2025-10-24T21:04:51Z on f6f7481a55cf

Generated at : 2025-10-24T21:04:51Z
Runner Host  : f6f7481a55cf
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e06932c HEAD -> master
2025-10-24 21:04:51 +00:00
e06932ce08 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 22:02:50 +01:00
83b439bc70 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@8ba80fb at 2025-10-24T21:01:34Z on 0a6b42fe1553

Generated at : 2025-10-24T21:01:34Z
Runner Host  : 0a6b42fe1553
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 8ba80fb HEAD -> master
2025-10-24 21:01:34 +00:00
8ba80fbb38 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m15s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 21:59:13 +01:00
d035127a67 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@8ad3905 at 2025-10-24T20:53:54Z on 747de99e5ea4

Generated at : 2025-10-24T20:53:54Z
Runner Host  : 747de99e5ea4
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 8ad3905 HEAD -> master
2025-10-24 20:53:54 +00:00
8ad39056cf V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m48s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 21:52:02 +01:00
ef4224cc88 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9972a0f at 2025-10-24T20:38:02Z on fdbef0cbcfda

Generated at : 2025-10-24T20:38:02Z
Runner Host  : fdbef0cbcfda
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9972a0f HEAD -> master
2025-10-24 20:38:02 +00:00
9972a0fd28 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m40s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 21:36:17 +01:00
2dd7607dd0 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@bafcd78 at 2025-10-24T20:28:01Z on 8a3d1e5f2396

Generated at : 2025-10-24T20:28:01Z
Runner Host  : 8a3d1e5f2396
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : bafcd78 HEAD -> master
2025-10-24 20:28:01 +00:00
bafcd78259 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m7s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 21:24:26 +01:00
b2776e2c82 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4c20c87 at 2025-10-24T20:12:14Z on d8f43e8ec603

Generated at : 2025-10-24T20:12:14Z
Runner Host  : d8f43e8ec603
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4c20c87 HEAD -> master
2025-10-24 20:12:14 +00:00
4c20c8754b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m49s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 21:10:04 +01:00
9372c55878 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@17bf5ca at 2025-10-24T20:00:48Z on 75a993c76d62

Generated at : 2025-10-24T20:00:48Z
Runner Host  : 75a993c76d62
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 17bf5ca HEAD -> master
2025-10-24 20:00:48 +00:00
17bf5ca5fc V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m53s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 20:58:50 +01:00
ffb20a7342 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@1453f64 at 2025-10-24T19:42:11Z on d274eb5a6cd1

Generated at : 2025-10-24T19:42:11Z
Runner Host  : d274eb5a6cd1
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 1453f64 HEAD -> master
2025-10-24 19:42:11 +00:00
1453f64a72 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m3s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 20:40:00 +01:00
559a5a3b88 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@efcbf4e at 2025-10-24T10:03:03Z on 28ded160e9fd

Generated at : 2025-10-24T10:03:03Z
Runner Host  : 28ded160e9fd
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : efcbf4e HEAD -> master
2025-10-24 10:03:03 +00:00
efcbf4eb74 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m0s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 11:00:58 +01:00
ae8c620737 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@dcd3680 at 2025-10-24T09:59:48Z on ef4eb8a2c630

Generated at : 2025-10-24T09:59:48Z
Runner Host  : ef4eb8a2c630
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : dcd3680 HEAD -> master
2025-10-24 09:59:48 +00:00
dcd3680077 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-24 10:57:49 +01:00
fd60deb5b9 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0bcd9fd at 2025-10-23T15:55:22Z on 65e3b9b9a48e

Generated at : 2025-10-23T15:55:22Z
Runner Host  : 65e3b9b9a48e
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0bcd9fd HEAD -> master
2025-10-23 15:55:22 +00:00
0bcd9fd9e9 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m36s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 16:53:25 +01:00
3bbbb07745 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@580d748 at 2025-10-23T13:42:46Z on 550706de1a42

Generated at : 2025-10-23T13:42:46Z
Runner Host  : 550706de1a42
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 580d748 HEAD -> master
2025-10-23 13:42:46 +00:00
580d7481f9 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m4s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 14:40:29 +01:00
f0acb1ed90 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0d605b8 at 2025-10-23T13:38:24Z on 6501e93af96d

Generated at : 2025-10-23T13:38:24Z
Runner Host  : 6501e93af96d
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0d605b8 HEAD -> master
2025-10-23 13:38:24 +00:00
0d605b82fd V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m45s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 14:36:33 +01:00
ec88ccf804 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@081533d at 2025-10-23T13:35:03Z on aecbc3c7b870

Generated at : 2025-10-23T13:35:03Z
Runner Host  : aecbc3c7b870
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 081533d HEAD -> master
2025-10-23 13:35:03 +00:00
081533db2a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 14:32:55 +01:00
551bd95d80 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@947458d at 2025-10-23T12:39:22Z on 4166edab8d4f

Generated at : 2025-10-23T12:39:22Z
Runner Host  : 4166edab8d4f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 947458d HEAD -> master
2025-10-23 12:39:22 +00:00
947458d174 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 13:37:10 +01:00
a0a04173ab DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@69b6d93 at 2025-10-22T23:30:46Z on 4615b025740f

Generated at : 2025-10-22T23:30:46Z
Runner Host  : 4615b025740f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 69b6d93 HEAD -> master
2025-10-22 23:30:46 +00:00
69b6d93b98 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 00:28:44 +01:00
7ab22c86db DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@17aef8f at 2025-10-22T23:10:19Z on 208d2fd23b8c

Generated at : 2025-10-22T23:10:19Z
Runner Host  : 208d2fd23b8c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 17aef8f HEAD -> master
2025-10-22 23:10:19 +00:00
17aef8f146 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m1s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-23 00:07:56 +01:00
4ca079f597 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@580999b at 2025-10-22T22:36:07Z on 7d7eedffb4a0

Generated at : 2025-10-22T22:36:07Z
Runner Host  : 7d7eedffb4a0
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 580999b HEAD -> master
2025-10-22 22:36:07 +00:00
580999bd8f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m54s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-22 23:34:05 +01:00
76e2a7b952 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@d8c4bc6 at 2025-10-22T22:08:49Z on 0ee036bdc077

Generated at : 2025-10-22T22:08:49Z
Runner Host  : 0ee036bdc077
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : d8c4bc6 HEAD -> master
2025-10-22 22:08:49 +00:00
d8c4bc665a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m47s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-22 23:04:12 +01:00
bd614c17c9 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-22 22:39:10 +01:00
c501b8de5a DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@86c4834 at 2025-10-22T07:45:27Z on 285411372aa0

Generated at : 2025-10-22T07:45:27Z
Runner Host  : 285411372aa0
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 86c4834 HEAD -> master
2025-10-22 07:45:27 +00:00
86c483459a Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m41s
2025-10-22 08:43:42 +01:00
a4f7c83ba2 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-22 08:43:32 +01:00
8246296314 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4bd51c9 at 2025-10-21T22:42:06Z on 82d8ae391286

Generated at : 2025-10-21T22:42:06Z
Runner Host  : 82d8ae391286
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4bd51c9 HEAD -> master
2025-10-21 22:42:06 +00:00
4bd51c93ed V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m15s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 23:39:44 +01:00
aa70c307cd DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@a09a55e at 2025-10-21T22:26:52Z on 975de1322842

Generated at : 2025-10-21T22:26:52Z
Runner Host  : 975de1322842
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : a09a55e HEAD -> master
2025-10-21 22:26:52 +00:00
a09a55e19f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m15s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 23:24:11 +01:00
bf4a4ca5c6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9d0b38b at 2025-10-21T21:23:08Z on d525784cb421

Generated at : 2025-10-21T21:23:08Z
Runner Host  : d525784cb421
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9d0b38b HEAD -> master
2025-10-21 21:23:08 +00:00
9d0b38ba93 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m58s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 22:21:06 +01:00
76e50cd59e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@53cb079 at 2025-10-21T21:09:17Z on 505072dedfe9

Generated at : 2025-10-21T21:09:17Z
Runner Host  : 505072dedfe9
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 53cb079 HEAD -> master
2025-10-21 21:09:17 +00:00
53cb07934e V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m6s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 22:06:46 +01:00
ffada99ce2 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@74f18a2 at 2025-10-21T20:11:16Z on 2c756f3ef335

Generated at : 2025-10-21T20:11:16Z
Runner Host  : 2c756f3ef335
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 74f18a2 HEAD -> master
2025-10-21 20:11:16 +00:00
74f18a2dd5 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m57s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 21:09:12 +01:00
5824d6367f DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9221726 at 2025-10-21T19:22:55Z on 6389c42e3f0f

Generated at : 2025-10-21T19:22:55Z
Runner Host  : 6389c42e3f0f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9221726 HEAD -> master
2025-10-21 19:22:55 +00:00
9221726408 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 20:20:32 +01:00
8d8307c9a6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@aa49722 at 2025-10-21T13:32:12Z on efd12b1f6f3e

Generated at : 2025-10-21T13:32:12Z
Runner Host  : efd12b1f6f3e
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : aa49722 HEAD -> master
2025-10-21 13:32:12 +00:00
aa49722611 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m7s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 14:29:32 +01:00
13b5f09e24 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f9ee42b at 2025-10-21T07:40:40Z on f290e0c12acc

Generated at : 2025-10-21T07:40:40Z
Runner Host  : f290e0c12acc
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f9ee42b HEAD -> master
2025-10-21 07:40:40 +00:00
f9ee42b2d1 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m49s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 08:38:43 +01:00
c998536417 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@82096f7 at 2025-10-21T07:02:29Z on 82a83f19e6a0

Generated at : 2025-10-21T07:02:29Z
Runner Host  : 82a83f19e6a0
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 82096f7 HEAD -> master
2025-10-21 07:02:29 +00:00
82096f7b7d V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m13s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-21 07:59:51 +01:00
45b4bd7f12 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f761aed at 2025-10-19T18:29:33Z on b72bc8d38f8d

Generated at : 2025-10-19T18:29:33Z
Runner Host  : b72bc8d38f8d
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f761aed HEAD -> master
2025-10-19 18:29:33 +00:00
f761aedb24 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m38s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 19:27:46 +01:00
50af69ce3c DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4224051 at 2025-10-19T18:13:41Z on ffcc7dfa3751

Generated at : 2025-10-19T18:13:41Z
Runner Host  : ffcc7dfa3751
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4224051 HEAD -> master
2025-10-19 18:13:41 +00:00
422405119b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m33s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 19:12:01 +01:00
0f137c0f2b DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ddea904 at 2025-10-19T17:59:47Z on c2c5791af78d

Generated at : 2025-10-19T17:59:47Z
Runner Host  : c2c5791af78d
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ddea904 HEAD -> master
2025-10-19 17:59:47 +00:00
ddea9042fc V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m30s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 18:57:53 +01:00
eceda5992f DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@3ce692a at 2025-10-19T15:40:49Z on e8f8b7215443

Generated at : 2025-10-19T15:40:49Z
Runner Host  : e8f8b7215443
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 3ce692a HEAD -> master
2025-10-19 15:40:49 +00:00
3ce692acb2 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m55s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 16:38:41 +01:00
3b3cc002ae DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e717f0a at 2025-10-19T15:05:52Z on 35cb32ac2278

Generated at : 2025-10-19T15:05:52Z
Runner Host  : 35cb32ac2278
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e717f0a HEAD -> master
2025-10-19 15:05:52 +00:00
e717f0aa2f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m44s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 16:03:46 +01:00
f34190107b DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@c0b8053 at 2025-10-19T14:16:36Z on 4e9ee4872215

Generated at : 2025-10-19T14:16:36Z
Runner Host  : 4e9ee4872215
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : c0b8053 HEAD -> master
2025-10-19 14:16:36 +00:00
c0b8053809 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m27s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 15:15:02 +01:00
aaf9033894 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@b25e0dc at 2025-10-19T14:13:16Z on 7be15cf816b7

Generated at : 2025-10-19T14:13:16Z
Runner Host  : 7be15cf816b7
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : b25e0dc HEAD -> master
2025-10-19 14:13:16 +00:00
b25e0dc324 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m4s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 15:10:57 +01:00
76532b63dd DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4fe9164 at 2025-10-19T14:03:36Z on a73f37cd3199

Generated at : 2025-10-19T14:03:36Z
Runner Host  : a73f37cd3199
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4fe9164 HEAD -> master
2025-10-19 14:03:36 +00:00
4fe9164edf V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 15:01:37 +01:00
b430fc4d81 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@320ac22 at 2025-10-19T13:51:53Z on 12bacbea9be1

Generated at : 2025-10-19T13:51:53Z
Runner Host  : 12bacbea9be1
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 320ac22 HEAD -> master
2025-10-19 13:51:54 +00:00
320ac222cf V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m0s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 14:49:32 +01:00
60917205a6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@5bbea53 at 2025-10-19T13:22:09Z on 0440902671fe

Generated at : 2025-10-19T13:22:09Z
Runner Host  : 0440902671fe
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 5bbea53 HEAD -> master
2025-10-19 13:22:09 +00:00
5bbea53cf4 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 14:19:22 +01:00
2cf85c772b DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@1b61bc9 at 2025-10-19T12:50:09Z on 98c3b0e4ca20

Generated at : 2025-10-19T12:50:09Z
Runner Host  : 98c3b0e4ca20
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 1b61bc9 HEAD -> master
2025-10-19 12:50:09 +00:00
1b61bc98a6 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m50s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 13:47:56 +01:00
00f31a40d6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@eb1c23d at 2025-10-19T12:15:55Z on 97ff628e4648

Generated at : 2025-10-19T12:15:55Z
Runner Host  : 97ff628e4648
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : eb1c23d HEAD -> master
2025-10-19 12:15:55 +00:00
eb1c23d628 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m43s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 13:14:05 +01:00
7a94c2cf0e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@a918981 at 2025-10-19T12:05:01Z on b2a91c23a258

Generated at : 2025-10-19T12:05:01Z
Runner Host  : b2a91c23a258
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : a918981 HEAD -> master
2025-10-19 12:05:01 +00:00
a918981bb1 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m30s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 13:02:33 +01:00
12653e9607 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9722767 at 2025-10-19T12:01:05Z on e717abf84923

Generated at : 2025-10-19T12:01:05Z
Runner Host  : e717abf84923
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9722767 HEAD -> master
2025-10-19 12:01:05 +00:00
972276754a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m58s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 12:58:02 +01:00
c8762bca62 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f440586 at 2025-10-19T11:27:30Z on 79ed65ce7a27

Generated at : 2025-10-19T11:27:30Z
Runner Host  : 79ed65ce7a27
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f440586 HEAD -> master
2025-10-19 11:27:30 +00:00
f440586489 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m52s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 12:25:30 +01:00
cf0d0572a2 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@891a92b at 2025-10-19T10:28:48Z on 446d499a2bb1

Generated at : 2025-10-19T10:28:48Z
Runner Host  : 446d499a2bb1
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 891a92b HEAD -> master
2025-10-19 10:28:48 +00:00
891a92bb7c V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m44s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 11:26:42 +01:00
d9ce880cec DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@8ad8bfb at 2025-10-19T09:52:42Z on 73ee6a4d5fbb

Generated at : 2025-10-19T09:52:42Z
Runner Host  : 73ee6a4d5fbb
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 8ad8bfb HEAD -> master
2025-10-19 09:52:42 +00:00
8ad8bfb977 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m59s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 10:50:36 +01:00
a4fa9077f5 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@6f06c6a at 2025-10-19T09:37:03Z on 7c3895a17e95

Generated at : 2025-10-19T09:37:03Z
Runner Host  : 7c3895a17e95
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 6f06c6a HEAD -> master
2025-10-19 09:37:03 +00:00
6f06c6a2ca V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 10:34:52 +01:00
12f038ea9a DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@b7c7e64 at 2025-10-19T09:19:54Z on 30db4b9bb64a

Generated at : 2025-10-19T09:19:54Z
Runner Host  : 30db4b9bb64a
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : b7c7e64 HEAD -> master
2025-10-19 09:19:54 +00:00
b7c7e643e9 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m3s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 10:17:05 +01:00
71bb0af314 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@cc46906 at 2025-10-19T08:41:05Z on a73d9f517a5b

Generated at : 2025-10-19T08:41:05Z
Runner Host  : a73d9f517a5b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : cc46906 HEAD -> master
2025-10-19 08:41:05 +00:00
cc46906544 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 09:37:48 +01:00
b7a7facb58 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@116b878 at 2025-10-19T08:28:23Z on 44facea95555

Generated at : 2025-10-19T08:28:23Z
Runner Host  : 44facea95555
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 116b878 HEAD -> master
2025-10-19 08:28:23 +00:00
116b8788d7 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m47s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 09:26:30 +01:00
b724e18d62 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0169be5 at 2025-10-19T08:09:15Z on e2a3bb45de49

Generated at : 2025-10-19T08:09:15Z
Runner Host  : e2a3bb45de49
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0169be5 HEAD -> master
2025-10-19 08:09:15 +00:00
0169be5527 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m44s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-19 09:06:27 +01:00
f7493e37e1 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@5986c45 at 2025-10-17T22:27:54Z on ddf82aab2a1f

Generated at : 2025-10-17T22:27:54Z
Runner Host  : ddf82aab2a1f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 5986c45 HEAD -> master
2025-10-17 22:27:54 +00:00
5986c451ca Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
2025-10-17 23:26:14 +01:00
07e5624eea V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-17 23:25:41 +01:00
b8bc0b95ec DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@7d599e8 at 2025-10-17T05:44:44Z on 93a1dc5397b5

Generated at : 2025-10-17T05:44:44Z
Runner Host  : 93a1dc5397b5
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 7d599e8 HEAD -> master
2025-10-17 05:44:44 +00:00
7d599e8463 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m1s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-17 06:42:14 +01:00
bedd0d3fa5 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@2b37934 at 2025-10-15T23:05:08Z on 7eaf6728c450

Generated at : 2025-10-15T23:05:08Z
Runner Host  : 7eaf6728c450
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 2b37934 HEAD -> master
2025-10-15 23:05:08 +00:00
2b37934652 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m21s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-16 00:03:33 +01:00
ffbf2873b3 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@cbf472c at 2025-10-15T22:39:48Z on af62b2e56f8d

Generated at : 2025-10-15T22:39:48Z
Runner Host  : af62b2e56f8d
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : cbf472c HEAD -> master
2025-10-15 22:39:48 +00:00
cbf472c4dd V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m46s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-15 23:37:48 +01:00
3e934a017e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@51d5829 at 2025-10-15T22:04:48Z on b391dbbacb7a

Generated at : 2025-10-15T22:04:48Z
Runner Host  : b391dbbacb7a
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 51d5829 HEAD -> master
2025-10-15 22:04:48 +00:00
51d5829021 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-15 22:59:52 +01:00
cb15419010 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e2af6d2 at 2025-10-15T06:25:19Z on a657649553aa

Generated at : 2025-10-15T06:25:19Z
Runner Host  : a657649553aa
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e2af6d2 HEAD -> master
2025-10-15 06:25:19 +00:00
e2af6d2687 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-15 07:23:22 +01:00
f133bf0043 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@3a50fc5 at 2025-10-15T06:11:30Z on 025e98addae5

Generated at : 2025-10-15T06:11:30Z
Runner Host  : 025e98addae5
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 3a50fc5 HEAD -> master
2025-10-15 06:11:30 +00:00
3a50fc5050 Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m38s
2025-10-15 07:09:48 +01:00
f0bbc6094d V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-15 07:08:52 +01:00
88bba53981 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0bb6cb6 at 2025-10-14T23:01:44Z on 1d197b3223a4

Generated at : 2025-10-14T23:01:44Z
Runner Host  : 1d197b3223a4
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0bb6cb6 HEAD -> master
2025-10-14 23:01:44 +00:00
0bb6cb6a64 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m47s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 23:59:37 +01:00
fde6223987 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e5ddb69 at 2025-10-14T20:45:42Z on 1091b648d371

Generated at : 2025-10-14T20:45:42Z
Runner Host  : 1091b648d371
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e5ddb69 HEAD -> master
2025-10-14 20:45:42 +00:00
e5ddb69a9e V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 21:43:27 +01:00
236b0e56f6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0cc6c26 at 2025-10-14T19:53:04Z on 08e9b23245b6

Generated at : 2025-10-14T19:53:04Z
Runner Host  : 08e9b23245b6
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0cc6c26 HEAD -> master
2025-10-14 19:53:04 +00:00
0cc6c266b9 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m34s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 20:51:22 +01:00
e69ef46893 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@d5d905e at 2025-10-14T18:52:42Z on 873d11d2c88a

Generated at : 2025-10-14T18:52:42Z
Runner Host  : 873d11d2c88a
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : d5d905e HEAD -> master
2025-10-14 18:52:42 +00:00
d5d905e72f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m44s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 19:50:50 +01:00
16012430ea DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@6788971 at 2025-10-14T18:25:47Z on 4c4bf3ff9097

Generated at : 2025-10-14T18:25:47Z
Runner Host  : 4c4bf3ff9097
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 6788971 HEAD -> master
2025-10-14 18:25:47 +00:00
6788971f60 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m25s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 19:24:01 +01:00
8be52f285c DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@60a932d at 2025-10-14T17:59:29Z on d45952900f4a

Generated at : 2025-10-14T17:59:29Z
Runner Host  : d45952900f4a
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 60a932d HEAD -> master
2025-10-14 17:59:29 +00:00
60a932d48b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m38s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 18:57:38 +01:00
3cf1cce7ae DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4e6f4b7 at 2025-10-14T17:22:49Z on a1f5ecdeb00b

Generated at : 2025-10-14T17:22:49Z
Runner Host  : a1f5ecdeb00b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4e6f4b7 HEAD -> master
2025-10-14 17:22:49 +00:00
4e6f4b7447 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m50s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 18:20:29 +01:00
087b104924 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@f8b1306 at 2025-10-14T12:41:47Z on ba6d0ca0d45f

Generated at : 2025-10-14T12:41:47Z
Runner Host  : ba6d0ca0d45f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : f8b1306 HEAD -> master
2025-10-14 12:41:47 +00:00
f8b13063a8 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m49s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 13:39:51 +01:00
75ff61e256 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 13:37:54 +01:00
2dbdff7570 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@77856e9 at 2025-10-14T09:34:06Z on 047edf5b5b60

Generated at : 2025-10-14T09:34:06Z
Runner Host  : 047edf5b5b60
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 77856e9 HEAD -> master
2025-10-14 09:34:06 +00:00
77856e9436 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m31s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 10:32:08 +01:00
e0879a4969 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-14 07:33:05 +01:00
94bbbb1af6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e8d69f1 at 2025-10-13T19:16:10Z on 2c4a10a95c68

Generated at : 2025-10-13T19:16:10Z
Runner Host  : 2c4a10a95c68
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e8d69f1 HEAD -> master
2025-10-13 19:16:10 +00:00
e8d69f1fa1 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m43s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 20:14:15 +01:00
fa95de278d Merge remote-tracking branch 'origin/master' 2025-10-13 20:09:49 +01:00
50c080c83f V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 20:09:39 +01:00
1f0a75281f DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ad4c56f at 2025-10-13T18:53:28Z on 7240d27de8ea

Generated at : 2025-10-13T18:53:28Z
Runner Host  : 7240d27de8ea
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ad4c56f HEAD -> master
2025-10-13 18:53:29 +00:00
ad4c56fdb5 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m31s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 19:51:43 +01:00
f222665cad DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@adbc0eb at 2025-10-13T18:18:59Z on 93e5b9019658

Generated at : 2025-10-13T18:18:59Z
Runner Host  : 93e5b9019658
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : adbc0eb HEAD -> master
2025-10-13 18:18:59 +00:00
adbc0eb515 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m51s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 19:16:58 +01:00
e7f369b80c DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@a8142ab at 2025-10-13T18:00:37Z on 0a530cd02efd

Generated at : 2025-10-13T18:00:37Z
Runner Host  : 0a530cd02efd
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : a8142ab HEAD -> master
2025-10-13 18:00:37 +00:00
a8142abc9c V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m22s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 18:58:51 +01:00
e5262782e9 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4e90eb9 at 2025-10-13T16:41:49Z on 68359662d347

Generated at : 2025-10-13T16:41:49Z
Runner Host  : 68359662d347
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4e90eb9 HEAD -> master
2025-10-13 16:41:49 +00:00
4e90eb96a3 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m24s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 17:40:19 +01:00
628fc1c29e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@a4a44fa at 2025-10-13T16:16:07Z on f238b21b9550

Generated at : 2025-10-13T16:16:07Z
Runner Host  : f238b21b9550
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : a4a44fa HEAD -> master
2025-10-13 16:16:07 +00:00
a4a44fa638 Merge remote-tracking branch 'origin/master'
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m45s
2025-10-13 17:14:20 +01:00
84e71c9ba6 V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 17:13:09 +01:00
a3fbf294e6 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@6f6a265 at 2025-10-13T06:27:13Z on beeeb93ee1b8

Generated at : 2025-10-13T06:27:13Z
Runner Host  : beeeb93ee1b8
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 6f6a265 HEAD -> master
2025-10-13 06:27:13 +00:00
6f6a265602 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m41s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-13 07:25:07 +01:00
ef3112ef3b DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@140f828 at 2025-10-12T18:00:22Z on df31befded0f

Generated at : 2025-10-12T18:00:22Z
Runner Host  : df31befded0f
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 140f828 HEAD -> master
2025-10-12 18:00:22 +00:00
140f82829e V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m54s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-12 18:58:03 +01:00
5f36d27c62 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@872f5af at 2025-10-12T11:26:50Z on 9d0c8b0fa257

Generated at : 2025-10-12T11:26:50Z
Runner Host  : 9d0c8b0fa257
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 872f5af HEAD -> master
2025-10-12 11:26:50 +00:00
872f5af3b4 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-12 12:23:54 +01:00
761f22bbac DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@353568e at 2025-10-11T21:16:42Z on 8796142b1859

Generated at : 2025-10-11T21:16:42Z
Runner Host  : 8796142b1859
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 353568e HEAD -> master
2025-10-11 21:16:42 +00:00
353568eb69 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m54s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-11 22:14:22 +01:00
be0a6c7c6a DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@e782f3d at 2025-10-08T19:42:31Z on 4e4d9c005c1c

Generated at : 2025-10-08T19:42:31Z
Runner Host  : 4e4d9c005c1c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : e782f3d HEAD -> master
2025-10-08 19:42:31 +00:00
e782f3d966 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m48s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 20:40:19 +01:00
cebff0653d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@c7a613e at 2025-10-08T18:28:57Z on ec9f092e6053

Generated at : 2025-10-08T18:28:57Z
Runner Host  : ec9f092e6053
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : c7a613e HEAD -> master
2025-10-08 18:28:57 +00:00
c7a613ec36 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m15s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 19:27:35 +01:00
cef24a4b21 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@7a9126d at 2025-10-08T18:08:35Z on 307d3d58d928

Generated at : 2025-10-08T18:08:35Z
Runner Host  : 307d3d58d928
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 7a9126d HEAD -> master
2025-10-08 18:08:35 +00:00
7a9126defc V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m18s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 19:06:51 +01:00
89897ffb0d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@95eb751 at 2025-10-08T17:18:34Z on 62ed1cb1394b

Generated at : 2025-10-08T17:18:34Z
Runner Host  : 62ed1cb1394b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 95eb751 HEAD -> master
2025-10-08 17:18:34 +00:00
95eb751172 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 18:16:45 +01:00
872ea860d0 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@bbf4f4c at 2025-10-08T16:45:55Z on f7cec5a1716c

Generated at : 2025-10-08T16:45:55Z
Runner Host  : f7cec5a1716c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : bbf4f4c HEAD -> master
2025-10-08 16:45:55 +00:00
bbf4f4c39b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m34s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 17:43:55 +01:00
7475eb8c40 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@77b2b74 at 2025-10-08T15:33:17Z on fed0b20feaf8

Generated at : 2025-10-08T15:33:17Z
Runner Host  : fed0b20feaf8
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 77b2b74 HEAD -> master
2025-10-08 15:33:17 +00:00
77b2b7420a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m28s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 16:31:29 +01:00
1ea2537892 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@19cac94 at 2025-10-08T07:42:21Z on a00a44f5a4b5

Generated at : 2025-10-08T07:42:21Z
Runner Host  : a00a44f5a4b5
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 19cac94 HEAD -> master
2025-10-08 07:42:21 +00:00
19cac9430a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m41s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 08:40:14 +01:00
aecc372f5a DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@9d51a75 at 2025-10-08T06:19:58Z on 912565375cb6

Generated at : 2025-10-08T06:19:58Z
Runner Host  : 912565375cb6
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 9d51a75 HEAD -> master
2025-10-08 06:19:58 +00:00
9d51a75ea4 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m7s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 07:17:44 +01:00
69a6bb563e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@1715555 at 2025-10-08T05:58:23Z on c76f469a411b

Generated at : 2025-10-08T05:58:23Z
Runner Host  : c76f469a411b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 1715555 HEAD -> master
2025-10-08 05:58:23 +00:00
1715555a49 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m46s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-08 06:56:13 +01:00
c8c72e8d64 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@52577ea at 2025-10-07T20:50:58Z on 00ee6a781181

Generated at : 2025-10-07T20:50:58Z
Runner Host  : 00ee6a781181
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 52577ea HEAD -> master
2025-10-07 20:50:58 +00:00
52577ea6fd V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m42s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 21:48:54 +01:00
b8dcc655f7 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@875d1f8 at 2025-10-07T19:31:10Z on a0aadd7ce8a7

Generated at : 2025-10-07T19:31:10Z
Runner Host  : a0aadd7ce8a7
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 875d1f8 HEAD -> master
2025-10-07 19:31:11 +00:00
875d1f8e5b V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m46s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 20:28:55 +01:00
03ed9c142d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ca8c0d0 at 2025-10-07T17:54:43Z on 860183a706c8

Generated at : 2025-10-07T17:54:43Z
Runner Host  : 860183a706c8
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ca8c0d0 HEAD -> master
2025-10-07 17:54:43 +00:00
ca8c0d0592 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m45s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 18:52:51 +01:00
1be35bef2d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@72dcf35 at 2025-10-07T16:29:51Z on 1a742de0c38c

Generated at : 2025-10-07T16:29:51Z
Runner Host  : 1a742de0c38c
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 72dcf35 HEAD -> master
2025-10-07 16:29:51 +00:00
72dcf355d9 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 2m28s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 17:27:17 +01:00
914539f166 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@77ba7a7 at 2025-10-07T10:53:18Z on 38d716ee00ec

Generated at : 2025-10-07T10:53:18Z
Runner Host  : 38d716ee00ec
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 77ba7a7 HEAD -> master
2025-10-07 10:53:18 +00:00
77ba7a79aa V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m14s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 11:51:40 +01:00
976708cc13 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ae9a6db at 2025-10-07T08:24:55Z on 7db5605590f9

Generated at : 2025-10-07T08:24:55Z
Runner Host  : 7db5605590f9
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ae9a6db HEAD -> master
2025-10-07 08:24:55 +00:00
ae9a6dbe1d V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m16s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 09:23:13 +01:00
d09a143ebc DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@89e5a0b at 2025-10-06T23:28:51Z on a5f2b6ec2669

Generated at : 2025-10-06T23:28:51Z
Runner Host  : a5f2b6ec2669
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 89e5a0b HEAD -> master
2025-10-06 23:28:51 +00:00
89e5a0b72a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m17s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-07 00:27:27 +01:00
ac32202060 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@fccc97d at 2025-10-06T18:44:53Z on bc8f5df22998

Generated at : 2025-10-06T18:44:53Z
Runner Host  : bc8f5df22998
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : fccc97d HEAD -> master
2025-10-06 18:44:53 +00:00
fccc97d44f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m25s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-06 19:43:19 +01:00
d11432d000 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@6371e5c at 2025-10-06T15:52:28Z on b8b7415b7002

Generated at : 2025-10-06T15:52:28Z
Runner Host  : b8b7415b7002
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 6371e5c HEAD -> master
2025-10-06 15:52:28 +00:00
6371e5cf51 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m11s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-06 16:51:09 +01:00
5c3aa50d8d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@2e4e403 at 2025-10-06T15:41:32Z on f5460a90f189

Generated at : 2025-10-06T15:41:32Z
Runner Host  : f5460a90f189
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 2e4e403 HEAD -> master
2025-10-06 15:41:32 +00:00
2e4e403b19 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m19s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-06 16:39:46 +01:00
6785013692 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@3b3c6f3 at 2025-10-05T19:00:52Z on 806c2f8963ad

Generated at : 2025-10-05T19:00:52Z
Runner Host  : 806c2f8963ad
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 3b3c6f3 HEAD -> master
2025-10-05 19:00:52 +00:00
3b3c6f353a V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m25s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 19:59:13 +01:00
50077d4003 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@03a4ff8 at 2025-10-05T18:35:10Z on b576a43f56d9

Generated at : 2025-10-05T18:35:10Z
Runner Host  : b576a43f56d9
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 03a4ff8 HEAD -> master
2025-10-05 18:35:10 +00:00
03a4ff8cd6 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m27s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 19:33:36 +01:00
cc2a44160e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@0d18dfa at 2025-10-05T17:40:07Z on 4801195cd826

Generated at : 2025-10-05T17:40:07Z
Runner Host  : 4801195cd826
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 0d18dfa HEAD -> master
2025-10-05 17:40:07 +00:00
0d18dfa405 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m16s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 18:38:24 +01:00
bacc3ff7df DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@32c0ae9 at 2025-10-05T17:03:20Z on 4637e8bb8683

Generated at : 2025-10-05T17:03:20Z
Runner Host  : 4637e8bb8683
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 32c0ae9 HEAD -> master
2025-10-05 17:03:20 +00:00
32c0ae984f V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m18s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 18:01:46 +01:00
595aaa9fe7 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ebfba51 at 2025-10-05T16:23:22Z on 9a851a2dd277

Generated at : 2025-10-05T16:23:22Z
Runner Host  : 9a851a2dd277
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ebfba51 HEAD -> master
2025-10-05 16:23:22 +00:00
ebfba51df0 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m17s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 17:21:59 +01:00
51cb2f9f6a V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 17:21:48 +01:00
cbb273ab5e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@89e6ae9 at 2025-10-05T16:03:21Z on 7acf8869e692

Generated at : 2025-10-05T16:03:21Z
Runner Host  : 7acf8869e692
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 89e6ae9 HEAD -> master
2025-10-05 16:03:21 +00:00
89e6ae9890 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m11s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 17:01:51 +01:00
d2ee1e2963 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@09c9cc7 at 2025-10-05T14:55:15Z on dec48ad1e978

Generated at : 2025-10-05T14:55:15Z
Runner Host  : dec48ad1e978
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 09c9cc7 HEAD -> master
2025-10-05 14:55:15 +00:00
09c9cc7032 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m16s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 15:53:35 +01:00
1c259f9e51 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@75d8602 at 2025-10-05T13:00:48Z on 0b8cb9c62f02

Generated at : 2025-10-05T13:00:48Z
Runner Host  : 0b8cb9c62f02
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 75d8602 HEAD -> master
2025-10-05 13:00:48 +00:00
75d8602020 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m17s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 13:59:18 +01:00
c0de1a977d DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@b7f1f0a at 2025-10-05T12:14:13Z on 5b29c91c56e6

Generated at : 2025-10-05T12:14:13Z
Runner Host  : 5b29c91c56e6
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : b7f1f0a HEAD -> master
2025-10-05 12:14:13 +00:00
b7f1f0a4dd V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m15s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 13:12:31 +01:00
0414737759 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4b46e8c at 2025-10-05T06:53:58Z on 333e12699984

Generated at : 2025-10-05T06:53:58Z
Runner Host  : 333e12699984
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4b46e8c HEAD -> master
2025-10-05 06:53:58 +00:00
4b46e8cffc V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m22s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-10-05 07:51:09 +01:00
519643646e DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@16cbfab at 2025-09-29T06:52:10Z on 1385dcd4cddc

Generated at : 2025-09-29T06:52:10Z
Runner Host  : 1385dcd4cddc
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 16cbfab HEAD -> master
2025-09-29 06:52:10 +00:00
16cbfab2db V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m43s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-29 07:49:59 +01:00
b66a799d8b DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4a7a570 at 2025-09-28T21:59:27Z on e67c6b3183a0

Generated at : 2025-09-28T21:59:27Z
Runner Host  : e67c6b3183a0
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4a7a570 HEAD -> master
2025-09-28 21:59:27 +00:00
4a7a570e48 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m35s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-28 22:57:45 +01:00
5f59615d82 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4c5af23 at 2025-09-28T21:56:56Z on 471bbbe61f90

Generated at : 2025-09-28T21:56:56Z
Runner Host  : 471bbbe61f90
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4c5af23 HEAD -> master
2025-09-28 21:56:56 +00:00
4c5af23e49 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m45s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-28 22:55:04 +01:00
d3b1086361 V8.00.000.2025.06.17
Some checks failed
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Failing after 2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-28 22:40:32 +01:00
7b24596213 V8.00.000.2025.06.17
Some checks failed
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Failing after 2s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-28 21:40:07 +01:00
5ebac54a12 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@1568839 at 2025-09-28T11:35:16Z on daa6093de9dd

Generated at : 2025-09-28T11:35:16Z
Runner Host  : daa6093de9dd
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 1568839 HEAD -> master
2025-09-28 11:35:16 +00:00
1568839fa7 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m0s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-28 12:33:50 +01:00
d41780a9d0 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@d0bfb6f at 2025-09-27T20:51:40Z on 937c5b55f5ec

Generated at : 2025-09-27T20:51:40Z
Runner Host  : 937c5b55f5ec
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : d0bfb6f HEAD -> master
2025-09-27 20:51:41 +00:00
d0bfb6ff3c V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m40s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-27 21:49:28 +01:00
def8e33296 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@ca533ba at 2025-09-27T18:50:54Z on 9b1afd6c6493

Generated at : 2025-09-27T18:50:54Z
Runner Host  : 9b1afd6c6493
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : ca533ba HEAD -> master
2025-09-27 18:50:54 +00:00
ca533ba783 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m37s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-27 19:48:54 +01:00
db634e8ef0 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@748007d at 2025-09-26T19:00:41Z on 9054bf92a37e

Generated at : 2025-09-26T19:00:41Z
Runner Host  : 9054bf92a37e
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 748007d HEAD -> master
2025-09-26 19:00:41 +00:00
748007d0cb V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m41s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-26 19:58:34 +01:00
e01e686ae0 DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@4f1deae at 2025-09-25T21:06:08Z on 3dde52e3546b

Generated at : 2025-09-25T21:06:08Z
Runner Host  : 3dde52e3546b
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : 4f1deae HEAD -> master
2025-09-25 21:06:08 +00:00
4f1deaef57 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m26s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-25 22:04:34 +01:00
ffd876e3ca DEPLOY BOT : 🛡️ Shell Script Linting [skip ci]
X-CI-Metadata: master@b338569 at 2025-09-25T20:58:50Z on 7dba1439a0e3

Generated at : 2025-09-25T20:58:50Z
Runner Host  : 7dba1439a0e3
Workflow ID  : 🛡️ Shell Script Linting
Git Commit   : b338569 HEAD -> master
2025-09-25 20:58:50 +00:00
b338569f14 V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 1m29s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-25 21:56:59 +01:00
44a1f50bc9 Merge remote-tracking branch 'origin/master'
Some checks failed
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Failing after 5s
2025-09-25 20:18:50 +01:00
577827dc7a V8.00.000.2025.06.17
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
2025-09-25 20:14:53 +01:00
212 changed files with 9845 additions and 2703 deletions

View File

@@ -0,0 +1,410 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
### https://github.com/linux-audit/audit-userspace/tree/master/rules
#######################################
# Installs 'aide', 'audit', and 'debsums' audit and logging packages.
# Finalizes 'rkhunter' baseline.
# Globals:
# TARGET
# VAR_SEC_FW
# Arguments:
# None
# Returns:
# 0: on success
#######################################
install_verification() {
### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4620_installation_verification.log"
chroot_logger "${TARGET}${var_logfile}"
chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests acct 2>&1 | tee -a ${var_logfile}
mkdir -p /etc/systemd/system/multi-user.target.wants
if ln -s /lib/systemd/system/acct.service /etc/systemd/system/multi-user.target.wants/acct.service; then
printf 'Process Accounting enabled successfully.'
else
printf 'Process Accounting already enabled.'
fi
"
chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests auditd 2>&1 | tee -a ${var_logfile}
"
rm -f "${TARGET}/etc/audit/rules.d/audit.rules"
############################################################### /etc/audit/rules.d/10-base-config.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/10-base-config.rules"
## First rule - delete all
-D
## Increase the buffers to survive stress events.
## Make this bigger for busy systems
-b 16384
## This determine how long to wait in burst of events
--backlog_wait_time 1024
## Set failure mode to syslog
-f 1
EOF
############################################################### /etc/audit/rules.d/11-loginuid.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/11-loginuid.rules"
--loginuid-immutable
EOF
############################################################### /etc/audit/rules.d/20-dont-audit.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/20-dont-audit.rules"
## This is for don't audit rules. We put these early because audit
## is a first match wins system. Uncomment the rules you want.
## Cron jobs fill the logs with stuff we normally don't want
-a never,user
## This prevents chrony from overwhelming the logs
-a never,exit -F arch=b64 -S adjtimex -F exe=/usr/sbin/chronyd
-a never,exit -F arch=b32 -S adjtimex -F exe=/usr/sbin/chronyd
## Human-attributable time changes
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -F auid>=1000 -F auid!=4294967295 -k time-change
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S clock_settime -F auid>=1000 -F auid!=4294967295 -k time-change
### This is not very interesting and wastes a lot of space if
### the server is public facing
-a always,exclude -F msgtype=CRYPTO_KEY_USER
EOF
############################################################### /etc/audit/rules.d/21-no32bit.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/21-no32bit.rules"
## If you are on a 64 bit platform, everything _should_ be running
## in 64 bit mode. This rule will detect any use of the 32 bit syscalls
## because this might be a sign of someone exploiting a hole in the 32
## bit ABI.
-a always,exit -F arch=b32 -S all -F key=32bit-abi
EOF
############################################################### /etc/audit/rules.d/22-ignore-chrony.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/22-ignore-chrony.rules"
## This rule suppresses the time-change event when chrony does time updates
-a never,exit -F arch=b64 -S adjtimex -F auid=unset -F uid=_chrony
-a never,exit -F arch=b32 -S adjtimex -F auid=unset -F uid=_chrony
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-1-create-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-1-create-failed.rules"
## Unsuccessful file creation (open with O_CREAT)
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&0100 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&0100 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b32 -S open -F a1&0100 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S open -F a1&0100 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b32 -S creat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S creat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&0100 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&0100 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b32 -S open -F a1&0100 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S open -F a1&0100 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b32 -S creat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
-a always,exit -F arch=b64 -S creat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-create
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-1-create-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-1-create-success.rules"
## Successful file creation (open with O_CREAT)
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&0100 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&0100 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
-a always,exit -F arch=b32 -S open -F a1&0100 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
-a always,exit -F arch=b64 -S open -F a1&0100 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
-a always,exit -F arch=b32 -S creat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
-a always,exit -F arch=b64 -S creat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-create
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-2-modify-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-2-modify-failed.rules"
## Unsuccessful file modifications (open for write or truncate)
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&01003 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&01003 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b32 -S open -F a1&01003 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S open -F a1&01003 -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b32 -S truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&01003 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&01003 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b32 -S open -F a1&01003 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S open -F a1&01003 -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b32 -S truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
-a always,exit -F arch=b64 -S truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-modification
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-2-modify-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-2-modify-success.rules"
## Successful file modifications (open for write or truncate)
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&01003 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&01003 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
-a always,exit -F arch=b32 -S open -F a1&01003 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
-a always,exit -F arch=b64 -S open -F a1&01003 -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
-a always,exit -F arch=b32 -S truncate,ftruncate -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
-a always,exit -F arch=b64 -S truncate,ftruncate -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-modification
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-3-access-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-3-access-failed.rules"
## Unsuccessful file access (any other opens) This has to go last.
-a always,exit -F arch=b32 -S open,openat,openat2,open_by_handle_at -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-access
-a always,exit -F arch=b64 -S open,openat,openat2,open_by_handle_at -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-access
-a always,exit -F arch=b32 -S open,openat,openat2,open_by_handle_at -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-access
-a always,exit -F arch=b64 -S open,openat,openat2,open_by_handle_at -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-access
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-3-access-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-3-access-success.rules"
## Successful file access (any other opens) This has to go last.
## These next two are likely to result in a whole lot of events
-a always,exit -F arch=b32 -S open,openat,openat2,open_by_handle_at -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-access
-a always,exit -F arch=b64 -S open,openat,openat2,open_by_handle_at -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-access
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-4-delete-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-4-delete-failed.rules"
## Unsuccessful file delete
-a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-delete
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-delete
-a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-delete
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-delete
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-4-delete-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-4-delete-success.rules"
## Successful file delete
-a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-delete
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-delete
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-5-perm-change-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-5-perm-change-failed.rules"
## Unsuccessful permission change
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-perm-change
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-perm-change
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-perm-change
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-perm-change
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-5-perm-change-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-5-perm-change-success.rules"
## Successful permission change
-a always,exit -F arch=b32 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-perm-change
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-perm-change
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-6-owner-change-failed.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-6-owner-change-failed.rules"
## Unsuccessful ownership change
-a always,exit -F arch=b32 -S lchown,fchown,chown,fchownat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-owner-change
-a always,exit -F arch=b64 -S lchown,fchown,chown,fchownat -F exit=-EACCES -F auid>=1000 -F auid!=unset -F key=unsuccessful-owner-change
-a always,exit -F arch=b32 -S lchown,fchown,chown,fchownat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-owner-change
-a always,exit -F arch=b64 -S lchown,fchown,chown,fchownat -F exit=-EPERM -F auid>=1000 -F auid!=unset -F key=unsuccessful-owner-change
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42-6-owner-change-success.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42-6-owner-change-success.rules"
## Successful ownership change
-a always,exit -F arch=b32 -S lchown,fchown,chown,fchownat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-owner-change
-a always,exit -F arch=b64 -S lchown,fchown,chown,fchownat -F success=1 -F auid>=1000 -F auid!=unset -F key=successful-owner-change
EOF
############################################################### /etc/audit/rules.d/30-ospp-v42.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/30-ospp-v42.rules"
## The purpose of these rules is to meet the requirements for Operating
## System Protection Profile (OSPP)v4.2. These rules depends on having
## the following rule files copied to /etc/audit/rules.d:
##
## 10-base-config.rules, 11-loginuid.rules,
## 30-ospp-v42-1-create-failed.rules, 30-ospp-v42-1-create-success.rules,
## 30-ospp-v42-2-modify-failed.rules, 30-ospp-v42-2-modify-success.rules,
## 30-ospp-v42-3-access-failed.rules, 30-ospp-v42-3-access-success.rules,
## 30-ospp-v42-4-delete-failed.rules, 30-ospp-v42-4-delete-success.rules,
## 30-ospp-v42-5-perm-change-failed.rules,
## 30-ospp-v42-5-perm-change-success.rules,
## 30-ospp-v42-6-owner-change-failed.rules,
## 30-ospp-v42-6-owner-change-success.rules
##
## original copies may be found in /usr/share/audit-rules
## User add delete modify. This is covered by pam. However, someone could
## open a file and directly create or modify a user, so we'll watch passwd and
## shadow for writes
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&03 -F path=/etc/passwd -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&03 -F path=/etc/passwd -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b32 -S open -F a1&03 -F path=/etc/passwd -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -S open -F a1&03 -F path=/etc/passwd -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b32 -S openat,open_by_handle_at -F a2&03 -F path=/etc/shadow -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -S openat,open_by_handle_at -F a2&03 -F path=/etc/shadow -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b32 -S open -F a1&03 -F path=/etc/shadow -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -S open -F a1&03 -F path=/etc/shadow -F auid>=1000 -F auid!=unset -F key=user-modify
## User enable and disable. This is entirely handled by pam.
## Group add delete modify. This is covered by pam. However, someone could
## open a file and directly create or modify a user, so we'll watch group and
## gshadow for writes
-a always,exit -F arch=b32 -F path=/etc/passwd -F perm=wa -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -F path=/etc/passwd -F perm=wa -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b32 -F path=/etc/shadow -F perm=wa -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b64 -F path=/etc/shadow -F perm=wa -F auid>=1000 -F auid!=unset -F key=user-modify
-a always,exit -F arch=b32 -F path=/etc/group -F perm=wa -F auid>=1000 -F auid!=unset -F key=group-modify
-a always,exit -F arch=b64 -F path=/etc/group -F perm=wa -F auid>=1000 -F auid!=unset -F key=group-modify
-a always,exit -F arch=b32 -F path=/etc/gshadow -F perm=wa -F auid>=1000 -F auid!=unset -F key=group-modify
-a always,exit -F arch=b64 -F path=/etc/gshadow -F perm=wa -F auid>=1000 -F auid!=unset -F key=group-modify
## Use of special rights for config changes. This would be use of setuid
## programs that relate to user accts. This is not all setuid apps because
## requirements are only for ones that affect system configuration.
-a always,exit -F arch=b32 -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/sbin/usernetctl -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/sbin/usernetctl -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/sbin/seunshare -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/sbin/seunshare -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/newuidmap -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/newuidmap -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/newgidmap -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/newgidmap -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/bin/at -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/bin/at -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b32 -F path=/usr/sbin/grub2-set-bootflag -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/usr/sbin/grub2-set-bootflag -F perm=x -F auid>=1000 -F auid!=unset -F key=special-config-changes
## Privilege escalation via su or sudo. This is entirely handled by pam.
## Special case for systemd-run. It is not audit aware, specifically watch it
-a always,exit -F arch=b32 -F path=/usr/bin/systemd-run -F perm=x -F auid!=unset -F key=maybe-escalation
-a always,exit -F arch=b64 -F path=/usr/bin/systemd-run -F perm=x -F auid!=unset -F key=maybe-escalation
## Special case for pkexec. It is not audit aware, specifically watch it
-a always,exit -F arch=b32 -F path=/usr/bin/pkexec -F perm=x -F key=maybe-escalation
-a always,exit -F arch=b64 -F path=/usr/bin/pkexec -F perm=x -F key=maybe-escalation
## Watch for configuration changes to privilege escalation.
-a always,exit -F arch=b32 -F path=/etc/sudoers -F perm=wa -F key=special-config-changes
-a always,exit -F arch=b64 -F path=/etc/sudoers -F perm=wa -F key=special-config-changes
-a always,exit -F arch=b32 -F dir=/etc/sudoers.d/ -F perm=wa -F key=special-config-changes
-a always,exit -F arch=b64 -F dir=/etc/sudoers.d/ -F perm=wa -F key=special-config-changes
## Audit log access
-a always,exit -F arch=b32 -F dir=/var/log/audit/ -F perm=r -F auid>=1000 -F auid!=unset -F key=access-audit-trail
-a always,exit -F arch=b64 -F dir=/var/log/audit/ -F perm=r -F auid>=1000 -F auid!=unset -F key=access-audit-trail
## Attempts to Alter Process and Session Initiation Information
-a always,exit -F arch=b32 -F path=/var/run/utmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
-a always,exit -F arch=b64 -F path=/var/run/utmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
-a always,exit -F arch=b32 -F path=/var/log/btmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
-a always,exit -F arch=b64 -F path=/var/log/btmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
-a always,exit -F arch=b32 -F path=/var/log/wtmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
-a always,exit -F arch=b64 -F path=/var/log/wtmp -F perm=wa -F auid>=1000 -F auid!=unset -F key=session
## Attempts to modify MAC controls
-a always,exit -F arch=b32 -F dir=/etc/selinux/ -F perm=wa -F auid>=1000 -F auid!=unset -F key=MAC-policy
-a always,exit -F arch=b64 -F dir=/etc/selinux/ -F perm=wa -F auid>=1000 -F auid!=unset -F key=MAC-policy
## Application invocation. The requirements list an optional requirement
## FPT_SRP_EXT.1 Software Restriction Policies. This event is intended to
## state results from that policy. This would be handled entirely by
## that daemon.
EOF
############################################################### /etc/audit/rules.d/99-finalize.rules
cat << EOF >| "${TARGET}/etc/audit/rules.d/99-finalize.rules"
-e 2
EOF
chroot_script "${TARGET}" "
systemctl enable auditd.service 2>&1 | tee -a ${var_logfile}
"
### Validate and build audit rules now; fail early if syntax is wrong.
chroot_script "${TARGET}" "
if command -v augenrules >/dev/null 2>&1; then
augenrules --load 2>&1 | tee -a ${var_logfile}
else
### Fallback: build consolidated rules file without loading into the kernel.
if command -v bash >/dev/null 2>&1; then
bash -lc 'cat /etc/audit/rules.d/*.rules > /etc/audit/audit.rules'
fi
fi
"
chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests aide aide-common 2>&1 | tee -a ${var_logfile}
sed -i 's/Checksums = H/Checksums = sha512/' /etc/aide/aide.conf
aideinit > /dev/null 2>> ${var_logfile}
"
chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests debsums 2>&1 | tee -a ${var_logfile}
if ! debsums -g >> ${var_logfile} 2>> ${var_logfile}; then
printf 'Running debsums -g - encountered errors.' >> ${var_logfile}
fi
mkdir -p /root/.ciss/cdi/backup/etc/default
cp -a /etc/default/debsums /root/.ciss/cdi/backup/etc/default/debsums.bak
sed -i 's/CRON_CHECK=never/CRON_CHECK=monthly/' /etc/default/debsums
"
chroot_script "${TARGET}" "
rkhunter --propupd 2>&1 | tee -a ${var_logfile}
"
chroot_exec "${TARGET}" sed -i 's#^\(ENABLED=\).*#\1"true"#' /etc/default/sysstat
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f install_verification
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -41,6 +41,10 @@ jobs:
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
var_wait=$(( RANDOM % 33 ))
printf "⏳ Waiting %s seconds to desynchronize parallel workflows...\n" "${var_wait}"
sleep "${var_wait}"
rm -rf ~/.ssh && mkdir -m700 ~/.ssh rm -rf ~/.ssh && mkdir -m700 ~/.ssh
### Private Key ### Private Key
@@ -202,11 +206,12 @@ jobs:
echo -e "⚠️ Linting issues detected:\n" echo -e "⚠️ Linting issues detected:\n"
echo -e "${findings}" echo -e "${findings}"
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ") timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
VAR_DATE="$(date +%F)"
PRIVATE_FILE="LINTER_RESULTS.txt" PRIVATE_FILE="LINTER_RESULTS.txt"
touch "${PRIVATE_FILE}" touch "${PRIVATE_FILE}"
cat << EOF >| "${PRIVATE_FILE}" cat << EOF >| "${PRIVATE_FILE}"
# SPDX-Version: 3.0 # SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-CreationInfo: ${VAR_DATE}; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git # SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency # SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
@@ -225,11 +230,12 @@ jobs:
else else
echo "✅ No issues found in shell scripts." echo "✅ No issues found in shell scripts."
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ") timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
VAR_DATE="$(date +%F)"
PRIVATE_FILE="LINTER_RESULTS.txt" PRIVATE_FILE="LINTER_RESULTS.txt"
touch "${PRIVATE_FILE}" touch "${PRIVATE_FILE}"
cat << EOF >| "${PRIVATE_FILE}" cat << EOF >| "${PRIVATE_FILE}"
# SPDX-Version: 3.0 # SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-CreationInfo: ${VAR_DATE}; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git # SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency # SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>

View File

@@ -33,6 +33,10 @@ jobs:
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
var_wait=$(( RANDOM % 33 ))
printf "⏳ Waiting %s seconds to desynchronize parallel workflows...\n" "${var_wait}"
sleep "${var_wait}"
rm -rf ~/.ssh && mkdir -m700 ~/.ssh rm -rf ~/.ssh && mkdir -m700 ~/.ssh
### Private Key ### Private Key

View File

@@ -34,6 +34,10 @@ jobs:
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
var_wait=$(( RANDOM % 33 ))
printf "⏳ Waiting %s seconds to desynchronize parallel workflows...\n" "${var_wait}"
sleep "${var_wait}"
rm -rf ~/.ssh && mkdir -m700 ~/.ssh rm -rf ~/.ssh && mkdir -m700 ~/.ssh
### Private Key ### Private Key

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
.checklist/ .checklist/
.idea/ .idea/
.todo/
out/ out/
*.DS_Store *.DS_Store
*.log *.log

115
.preseed/SECRETS.yaml Normal file
View File

@@ -0,0 +1,115 @@
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
#
#
# This file contains all required Secrets, Tokens and Public and Private Keys for the CISS.debian.installer
# Master V8.00.000.2025.06.17
# YAML specification: 1.2
#
secrets:
description: "Secrets for automated installation of encrypted systems on this host via primordial-workflow™."
created_at: "2025-10-23"
created_for: "host_domain_tld"
name: "CISS.debian.installer"
version: "V8.00.000.2025.06.17"
x_files: "false"
################################################################################################################################
# Grub bootloader passphrase
################################################################################################################################
grub:
note: "Password used to unlock the GRUB bootloader before system initialization."
scope: "grub"
type: "plain"
value: "PleASE_CHan3e_M!"
################################################################################################################################
# LUKS and LUKS Nuke passphrase
################################################################################################################################
luks:
backup:
note: "The value is [<share-identifier>:<password>] (colon-separated). Use the same dedicated destination and credentials across servers."
scope: "offsite-backup"
type: "plain"
value: "NextcloudFolderNameOrShareID:SuperSecurePassword123!"
boot:
note: "Dedicated passphrase for the [/boot] partition; chosen for easy manual input via the VPS web console."
scope: "luks"
type: "plain"
value: "Ceterum_censeo_Bruxellam_et_Berolinum_delenda_esse!"
common:
note: "Main LUKS passphrase baked into the installer for automated setup. For dropbear SSH input method only."
scope: "luks"
type: "plain"
value: "Ceterum_censeo_Bruxellam_et_Berolinum_delenda_esse!"
nuke:
note: "Special LUKS passphrase that triggers secure wipe of all volumes when entered."
scope: "luks"
type: "plain"
value: "THIS_IS_THE_NUKE_PASSWORD!"
################################################################################################################################
# TOTP MFA seed and salt and other seed variables
################################################################################################################################
seeds:
mfa:
info:
note: "MFA version identifier, e.g., [totp:v1] for seamless mfa secrets rollover."
scope: "mfa"
type: "plain"
value: "totp:v1"
salt:
note: "Used to add a salt to the MFA seed to derive per-host MFA secrets for remote unlock authentication."
scope: "mfa"
type: "plain"
value: "CISS:CDI:OTP"
secret:
note: "Master seed (hex) used to derive per-machine MFA secrets for remote unlock authentication."
scope: "mfa"
type: "plain"
value: "7cad63da408c27b5121c89cdd0cf878b8f8df1f34bcc0a944152261ee1481fda"
################################################################################################################################
# User passwords and SSH keys
################################################################################################################################
user:
root:
password:
note: "Password-hash, YESCRYPT only, for the root user. Leave value empty if disabled password authentication."
scope: "auth"
type: "hash"
value: "$y$jFT$7pQlcZrgTEGrzkEm7UQW/.$QoCamalYEAV5mN4QWIE.xpHo8kvXa9sym2Uz.9oELwA"
sshpubkey:
note: "SSH public key for the root user. This key is also used for dropbear SSH authentication."
scope: "auth"
type: "sshpubkey"
value: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY"
user0:
name: "user"
password:
note: "Password-hash, YESCRYPT only, for the specified user. Leave value empty if disabled password authentication."
scope: "auth"
type: "hash"
value: "$y$jFT$OGeZONH5ho2JSXvAbyIBQ1$5OhyHqOaMZ9BZcfMOYEwF.nMLFKd9ceiW2oNksPCHVB"
sshpubkey:
note: "SSH public key for the specified user."
scope: "auth"
type: "sshpubkey"
value: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY"
user1:
name: "ansible"
password:
note: "Password-hash, YESCRYPT only, for the specified user. Leave value empty if disabled password authentication."
scope: "auth"
type: "hash"
value: ""
sshpubkey:
note: "SSH public key for the specified user."
scope: "auth"
type: "sshpubkey"
value: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY"
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=yaml

View File

@@ -1 +0,0 @@
7cad63da408c27b5121c89cdd0cf878b8f8df1f34bcc0a944152261ee1481fda

View File

@@ -32,6 +32,14 @@ recipe:
kdf: kdf:
threads: 1 # Set the parallel cost for PBKDF (number of threads, up to 4). threads: 1 # Set the parallel cost for PBKDF (number of threads, up to 4).
time: 256 # The number of milliseconds to spend with PBKDF passphrase processing. time: 256 # The number of milliseconds to spend with PBKDF passphrase processing.
luks_backup: true # Specify if LUKS Header backups should be created. If so, provide an external backup URL:
# luks_backup_url: "https://cloud.e2ee.li/" or leave empty for local backup.
# Also provide the cloud access token and access passwords via
# ./.preseed/SECRETS.yaml. Yet Nextcloud only is supported.
luks_backup_url: "https://cloud.e2ee.li/"
luks_backup_pgp: "ciss" # Specify the trigger for use of the LUKS Header backup encryption key.
# Allowed values are: 'ciss', and 'physnet'. MUST be provided.
# Otherwise, the backup is NOT created.
name: "ciss.2025.gpt.btrfs.ephemeral.non-raid.256GiB.rescue" name: "ciss.2025.gpt.btrfs.ephemeral.non-raid.256GiB.rescue"
nuke: true # Activates Nuke-Mechanism in '/etc/crypttab' keyscript and via dropbear SSH forced command. nuke: true # Activates Nuke-Mechanism in '/etc/crypttab' keyscript and via dropbear SSH forced command.
nuke_rounds: 16384 # SHA512 KDF Rounds for Nuke Passphrase. If omitted, the default value is '8,388,608'. nuke_rounds: 16384 # SHA512 KDF Rounds for Nuke Passphrase. If omitted, the default value is '8,388,608'.
@@ -46,7 +54,7 @@ recipe:
table: "gpt" # MUST be "gpt" for "UEFI" || "msdos": table: "gpt" # MUST be "gpt" for "UEFI" || "msdos":
syntax: true # This is set to "false" by default, otherwise if the recipe is tested by the authors to "true". syntax: true # This is set to "false" by default, otherwise if the recipe is tested by the authors to "true".
### Version of the specific recipe. ### Version of the specific recipe.
version: "1.2.0" version: "1.3.2"
dev: dev:
sda: sda:
1: # MUST be always 'ESP' for [UEFI|GPT] or 'BIOS' for [BIOS|GPT]. 1: # MUST be always 'ESP' for [UEFI|GPT] or 'BIOS' for [BIOS|GPT].
@@ -76,7 +84,7 @@ recipe:
version: "fat32" version: "fat32"
mount: mount:
enable: true # MUST be "true" for "/boot/efi" enable: true # MUST be "true" for "/boot/efi"
options: "noauto,umask=0077,uid=0,gid=0,nofail" options: "umask=0077,uid=0,gid=0"
optsnap: "" optsnap: ""
path: "/boot/efi" path: "/boot/efi"
primary: primary primary: primary
@@ -107,7 +115,7 @@ recipe:
options: "" options: ""
mount: mount:
enable: true enable: true
options: "noauto,nodev,nosuid,noexec,noatime,compress=no,discard=async" options: "nodev,nosuid,noexec,noatime,compress=no,discard=async"
optsnap: "" optsnap: ""
path: "/boot" path: "/boot"
primary: primary primary: primary
@@ -166,12 +174,12 @@ recipe:
mdup: "" mdup: ""
snapshot: false snapshot: false
format: true format: true
label: "host_swap" # MUST be "host_swap" for ephemeral "SWAP" label: "host_swap"
options: "" options: ""
version: "ext4" # MUST be "ext4" for ephemeral "SWAP" version: "ext4"
mount: mount:
enable: true enable: true
options: "defaults,discard" options: "defaults"
optsnap: "" optsnap: ""
path: "SWAP" path: "SWAP"
primary: primary primary: primary
@@ -199,10 +207,10 @@ recipe:
snapshot: false snapshot: false
format: true format: true
options: "" options: ""
version: "ext4" # MUST be "ext4" for ephemeral "/tmp" version: "ext4"
mount: mount:
enable: true enable: true
options: "defaults,rw,nodev,noexec,nosuid,noatime,discard,mode=1777" options: "defaults,rw,nodev,noexec,nosuid,noatime,discard"
optsnap: "" optsnap: ""
path: "/tmp" path: "/tmp"
primary: primary primary: primary

View File

@@ -1 +0,0 @@
PleASE_CHan3e_M!

View File

@@ -1 +0,0 @@
Ceterum_censeo_Bruxellam_et_Berolinum_delenda_esse!

View File

@@ -1 +0,0 @@
Ceterum_censeo_Bruxellam_et_Berolinum_delenda_esse!

View File

@@ -1 +0,0 @@
THIS_IS_THE_NUKE_PASSWORD!

View File

@@ -10,14 +10,17 @@
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
%YAML 1.2 %YAML 1.2
--- ---
### This file contains configurations for the CISS.debian.installer # This file contains configurations for the CISS.debian.installer
### Master V8.00.000.2025.06.17 # Master V8.00.000.2025.06.17
### YAML specification: 1.2 # YAML specification: 1.2
#
installer: preseed:
description: "Configuration values for automated installation of encrypted systems on this host via primordial-workflow™."
created_at: "2025-10-23"
created_for: "host_domain_tld"
name: "CISS.debian.installer" name: "CISS.debian.installer"
version: "V8.00.000.2025.06.17" version: "V8.00.000.2025.06.17"
#
################################################################################################################################ ################################################################################################################################
# APT settings # APT settings
################################################################################################################################ ################################################################################################################################
@@ -84,7 +87,7 @@ debootstrap: # Provide a mirror for downloading the Debian pac
# list of official Debian packages. # list of official Debian packages.
mirror: "https://deb.debian.org/debian" mirror: "https://deb.debian.org/debian"
# The following packages MUST be included in the debootstrap. # The following packages MUST be included in the debootstrap.
includes: "busybox,ca-certificates,git,locales,openssl,python3,python3-apt,zstd" includes: "busybox,ca-certificates,git,locales,openssl,python3,python3-apt,systemd-cryptsetup,zstd"
distribution: "trixie" # MUST be "trixie". distribution: "trixie" # MUST be "trixie".
debian_suite: "stable" # MUST be "stable". Not supported yet: "testing", "experimental". debian_suite: "stable" # MUST be "stable". Not supported yet: "testing", "experimental".
exit: exit:
@@ -96,15 +99,15 @@ firmware:
lookup: "missing" # - "never" Completely disables the firmware search. lookup: "missing" # - "never" Completely disables the firmware search.
# - "missing" Searches only when the firmware is needed. (default) # - "missing" Searches only when the firmware is needed. (default)
# - "always" Always searches and asks for any firmware that could be useful for the hardware. # - "always" Always searches and asks for any firmware that could be useful for the hardware.
image: "linux-image-6.12.41+deb13-amd64" image: "linux-image-6.16.3+deb13-amd64"
# Could be a meta-package or a specific image like: # Could be a meta-package or a specific image like:
# "linux-image-amd64" || "linux-image-arm64" # "linux-image-amd64" || "linux-image-arm64"
# "linux-image-cloud-amd64" || "linux-image-cloud-arm64" # "linux-image-cloud-amd64" || "linux-image-cloud-arm64"
# "linux-image-rt-amd64" || "linux-image-rt-arm64" # "linux-image-rt-amd64" || "linux-image-rt-arm64"
# "linux-image-6.12.30+bpo-amd64" # "linux-image-6.16.3+deb13-amd64"
# "linux-image-6.12.38+deb13-amd64"
needrun: false # Static linking to "${TARGET}/run" can cause problems if this data is "burned" into the target. needrun: false # Static linking to "${TARGET}/run" can cause problems if this data is "burned" into the target.
provider: "netcup" # MUST be one of "contabo", "hetzner", "netcup" or leave empty. provider: "netcup" # MUST be one of "contabo", "hetzner", "netcup" or leave empty.
security_ext: "apparmor" # MUST be one of "apparmor" or "selinux".
################################################################################################################################ ################################################################################################################################
# Dropbear settings # Dropbear settings
@@ -115,7 +118,7 @@ dropbear:
firewall: false # Yet not implemented. MUST be "false". firewall: false # Yet not implemented. MUST be "false".
# Additional ultra hardening of the dropbear initramfs environment via firewall. # Additional ultra hardening of the dropbear initramfs environment via firewall.
# The "bastion_ipv4" MUST be provided. # The "bastion_ipv4" MUST be provided.
port: 42137 # SSH Port dropbear initramfs should listen. port: 44137 # SSH Port dropbear initramfs should listen.
pub_key: "/.preseed/unlock_wrapper_pubring.gpg" pub_key: "/.preseed/unlock_wrapper_pubring.gpg"
# './path/to/unlock_wrapper_pubring.pgp' to check the signature of: 'unlock-wrapper.sh.sha512.sig' # './path/to/unlock_wrapper_pubring.pgp' to check the signature of: 'unlock-wrapper.sh.sha512.sig'
sha_file: "/.preseed/unlock_wrapper.sh.sha512" sha_file: "/.preseed/unlock_wrapper.sh.sha512"
@@ -128,56 +131,56 @@ dropbear:
# https://docs.kernel.org/admin-guide/kernel-parameters.html # https://docs.kernel.org/admin-guide/kernel-parameters.html
################################################################################################################################ ################################################################################################################################
grub_parameter: grub_parameter:
##############################################################################################################################
# [ USB ] Default USB device authorization:
# default -1 = authorized (same as 1)
# 0 = not authorized, 1 = authorized, 2 = authorized if a device connected to an internal port.
##############################################################################################################################
- usbcore.authorized_default=0
############################################################################################################################## ##############################################################################################################################
# Audit events need to be captured on processes that start up prior to auditd, so that potential malicious activity cannot go # Audit events need to be captured on processes that start up prior to auditd, so that potential malicious activity cannot go
# undetected. During boot if audit=1, then the backlog will hold 64 records. If more than 64 records are created during boot, # undetected. During boot if audit=1, then the backlog will hold 64 records. If more than 64 records are created during boot,
# auditd records will be lost, and potential malicious activity could go undetected. # auditd records will be lost, and potential malicious activity could go undetected.
############################################################################################################################## ##############################################################################################################################
- "audit_backlog_limit=262144"
- "audit=1" - "audit=1"
- "audit_backlog_limit=8192"
############################################################################################################################## ##############################################################################################################################
# Distrusts CPU bootloader for initial entropy at boot. Distrusts the CPU for initial entropy at boot, as it is not possible # CFI Ensures that only controlled, predefined transitions are possible in the programs' control flow.
# to audit, may contain weaknesses or a backdoor. # kcfi (Kernel Control Flow Integrity): Specific implementation of CFI for the Linux kernel that is particularly robust and
# https://en.wikipedia.org/wiki/RDRAND#Reception # provides accurate control flow validation. kcfi relies on compiler-based technologies (e.g., LLVM) that insert special
# https://twitter.com/pid_eins/status/1149649806056280069 # checks and instrumentation into the kernel code.
# https://archive.nytimes.com/www.nytimes.com/interactive/2013/09/05/us/documents-reveal-nsa-campaign-against-encryption.html # https://kspp.github.io/Recommended_Settings#kernel-command-line-options
# https://forums.whonix.org/t/entropy-config-random-trust-cpu-yes-or-no-rng-core-default-quality/8566
# https://lkml.org/lkml/2022/6/5/271
############################################################################################################################## ##############################################################################################################################
- "random.trust_cpu=off" - "cfi=kcfi"
############################################################################################################################## ##############################################################################################################################
# Distrusts the bootloader for initial entropy at boot. # Prevents the debugfsfile system from being made available at boot time. This is a useful hardening measure because debugfs
# https://lkml.org/lkml/2022/6/5/271 # reveals a lot of potentially security-relevant kernel information by default, which can be misused by normal users and by
# exploits.
############################################################################################################################## ##############################################################################################################################
- "random.trust_bootloader=off" - "debugfs=off"
############################################################################################################################## ##############################################################################################################################
# ASLR (Address Space Layout Randomization) causes central areas of memory to be assigned random addresses each time a program # Disable the busmaster bit on all PCI bridges during very early boot to avoid holes in IOMMU.
# is started. These include: Stack, Heap, Shared libraries (e.g., libc), mmap regions, VDSO/VSyscall. The executable itself # https://mjg59.dreamwidth.org/54433.html
# (only with PIE binaries). The aim is to make it more difficult for attackers to predict memory addresses, thereby preventing # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4444f8541dad16fefd9b8807ad1451e806ef1d94
# classic exploits that rely on known addresses from succeeding.
# 0: disabled Fixed memory addresses insecure, testable.
# 1: Partial ASLR Heap, mmap are randomized, stack only partially randomized.
# 2: Full ASLR (default) Stack, mmap, heap, VDSO, shared libraries all randomized.
############################################################################################################################## ##############################################################################################################################
- "randomize_va_space=2" - "efi=disable_early_pci_dma"
############################################################################################################################## ##############################################################################################################################
# Enables IOMMU to prevent DMA attacks. intel_iommu=on amd_iommu=force_isolation iommu=force # Checks every copy_to_user() / copy_from_user()operation. Prevents kernels from accidentally copying unallocated memory to
# Multiple IOMMU switches are redundant; iommu=force is usually sufficient. Forces an IOMMU to be initialized and used # userspace. Stop exploits that trigger buffer overflows or use-after-free via copy_*_user(), for example. Effect: Detects
# completely, even if the BIOS or ACPI wanted to disable it. It activates the basic DMA remapping function. However, it does # heap/SLOB abuse, overwrites. Leads to BUG() & stack trace if suspicious access is detected.
# not say anything about how restrictive the mapping strategy is, 'passthrough', 'strict', see below.
############################################################################################################################## ##############################################################################################################################
- "iommu=force" - "hardened_usercopy=1"
##############################################################################################################################
# Remove additional (32-bit) attack surface, unless you really need them.
# https://www.kernel.org/doc/html/v6.10/admin-guide/kernel-parameters.html
# https://kspp.github.io/Recommended_Settings#kernel-command-line-options
##############################################################################################################################
- "ia32_emulation=0"
##############################################################################################################################
# Zero memory at allocation and free time.
##############################################################################################################################
- "init_on_alloc=1"
- "init_on_free=1"
############################################################################################################################## ##############################################################################################################################
# Enables strict enforcement of IOMMU TLB invalidation, so devices will never be able to access stale data contents. # Enables strict enforcement of IOMMU TLB invalidation, so devices will never be able to access stale data contents.
@@ -196,122 +199,23 @@ grub_parameter:
- "iommu.strict=1" - "iommu.strict=1"
############################################################################################################################## ##############################################################################################################################
# Disable the busmaster bit on all PCI bridges during very early boot to avoid holes in IOMMU. # Enables IOMMU to prevent DMA attacks. intel_iommu=on amd_iommu=force_isolation iommu=force
# https://mjg59.dreamwidth.org/54433.html # Multiple IOMMU switches are redundant; iommu=force is usually sufficient. Forces an IOMMU to be initialized and used
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4444f8541dad16fefd9b8807ad1451e806ef1d94 # completely, even if the BIOS or ACPI wanted to disable it. It activates the basic DMA remapping function. However, it does
# not say anything about how restrictive the mapping strategy is, 'passthrough', 'strict', see below.
############################################################################################################################## ##############################################################################################################################
- "efi=disable_early_pci_dma" - "iommu=force"
############################################################################################################################## ##############################################################################################################################
# Disables the merging of slabs of similar sizes. Sometimes a slab can be used vulnerably, which an attacker can exploit. # Kernel Electric-Fence (KFENCE) is a low-overhead sampling-based memory safety error detector. KFENCE detects a heap of
# out-of-bounds access, use-after-free, and invalid-free errors. KFENCE is designed to be enabled in production kernels and
# has near zero performance overhead. Compared to KASAN, KFENCE trades performance for precision. The main motivation behind
# KFENCE design is that with enough total uptime, KFENCE will detect bugs in code paths not typically exercised by
# non-production test workloads. One way to quickly achieve a large enough total uptime is when the tool is deployed across a
# large fleet of machines.
# https://docs.kernel.org/dev-tools/kfence.html
############################################################################################################################## ##############################################################################################################################
- "slab_nomerge" - "kfence.sample_interval=100"
##############################################################################################################################
# Zero memory at allocation and free time.
##############################################################################################################################
- "init_on_alloc=1"
- "init_on_free=1"
##############################################################################################################################
# This option randomizes page allocator freelists, improving security by making page allocations less predictable. This also
# improves performance.
##############################################################################################################################
- "page_alloc.shuffle=1"
##############################################################################################################################
# When releasing (i.e., free_pages()), all bytes with a marker value (e.g., 0xAA) are overwritten. If later code
# (accidentally or maliciously) accesses this page, it will most likely crash or produce recognizable artifacts. Only
# supported if the kernel was built with CONFIG_PAGE_POISONING=y (default on Debian: enabled since Bookworm).
##############################################################################################################################
- "page_poison=1"
##############################################################################################################################
# Enables Kernel Page Table Isolation, which mitigates Meltdown, improves KASLR.
##############################################################################################################################
- "pti=on"
##############################################################################################################################
# The setting 'vsyscall' is obsolete, are at fixed addresses and are a target for ROP.
##############################################################################################################################
- "vsyscall=none"
##############################################################################################################################
# The kernel adds a small random padding offset to the stack pointer with every system call or kernel entry. The starting
# point for local variables is at a different position within the stack with every call. This makes ROP chains
# (return-oriented programming) or stack pivoting attacks significantly more difficult.
##############################################################################################################################
- "randomize_kstack_offset=on"
##############################################################################################################################
# Prevents the debugfsfile system from being made available at boot time. This is a useful hardening measure because debugfs
# reveals a lot of potentially security-relevant kernel information by default, which can be misused by normal users and by
# exploits.
##############################################################################################################################
- "debugfs=off"
##############################################################################################################################
# Force the kernel to panic on "oopses" (which may be due to false positives).
# - 'panic=N' (e.g., 'panic=60'): Wait N seconds and then reboot.
# - 'panic=0' No automatic action (System remains stuck in panic state).
# - 'panic=-1' Also explicitly prevents any automatic reboot.
##############################################################################################################################
- "oops=panic"
- "panic=-1"
##############################################################################################################################
# Enable a subset of known mitigations for CPU vulnerabilities and disable SMT.
# - 'mitigations=auto' Enables all available CPU-specific security measures based on the detected CPU, microcode version, and
# kernel build configuration, if applicable.
# - 'nosmt' Disables Simultaneous Multithreading (SMT) (e.g., Hyper-Threading on Intel) system-wide to prevent shared cache
# attacks (SMoTHER, MDS, L1TF, TAA, Snoop-assisted).
# Why is 'mitigations=auto,nosmt' better than setting everything manually?
# Automatically adjusted: Depending on CPU family, stepping, microcode.
# Consistency guaranteed: No contradictions between flags are possible
# (e.g., spec_store_bypass_disable=on vs. nospec_store_bypass_disable=off).
# Future-proof: Even new features (e.g., bhi=flush or srbds) are automatically activated without having to know about them.
##############################################################################################################################
- "mitigations=auto,nosmt"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Enable mitigations for both 'Spectre Variant 2' (indirect branch speculation) and Intel branch history injection (BHI)
# vulnerabilities.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/spectre.html
##############################################################################################################################
#- "spectre_v2=on"
#- "spectre_v2_user=on"
#- "spectre_bhi=on"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Disable Speculative Store Bypass (Spectre Variant 4).
# https://www.suse.com/support/kb/doc/?id=000019189
##############################################################################################################################
#- "spec_store_bypass_disable=on"
#- "nospec_store_bypass_disable=off"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Enable mitigations for the L1TF vulnerability through disabling SMT and L1D flush runtime control.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/l1tf.html
##############################################################################################################################
#- "l1tf=full,force"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Enable mitigations for the MDS vulnerability through clearing the buffer cache and disabling SMT.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html
##############################################################################################################################
#- "mds=full,nosmt"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Patches the TAA vulnerability by disabling TSX and enables mitigations using TSX Async Abort along with disabling SMT.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/tsx_async_abort.html
##############################################################################################################################
#- "tsx=off"
#- "tsx_async_abort=full,nosmt"
############################################################################################################################## ##############################################################################################################################
# Mark all huge pages in the EPT as non-executable to mitigate iTLB multihit. # Mark all huge pages in the EPT as non-executable to mitigate iTLB multihit.
@@ -319,12 +223,6 @@ grub_parameter:
############################################################################################################################## ##############################################################################################################################
- "kvm.nx_huge_pages=force" - "kvm.nx_huge_pages=force"
##############################################################################################################################
# Force disable SMT as it has caused numerous CPU vulnerabilities. The only full mitigation of cross-HT attacks is disabling.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/core-scheduling.html
##############################################################################################################################
- "nosmt=force"
############################################################################################################################## ##############################################################################################################################
# Enables the prctl interface to prevent leaks from L1D on context switches. # Enables the prctl interface to prevent leaks from L1D on context switches.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/l1d_flush.html # https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/l1d_flush.html
@@ -332,25 +230,11 @@ grub_parameter:
- "l1d_flush=on" - "l1d_flush=on"
############################################################################################################################## ##############################################################################################################################
# Mitigates numerous MMIO Stale Data vulnerabilities and disables SMT. # If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# mmio_stale_data=off No mitigation (unsafe) # Enable mitigations for the L1TF vulnerability through disabling SMT and L1D flush runtime control.
# mmio_stale_data=full All known measures active # https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/l1tf.html
# mmio_stale_data=full,nosmt Full mitigation + SMT disabling
# mmio_stale_data=auto Activated depending on CPU/microcode
# mmio_stale_data=full,force Forces mitigation even on CPUs that are supposedly not affected.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html
############################################################################################################################## ##############################################################################################################################
- "mmio_stale_data=full,force" #- "l1tf=full,force"
##############################################################################################################################
# Enable mitigations for RETBleed (Arbitrary Speculative Code Execution with Return Instructions) vulnerability and disable
# SMT. If 'mitigations=auto,nosmt' is set, the kernel already activates all retbleed-relevant mitigations, provided the CPU
# is affected; 'retbleed=auto,nosmt' explicitly overrides the internal assessment and forces full protection. If maximum
# hardening is required, and one does not want to rely on "auto-detection", then it is recommended to additionally set
# 'retbleed=auto,nosmt' otherwise, 'mitigations=auto,nosmt' is sufficient.
# https://www.suse.com/support/kb/doc/?id=000020693
##############################################################################################################################
- "retbleed=auto,nosmt"
############################################################################################################################## ##############################################################################################################################
# Enables kernel lockdown mode with a focus on confidentiality. The kernel is configured in such a way that even privileged # Enables kernel lockdown mode with a focus on confidentiality. The kernel is configured in such a way that even privileged
@@ -375,6 +259,119 @@ grub_parameter:
############################################################################################################################## ##############################################################################################################################
- "lockdown=integrity" - "lockdown=integrity"
##############################################################################################################################
# All Kernel Messages with a loglevel smaller than the console loglevel will be printed to the console. It can also be
# changed with 'klogd' or other programs. The log levels are defined as follows:
# 0 (KERN_EMERG) system is unusable
# 1 (KERN_ALERT) action must be taken immediately
# 2 (KERN_CRIT) critical conditions
# 3 (KERN_ERR) error conditions
# 4 (KERN_WARNING) warning conditions
# 5 (KERN_NOTICE) normal but significant condition
# 6 (KERN_INFO) informational
# 7 (KERN_DEBUG) debug-level messages
##############################################################################################################################
- "loglevel=0"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Enable mitigations for the MDS vulnerability through clearing the buffer cache and disabling SMT.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html
##############################################################################################################################
#- "mds=full,nosmt"
##############################################################################################################################
# Enable a subset of known mitigations for CPU vulnerabilities and disable SMT.
# - 'mitigations=auto' Enables all available CPU-specific security measures based on the detected CPU, microcode version, and
# kernel build configuration, if applicable.
# - 'nosmt' Disables Simultaneous Multithreading (SMT) (e.g., Hyper-Threading on Intel) system-wide to prevent shared cache
# attacks (SMoTHER, MDS, L1TF, TAA, Snoop-assisted).
# Why is 'mitigations=auto,nosmt' better than setting everything manually?
# Automatically adjusted: Depending on CPU family, stepping, microcode.
# Consistency guaranteed: No contradictions between flags are possible
# (e.g., spec_store_bypass_disable=on vs. nospec_store_bypass_disable=off).
# Future-proof: Even new features (e.g., bhi=flush or srbds) are automatically activated without having to know about them.
##############################################################################################################################
- "mitigations=auto,nosmt"
##############################################################################################################################
# Mitigates numerous MMIO Stale Data vulnerabilities and disables SMT.
# mmio_stale_data=off No mitigation (unsafe)
# mmio_stale_data=full All known measures active
# mmio_stale_data=full,nosmt Full mitigation + SMT disabling
# mmio_stale_data=auto Activated depending on CPU/microcode
# mmio_stale_data=full,force Forces mitigation even on CPUs that are supposedly not affected.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/processor_mmio_stale_data.html
##############################################################################################################################
- "mmio_stale_data=full,force"
##############################################################################################################################
# Force disable SMT as it has caused numerous CPU vulnerabilities. The only full mitigation of cross-HT attacks is disabling.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/core-scheduling.html
##############################################################################################################################
- "nosmt=force"
##############################################################################################################################
# Force the kernel to panic on "oopses" (which may be due to false positives).
# - 'panic=N' (e.g., 'panic=60'): Wait N seconds and then reboot.
# - 'panic=0' No automatic action (System remains stuck in panic state).
# - 'panic=-1' Also explicitly prevents any automatic reboot.
##############################################################################################################################
- "oops=panic"
- "panic=0"
##############################################################################################################################
# This option randomizes page allocator freelists, improving security by making page allocations less predictable. This also
# improves performance.
##############################################################################################################################
- "page_alloc.shuffle=1"
##############################################################################################################################
# When releasing (i.e., free_pages()), all bytes with a marker value (e.g., 0xAA) are overwritten. If later code
# (accidentally or maliciously) accesses this page, it will most likely crash or produce recognizable artifacts. Only
# supported if the kernel was built with CONFIG_PAGE_POISONING=y (default on Debian: enabled since Bookworm).
##############################################################################################################################
- "page_poison=1"
##############################################################################################################################
# Enables Kernel Page Table Isolation, which mitigates Meltdown, improves KASLR.
##############################################################################################################################
- "pti=on"
##############################################################################################################################
# Distrusts the bootloader for initial entropy at boot.
# https://lkml.org/lkml/2022/6/5/271
##############################################################################################################################
- "random.trust_bootloader=off"
##############################################################################################################################
# Distrusts CPU bootloader for initial entropy at boot. Distrusts the CPU for initial entropy at boot, as it is not possible
# to audit, may contain weaknesses or a backdoor.
# https://en.wikipedia.org/wiki/RDRAND#Reception
# https://twitter.com/pid_eins/status/1149649806056280069
# https://archive.nytimes.com/www.nytimes.com/interactive/2013/09/05/us/documents-reveal-nsa-campaign-against-encryption.html
# https://forums.whonix.org/t/entropy-config-random-trust-cpu-yes-or-no-rng-core-default-quality/8566
# https://lkml.org/lkml/2022/6/5/271
##############################################################################################################################
- "random.trust_cpu=off"
##############################################################################################################################
# The kernel adds a small random padding offset to the stack pointer with every system call or kernel entry. The starting
# point for local variables is at a different position within the stack with every call. This makes ROP chains
# (return-oriented programming) or stack pivoting attacks significantly more difficult.
##############################################################################################################################
- "randomize_kstack_offset=on"
##############################################################################################################################
# Enable mitigations for RETBleed (Arbitrary Speculative Code Execution with Return Instructions) vulnerability and disable
# SMT. If 'mitigations=auto,nosmt' is set, the kernel already activates all retbleed-relevant mitigations, provided the CPU
# is affected; 'retbleed=auto,nosmt' explicitly overrides the internal assessment and forces full protection. If maximum
# hardening is required, and one does not want to rely on "auto-detection", then it is recommended to additionally set
# 'retbleed=auto,nosmt' otherwise, 'mitigations=auto,nosmt' is sufficient.
# https://www.suse.com/support/kb/doc/?id=000020693
##############################################################################################################################
- "retbleed=auto,nosmt"
############################################################################################################################## ##############################################################################################################################
# Enables 'Read-Only Data Protection', which implements read-only memory areas for kernel data structures. This protects the # Enables 'Read-Only Data Protection', which implements read-only memory areas for kernel data structures. This protects the
# kernel from certain types of exploit (e.g., buffer overflows). 'on': Forces the corresponding areas to remain read-only. # kernel from certain types of exploit (e.g., buffer overflows). 'on': Forces the corresponding areas to remain read-only.
@@ -383,31 +380,42 @@ grub_parameter:
- "rodata=on" - "rodata=on"
############################################################################################################################## ##############################################################################################################################
# Kernel Electric-Fence (KFENCE) is a low-overhead sampling-based memory safety error detector. KFENCE detects a heap of # Disables the merging of slabs of similar sizes. Sometimes a slab can be used vulnerably, which an attacker can exploit.
# out-of-bounds access, use-after-free, and invalid-free errors. KFENCE is designed to be enabled in production kernels and
# has near zero performance overhead. Compared to KASAN, KFENCE trades performance for precision. The main motivation behind
# KFENCE design is that with enough total uptime, KFENCE will detect bugs in code paths not typically exercised by
# non-production test workloads. One way to quickly achieve a large enough total uptime is when the tool is deployed across a
# large fleet of machines.
# https://docs.kernel.org/dev-tools/kfence.html
############################################################################################################################## ##############################################################################################################################
- "kfence.sample_interval=100" - "slab_nomerge"
############################################################################################################################## ##############################################################################################################################
# CFI Ensures that only controlled, predefined transitions are possible in the programs' control flow. # If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# kcfi (Kernel Control Flow Integrity): Specific implementation of CFI for the Linux kernel that is particularly robust and # Disable Speculative Store Bypass (Spectre Variant 4).
# provides accurate control flow validation. kcfi relies on compiler-based technologies (e.g., LLVM) that insert special # https://www.suse.com/support/kb/doc/?id=000019189
# checks and instrumentation into the kernel code.
# https://kspp.github.io/Recommended_Settings#kernel-command-line-options
############################################################################################################################## ##############################################################################################################################
- "cfi=kcfi" #- "spec_store_bypass_disable=on"
#- "nospec_store_bypass_disable=off"
############################################################################################################################## ##############################################################################################################################
# Remove additional (32-bit) attack surface, unless you really need them. # If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# https://www.kernel.org/doc/html/v6.10/admin-guide/kernel-parameters.html # Enable mitigations for both 'Spectre Variant 2' (indirect branch speculation) and Intel branch history injection (BHI)
# https://kspp.github.io/Recommended_Settings#kernel-command-line-options # vulnerabilities.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/spectre.html
############################################################################################################################## ##############################################################################################################################
- "ia32_emulation=0" #- "spectre_v2=on"
#- "spectre_v2_user=on"
#- "spectre_bhi=on"
##############################################################################################################################
# If mitigations=auto,nosmt is set, see before, then these flags should not be set individually because they are redundant.
# Patches the TAA vulnerability by disabling TSX and enables mitigations using TSX Async Abort along with disabling SMT.
# https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/tsx_async_abort.html
##############################################################################################################################
#- "tsx=off"
#- "tsx_async_abort=full,nosmt"
##############################################################################################################################
# [ USB ] Default USB device authorization:
# default -1 = authorized (same as 1)
# 0 = not authorized, 1 = authorized, 2 = authorized if a device connected to an internal port.
##############################################################################################################################
- "usbcore.authorized_default=0"
############################################################################################################################## ##############################################################################################################################
# Removes mapping for 32-bit VDSO (for ia32binaries). On 32-bit processes that rely on VDSO, this causes a fallback to classic # Removes mapping for 32-bit VDSO (for ia32binaries). On 32-bit processes that rely on VDSO, this causes a fallback to classic
@@ -417,16 +425,9 @@ grub_parameter:
- "vdso32=0" - "vdso32=0"
############################################################################################################################## ##############################################################################################################################
# Checks every copy_to_user() / copy_from_user()operation. Prevents kernels from accidentally copying unallocated memory to # The setting 'vsyscall' is obsolete, are at fixed addresses and are a target for ROP.
# userspace. Stop exploits that trigger buffer overflows or use-after-free via copy_*_user(), for example. Effect: Detects
# heap/SLOB abuse, overwrites. Leads to BUG() & stack trace if suspicious access is detected.
############################################################################################################################## ##############################################################################################################################
- "hardened_usercopy=1" - "vsyscall=none"
##############################################################################################################################
# Sets the minimum log output of the kernel at boot time to level 0 (= KERN_EMERG).
##############################################################################################################################
- "loglevel=0"
################################################################################################################################ ################################################################################################################################
# Grub settings # Grub settings
@@ -434,7 +435,7 @@ grub_parameter:
grub: grub:
background: # RECOMMENDED settings: JPG 1280 x 1024 px or JPG 1920 x 1080 px background: # RECOMMENDED settings: JPG 1280 x 1024 px or JPG 1920 x 1080 px
enable: true # If you want to add a GRUB background. enable: true # If you want to add a GRUB background.
path: "/includes/target/etc/default/grub.d/club_1280_720.png" path: "/includes/target/etc/default/grub.d/hexagon_1280_720.png"
bootdev: "/dev/sda" # Due notably to potential USB sticks, the location of the primary drive cannot be determined bootdev: "/dev/sda" # Due notably to potential USB sticks, the location of the primary drive cannot be determined
# safely in general, so this needs to be specified. # safely in general, so this needs to be specified.
force_efi: true # Force GRUB installation to the EFI removable media path? force_efi: true # Force GRUB installation to the EFI removable media path?
@@ -453,7 +454,7 @@ grub:
other-os: true # This one makes grub-installer install to the UEFI partition '/boot' record if it also finds other-os: true # This one makes grub-installer install to the UEFI partition '/boot' record if it also finds
# some other OS, which is less safe as it might not be able to boot that other OS. # some other OS, which is less safe as it might not be able to boot that other OS.
password: true # If you want to set a password for GRUB. The password MUST be set at: password: true # If you want to set a password for GRUB. The password MUST be set at:
# '/.preseed/password_grub.txt'. # '/.preseed/SECRETS.yaml'.
prober: false # OS-prober did not detect any other operating systems on your computer at this time, but you prober: false # OS-prober did not detect any other operating systems on your computer at this time, but you
# may still wish to enable it in case you install more in the future. # may still wish to enable it in case you install more in the future.
skip: false # Skip installing grub. skip: false # Skip installing grub.
@@ -511,6 +512,7 @@ network:
dhcp: 60 # If the dhcp server is slow, and the installer times out waiting for it, this might be useful. dhcp: 60 # If the dhcp server is slow, and the installer times out waiting for it, this might be useful.
linkwait: 3 # To set a different link detection timeout (default is 3 seconds). linkwait: 3 # To set a different link detection timeout (default is 3 seconds).
static: static:
dns_dhcp_override: true # If you want to override the DNS settings of the DHCP server.
enable: true # If you want the preconfiguration file to work on systems both with and without a dhcp enable: true # If you want the preconfiguration file to work on systems both with and without a dhcp
# server, change 'network.static.enable' from "false" to "true" and configure the static # server, change 'network.static.enable' from "false" to "true" and configure the static
# configuration below. # configuration below.
@@ -525,7 +527,7 @@ network:
#- "176.9.93.198" # dnsforge.de #- "176.9.93.198" # dnsforge.de
#- "176.9.1.117" # dnsforge.de #- "176.9.1.117" # dnsforge.de
ipv6address: "2a03:4000:10:d43:188:68:34:243" ipv6address: "2a03:4000:10:d43:188:68:34:243"
ipv6netmask: "128" ipv6netmask: "64"
ipv6gateway: "fe80::1" ipv6gateway: "fe80::1"
ipv6nameserver: ipv6nameserver:
- "2a01:4f9:c012:a813:135:181:207:105" - "2a01:4f9:c012:a813:135:181:207:105"
@@ -622,8 +624,8 @@ software:
# gawk # gawk
# gdisk # gdisk
# gnupg # gnupg
# haveged
# initramfs-tools # initramfs-tools
# jitterentropy-rngd
# jq # jq
# kbd # kbd
# keyutils # keyutils
@@ -632,6 +634,7 @@ software:
# parted # parted
# pciutils # pciutils
# pwgen # pwgen
# rsyslog
# sudo # sudo
# tree # tree
# unzip # unzip
@@ -683,7 +686,9 @@ software:
############################################################################################################################## ##############################################################################################################################
### Installed by 4310_dropbear_build.sh ### Installed by 4310_dropbear_build.sh
############################################################################################################################## ##############################################################################################################################
# dropbear-bin
# dropbear-initramfs # dropbear-initramfs
# gpgv
# #
############################################################################################################################## ##############################################################################################################################
### Installed by 4330_installation_ssh.sh ### Installed by 4330_installation_ssh.sh
@@ -691,11 +696,13 @@ software:
# ssh # ssh
# #
############################################################################################################################## ##############################################################################################################################
### Installed by 4480_hardening_usb.sh
##############################################################################################################################
# usbguard
#
##############################################################################################################################
### Installed by 4490_hardening_virus.sh ### Installed by 4490_hardening_virus.sh
############################################################################################################################## ##############################################################################################################################
# chkrootkit
# clamav
# clamav-daemon
# rkhunter # rkhunter
# #
############################################################################################################################## ##############################################################################################################################
@@ -714,69 +721,74 @@ software:
# wngerman # wngerman
# #
############################################################################################################################## ##############################################################################################################################
# core software # Installed by 4600_installation_packages.sh
############################################################################################################################## ##############################################################################################################################
- apt-utils
- bat - bat
- debconf
- debconf-utils
- dialog - dialog
- knot-dnssecutils - expect
- knot-dnsutils - htop
- iftop
- locate - locate
- rsyslog
- screen
- spectre-meltdown-checker
- sysstat
##############################################################################################################################
# documentation
##############################################################################################################################
- debian-kernel-handbook
- linux-doc-6.12
- man-db - man-db
############################################################################################################################## - mtr-tiny
# encryption - ncat
##############################################################################################################################
- pollinate
##############################################################################################################################
# files
##############################################################################################################################
- rsnapshot
- rsync - rsync
- sysstat
- zip - zip
############################################################################################################################## ##############################################################################################################################
# network # backup and diagnostics
############################################################################################################################## ##############################################################################################################################
- dhcpdump #- borgbackup
- dhcping #- borgbackup-doc
- iftop #- dhcpdump
- mtr #- dhcping
- ncat #- knot-dnssecutils
- net-tools #- knot-dnsutils
- nmap #- nmap
- tshark #- rsnapshot
############################################################################################################################## #- spectre-meltdown-checker
# partitioning #- tshark
##############################################################################################################################
- mdadm
############################################################################################################################## ##############################################################################################################################
# sw dev # sw dev
############################################################################################################################## ##############################################################################################################################
#- apt-utils
#- build-essential #- build-essential
#- clang #- clang
#- debconf
#- debconf-utils
#- debootstrap #- debootstrap
#- linux-source #- linux-source
#- lld #- lld
#- manpages
#- manpages-dev
#- shellcheck #- shellcheck
#- ssl-cert #- ssl-cert
############################################################################################################################## ##############################################################################################################################
# tools # Installed by 4610_installation_security.sh
############################################################################################################################## ##############################################################################################################################
- expect # apparmor
- figlet # apparmor-profiles
- htop # apparmor-profiles-extra
- keychain # apparmor-utils
- virt-what # OR #
# selinux-basics
# selinux-policy-default
# selinux-utils
# setools
# semodule-utils
# sepol-utils
# policycoreutils
# policycoreutils-python-utils
# checkpolicy
# python3-setools
##############################################################################################################################
# Installed by 4620_installation_verification.sh
##############################################################################################################################
# acct
# aide
# aide-common
# audit
# debsums
################################################################################################################################ ################################################################################################################################
# Time settings # Time settings
@@ -795,13 +807,13 @@ software:
# USA : time-a-g.nist.gov time-c-b.nist.gov utcnist3.colorado.edu # USA : time-a-g.nist.gov time-c-b.nist.gov utcnist3.colorado.edu
ntp: ntp:
server: server:
- "ntp.ripe.net" #- "ntp.ripe.net" # Time out as of 2025-10-16
- "ptbtime3.ptb.de" - "ptbtime3.ptb.de"
- "ptbtime2.ptb.de" - "ptbtime2.ptb.de"
- "ptbtime1.ptb.de" - "ptbtime1.ptb.de"
- "ntp13.metas.ch" #- "ntp13.metas.ch" # Time out as of 2025-10-16
- "time-c-b.nist.gov" #- "time-c-b.nist.gov" # Time out as of 2025-10-16
- "sth1.ntp.se" #- "sth1.ntp.se" # Time out as of 2025-10-16
- "ntp0.fau.de" - "ntp0.fau.de"
timezone: "Europe/Lisbon" # Any valid setting for $TZ; see the contents of '/usr/share/zoneinfo' for valid values. timezone: "Europe/Lisbon" # Any valid setting for $TZ; see the contents of '/usr/share/zoneinfo' for valid values.
utc: true # Controls whether the hardware clock is set to UTC. utc: true # Controls whether the hardware clock is set to UTC.
@@ -813,6 +825,10 @@ ssh:
allow_hardening: true # For additional hardening of SSH connections via TCP wrapper: '/etc/hosts.allow'. allow_hardening: true # For additional hardening of SSH connections via TCP wrapper: '/etc/hosts.allow'.
# If "allow_hardening" = "true", at least one 'allow_ipv4' MUST be provided. # If "allow_hardening" = "true", at least one 'allow_ipv4' MUST be provided.
allow_ipv4: # Provide Bastion / Jump-Server / static VPN-Exit-Nodes IPv4: will be added: 'f2ban-ignoreip'. allow_ipv4: # Provide Bastion / Jump-Server / static VPN-Exit-Nodes IPv4: will be added: 'f2ban-ignoreip'.
# Also, ufw will be configured to ufw aggressive approach:
# Any valid client communicating with the server should be going directly to the service ports
# opened in ufw (ssh, 80, ...). Any client touching other ports is treated as malicious and
# therefore is blocked access to ALL ports after 1 attempt.
- 202.61.246.50 - 202.61.246.50
allow_ipv6: # Provide Bastion / Jump-Server / static VPN-Exit-Nodes IPv6: will be added: 'f2ban-ignoreip'. allow_ipv6: # Provide Bastion / Jump-Server / static VPN-Exit-Nodes IPv6: will be added: 'f2ban-ignoreip'.
- 2a03:4000:53:f:abcd:9494:0:2 - 2a03:4000:53:f:abcd:9494:0:2
@@ -823,23 +839,22 @@ ssh:
# User settings # User settings
################################################################################################################################ ################################################################################################################################
user: user:
mfa:
info: "totp:v1"
salt: "CISS:CDI:OTP" # + (Server_FQDN/Username)
############################################################################################################################## ##############################################################################################################################
# root Superuser account (normally disabled for direct login) # Root: The superuser account (normally disabled for direct login).
# Key 'user.root.password' MUST contain a valid yescrypt hashed password string.
# Key 'user.root.sshpubkey' MUST be set in case dropbear is used.
############################################################################################################################## ##############################################################################################################################
root: root:
ensure: present # Must always be 'present'. (Not in use in this version of the installer.) ensure: present # Must always be 'present'. (Not in use in this version of the installer.)
protected: true # Prevent unintentional edits or deletions. (Not in use in this version of the installer.) protected: true # Prevent unintentional edits or deletions. (Not in use in this version of the installer.)
shell: /bin/zsh # Login shell (e.g., '/bin/bash', '/bin/zsh'); use '/usr/sbin/nologin' for non-interactive users. shell: /bin/zsh # Login shell (e.g., '/bin/bash', '/bin/zsh'); use '/usr/sbin/nologin' for non-interactive users.
password: "47110815" password: "$y$jFT$7pQlcZrgTEGrzkEm7UQW/.$QoCamalYEAV5mN4QWIE.xpHo8kvXa9sym2Uz.9oELwA"
sshpubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY" sshpubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY"
authentication: authentication:
access: access:
ssh: false # Allow SSH access. ssh: false # Allow SSH access.
tty: false # Allow TTY (local console) login. tty: false # Allow TTY (local console) login.
password: false # Allow password login. SSH password login is always disabled. password: true # Allow password login. SSH password login is always disabled.
2fa: 2fa:
ssh: true # Require 2FA for SSH access. ssh: true # Require 2FA for SSH access.
tty: true # Require 2FA for TTY (local console) login. tty: true # Require 2FA for TTY (local console) login.
@@ -849,6 +864,8 @@ user:
shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'. shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'.
sudo: false # Whether the user can escalate to root using sudo. sudo: false # Whether the user can escalate to root using sudo.
system: true # Whether this is a low-UID system user (e.g., for automation). system: true # Whether this is a low-UID system user (e.g., for automation).
specific: "ciss" # Adjust the settings for the user account as required. Allowed values are 'none', 'ciss', and
# 'physnet'.
############################################################################################################################## ##############################################################################################################################
# Primary administrative user with full sudo access # Primary administrative user with full sudo access
@@ -856,12 +873,12 @@ user:
user0: user0:
ensure: present # Must always be 'present'. (Not in use in this version of the installer.) ensure: present # Must always be 'present'. (Not in use in this version of the installer.)
protected: true # Prevent unintentional edits or deletions. (Not in use in this version of the installer.) protected: true # Prevent unintentional edits or deletions. (Not in use in this version of the installer.)
name: "msw" # The name of the user account. name: "msw" # The name of the user account. No ":" allowed.
fullname: "msw" # The full name of the user account holder. fullname: "msw" # The full name of the user account holder.
uid: 1000 # Ensures that the same user has the same UID on all systems. uid: 1000 # Ensures that the same user has the same UID on all systems.
gid: 1000 # Ensures that the same user has the same GID on all systems. gid: 1000 # Ensures that the same user has the same GID on all systems.
shell: /bin/zsh # Login shell (e.g., '/bin/bash', '/bin/zsh'); use '/usr/sbin/nologin' for non-interactive users. shell: /bin/zsh # Login shell (e.g., '/bin/bash', '/bin/zsh'); use '/usr/sbin/nologin' for non-interactive users.
password: "47110815" password: "$y$jFT$OGeZONH5ho2JSXvAbyIBQ1$5OhyHqOaMZ9BZcfMOYEwF.nMLFKd9ceiW2oNksPCHVB"
sshpubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY" sshpubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINAYZDAqVZUk3LwJsqeVHKvLn8UKkFx642VBbiSS8uSY 2025_ciss.debian.live.ISO_PUBLIC_ONLY"
authentication: authentication:
access: access:
@@ -877,6 +894,8 @@ user:
system: false # Whether this is a low-UID system user (e.g., for automation). system: false # Whether this is a low-UID system user (e.g., for automation).
restricted: false # If true, the user is limited in scope (e.g., no login, no file access, --no-create-home) restricted: false # If true, the user is limited in scope (e.g., no login, no file access, --no-create-home)
shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'. shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'.
specific: "ciss" # Adjust the settings for the user account as required. Allowed values are 'none', 'ciss', and
# 'physnet'.
############################################################################################################################## ##############################################################################################################################
# ansible System user for automation, no interactive shell # ansible System user for automation, no interactive shell
@@ -884,7 +903,7 @@ user:
user1: user1:
ensure: present # "present" = create user; "absent" = remove user ensure: present # "present" = create user; "absent" = remove user
protected: true # Prevent unintentional edits or deletions. protected: true # Prevent unintentional edits or deletions.
name: "ansible" # The name of the user account. name: "ansible" # The name of the user account. No ":" allowed.
fullname: "ansible" # The full name of the user account holder. fullname: "ansible" # The full name of the user account holder.
uid: 137 # Ensures that the same user has the same UID on all systems. uid: 137 # Ensures that the same user has the same UID on all systems.
gid: 137 # Ensures that the same user has the same GID on all systems. gid: 137 # Ensures that the same user has the same GID on all systems.
@@ -905,5 +924,7 @@ user:
system: true # Whether this is a low-UID system user (e.g., for automation). system: true # Whether this is a low-UID system user (e.g., for automation).
restricted: false # If true, the user is limited in scope (e.g., no login, no file access, --no-create-home) restricted: false # If true, the user is limited in scope (e.g., no login, no file access, --no-create-home)
shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'. shell: true # MUST be "true" if the shell is not '/usr/sbin/nologin' or '/bin/false'.
specific: "none" # Adjust the settings for the user account as required. Allowed values are 'none', 'ciss', and
# 'physnet'.
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=yaml # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=yaml

View File

@@ -1 +1 @@
a21c7ab831616a8f880a5fb528d4eea3e0095da956ed5665255f9845a7dadf43020dd794c19deeb7b98ca8a3836e46c35c214a5da4f5a5b2ae63ebf10c9c67f1 2d90783e0ffba3c6972b3a0d5335cca4a37c03b417f43b62b082a83734d4e4148390ac22509e68d63aaca11baf4fb081747f83347eab08176fb647e5445372f6

View File

@@ -0,0 +1,2 @@
# created: 2025-10-11T17:22:22Z
# public key: age1l3pm5sjg0lj5l5jlh2azllccmzflpend9hpgcg7zvsk2mr4hvpqscdwm8f

View File

@@ -0,0 +1,2 @@
# created: 2025-10-11T17:20:35Z
# public key: age1chzjfu3f5nxnh5yz2l6n43l6gs07qyqcfzekdfhr5gezqvemcq7qjn23kv

View File

@@ -9,6 +9,9 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
# https://github.com/koalaman/shellcheck/wiki/directive
# https://github.com/koalaman/shellcheck/wiki/Optional
encoding=utf-8 encoding=utf-8
external-sources=true external-sources=true
shell=bash shell=bash
@@ -16,6 +19,8 @@ source-path=~/func
source-path=~/lib source-path=~/lib
source-path=~/var source-path=~/var
enable=add-default-case
enable=avoid-negated-conditions
enable=avoid-nullary-conditions enable=avoid-nullary-conditions
enable=check-extra-masked-returns enable=check-extra-masked-returns
enable=check-set-e-suppressed enable=check-set-e-suppressed
@@ -24,5 +29,6 @@ enable=deprecate-which
enable=quote-safe-variables enable=quote-safe-variables
enable=require-double-brackets enable=require-double-brackets
enable=require-variable-braces enable=require-variable-braces
enable=useless-use-of-cat
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf

View File

@@ -1,4 +1,3 @@
#!/bin/bash
# SPDX-Version: 3.0 # SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git # SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
@@ -9,19 +8,10 @@
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework. # SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
creation_rules:
guard_sourcing - path_regex: '(^|.*/)\.preseed/SECRETS\.yaml$'
encrypted_regex: '^value$'
####################################### stores:
# Finalize the system. yaml:
# Globals: indent: 2
# TARGET # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=yaml
# Arguments:
# None
# Returns:
# 0: on success
#######################################
finalize_system() {
guard_dir && return 0
}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -1,5 +1,5 @@
# SPDX-Version: 3.0 # SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-CreationInfo: 2025-10-26; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git # SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency # SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
@@ -9,8 +9,8 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
This file was automatically generated by the DEPLOY BOT on: "2025-09-17T07:43:27Z". This file was automatically generated by the DEPLOY BOT on: "2025-10-26T18:19:45Z".
The last linter check was successful. ⚠️ The last linter check was NOT successful. ⚠️
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=text # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=text

View File

@@ -6,13 +6,13 @@ include_toc: true
&nbsp; &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/Licence-EUPL1.2-white?style=plastic&logo=europeanunion&logoColor=white&logoSize=auto&label=Licence&color=%23003399)](https://eupl.eu/1.2/en/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/Licence-EUPL1.2-white?style=plastic&logo=europeanunion&logoColor=white&logoSize=auto&label=Licence&color=%23003399)](https://eupl.eu/1.2/en/) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/opensourceinitiative-Compliant-white?style=plastic&logo=opensourceinitiative&logoColor=white&logoSize=auto&label=OSI&color=%233DA639)](https://opensource.org/license/eupl-1-2) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/opensourceinitiative-Compliant-white?style=plastic&logo=opensourceinitiative&logoColor=white&logoSize=auto&label=OSI&color=%233DA639)](https://opensource.org/license/eupl-1-2) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/Bash-V5.2.15-white?style=plastic&logo=gnubash&logoColor=white&logoSize=auto&label=Bash&color=%234EAA25)](https://www.gnu.org/software/bash/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/Bash-V5.2.37-white?style=plastic&logo=gnubash&logoColor=white&logoSize=auto&label=Bash&color=%234EAA25)](https://www.gnu.org/software/bash/) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/shellcheck-passed-white?style=plastic&logo=gnubash&logoColor=white&logoSize=auto&label=shellcheck&color=%234EAA25)](https://shellcheck.net/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/shellcheck-passed-white?style=plastic&logo=gnubash&logoColor=white&logoSize=auto&label=shellcheck&color=%234EAA25)](https://shellcheck.net/) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/shellformat-passed-white?style=plastic&logo=google&logoColor=white&logoSize=auto&label=shellformat&color=%234285F4)](https://github.com/mvdan/sh) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/shellformat-passed-white?style=plastic&logo=google&logoColor=white&logoSize=auto&label=shellformat&color=%234285F4)](https://github.com/mvdan/sh) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/Shellstyle-Google-white?style=plastic&logo=google&logoColor=white&logoSize=auto&label=Shellstyle&color=%234285F4)](https://google.github.io/styleguide/shellguide.html) [![Static Badge](https://badges.coresecret.dev/badge/Shellstyle-Google-white?style=plastic&logo=google&logoColor=white&logoSize=auto&label=Shellstyle&color=%234285F4)](https://google.github.io/styleguide/shellguide.html)
&nbsp; &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/Gitea-1.24.5-white?style=plastic&logo=gitea&logoColor=white&logoSize=auto&label=gitea&color=%23609926)](https://docs.gitea.com/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/Gitea-1.24.7-white?style=plastic&logo=gitea&logoColor=white&logoSize=auto&label=gitea&color=%23609926)](https://docs.gitea.com/) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/IntelliJ-2025.2-white?style=plastic&logo=intellijidea&logoColor=white&logoSize=auto&label=IntelliJ&color=%23000000)](https://www.jetbrains.com/store/?section=personal&billing=yearly) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/IntelliJ-2025.2.4-white?style=plastic&logo=intellijidea&logoColor=white&logoSize=auto&label=IntelliJ&color=%23000000)](https://www.jetbrains.com/store/?section=personal&billing=yearly) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/keepassxc-2.7.10-white?style=plastic&logo=keepassxc&logoColor=white&logoSize=auto&label=KeePassXC&color=%236CAC4D)](https://keepassxc.org/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/keepassxc-2.7.10-white?style=plastic&logo=keepassxc&logoColor=white&logoSize=auto&label=KeePassXC&color=%236CAC4D)](https://keepassxc.org/) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/netcup-Netcup-white?style=plastic&logo=netcup&logoColor=white&logoSize=auto&label=powered&color=%23056473)](https://www.netcup.com/de) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/netcup-Netcup-white?style=plastic&logo=netcup&logoColor=white&logoSize=auto&label=powered&color=%23056473)](https://www.netcup.com/de) &nbsp;
[![Static Badge](https://badges.coresecret.dev/badge/powered-Centurion-white?style=plastic&logo=europeanunion&logoColor=white&logoSize=auto&label=powered&color=%230F243E)](https://coresecret.eu/) &nbsp; [![Static Badge](https://badges.coresecret.dev/badge/powered-Centurion-white?style=plastic&logo=europeanunion&logoColor=white&logoSize=auto&label=powered&color=%230F243E)](https://coresecret.eu/) &nbsp;

View File

@@ -12,12 +12,11 @@
### Contributions so far see ./docs/CREDITS.md ### Contributions so far see ./docs/CREDITS.md
# TODO: Implement this function 4215_check_crypttab.sh # TODO: Final warnings if interactive.
# TODO: Update .dot files. # TODO: Update .dot files.
# TODO: Update README.md for each lib and func dir. # TODO: Update README.md for each lib and func dir.
# TODO: Update MANPAGE.md for each func. # TODO: Update MANPAGE.md for each func.
# TODO: Implement Clang Build Chain and Secure Boot PK CISS.ROOT.CA Signing Workflow # TODO: Implement Clang Build Chain and Secure Boot PK CISS.ROOT.CA Signing Workflow
# TODO: Check Packages for installation. Refactor preseed.yaml, 4130_installation_toolset.sh, 4700_setup_packages.sh
# TODO: Hardening Scripts Integration # TODO: Hardening Scripts Integration
# TODO: Recovery Partition Integration # TODO: Recovery Partition Integration
# TODO: Grub Boot Menu Update for Recovery Integration # TODO: Grub Boot Menu Update for Recovery Integration
@@ -25,7 +24,7 @@
# TODO: Copying Log Files to final System # TODO: Copying Log Files to final System
# TODO: Integrate CISS.debian.installer calling arguments and preseed.yaml into CISS.debian.live.builder build chain? # TODO: Integrate CISS.debian.installer calling arguments and preseed.yaml into CISS.debian.live.builder build chain?
# TODO: Reboot function for Autoinstall, Clean Exit, Flush Logs, luksClose, umount # TODO: Reboot function for Autoinstall, Clean Exit, Flush Logs, luksClose, umount
# TODO: Implement loop_pass() for other passwords 0105_arg_nuke_converter.sh # TODO: Implement loop_pass() for other passwords 1257_yaml_xnuke.sh
# TODO: Implement / Integrate IP, Port validation CDI_1200 # TODO: Implement / Integrate IP, Port validation CDI_1200
### WHY BASH? ### WHY BASH?
@@ -106,12 +105,15 @@ declare -grx VAR_SETUP_FULL="$(cd "$(dirname "${0}")" && pwd)/${0##*/}" # '/opt
} }
### CHECK FOR CONTACT, HELP, AND VERSION STRING. ### CHECK FOR CONTACT, HELP, AND VERSION STRING.
# shellcheck disable=SC2249
for arg in "$@"; do case "${arg,,}" in -c|--contact) . ./meta_loader_cuv.sh; contact; exit 0;; esac; done for arg in "$@"; do case "${arg,,}" in -c|--contact) . ./meta_loader_cuv.sh; contact; exit 0;; esac; done
# shellcheck disable=SC2249
for arg in "$@"; do case "${arg,,}" in -h|--help) . ./meta_loader_cuv.sh; usage ; exit 0;; esac; done for arg in "$@"; do case "${arg,,}" in -h|--help) . ./meta_loader_cuv.sh; usage ; exit 0;; esac; done
# shellcheck disable=SC2249
for arg in "$@"; do case "${arg,,}" in -v|--version) . ./meta_loader_cuv.sh; version; exit 0;; esac; done for arg in "$@"; do case "${arg,,}" in -v|--version) . ./meta_loader_cuv.sh; version; exit 0;; esac; done
### SOURCING MUST SET EARLY VARIABLES. SOURCING COLOR_ECHO(), GUARD_SOURCING(), AND SOURCE_GUARD(). ### SOURCING MUST SET EARLY VARIABLES. SOURCING COLOR_ECHO(), guard_sourcing || return "${ERR_GUARD_SOURCE}"(), AND SOURCE_GUARD().
. ./lib/cdi_0005_guard/0005_guard_sourcing.sh # The function guard_sourcing MUST be present in each file to source. . ./lib/cdi_0005_guard/0005_guard_sourcing.sh # The function guard_sourcing || return "${ERR_GUARD_SOURCE}" MUST be present in each file to source.
. ./lib/cdi_0005_guard/0006_source_guard.sh # Wrapper for sourcing modules, libraries, variables. . ./lib/cdi_0005_guard/0006_source_guard.sh # Wrapper for sourcing modules, libraries, variables.
source_guard "./var/color.var.sh" source_guard "./var/color.var.sh"
source_guard "./var/early.var.sh" source_guard "./var/early.var.sh"
@@ -165,6 +167,7 @@ pre_scan_debug "$@"
### CHECK FOR AUTO INSTALL MODE. ### CHECK FOR AUTO INSTALL MODE.
color_echo "${GRE}" "CISS.DEBIAN.INSTALLER PREPARATION: CHECK FOR AUTO INSTALL MODE" color_echo "${GRE}" "CISS.DEBIAN.INSTALLER PREPARATION: CHECK FOR AUTO INSTALL MODE"
# shellcheck disable=SC2249
for arg in "$@"; do case "${arg,,}" in -a|--autoinstall) declare -gx VAR_AUTO_INSTALL="true";; esac; done; unset arg for arg in "$@"; do case "${arg,,}" in -a|--autoinstall) declare -gx VAR_AUTO_INSTALL="true";; esac; done; unset arg
### ACTIVATING TRAPS. ### ACTIVATING TRAPS.
@@ -195,171 +198,312 @@ arg_parser "$@"
info_echo "0103_arg_priority_check.sh" info_echo "0103_arg_priority_check.sh"
arg_priority_check arg_priority_check
### HASHING PASSWORDS.
info_echo "0105_arg_nuke_converter.sh"
nuke_passphrase
### CDI_1200
### CDI_1250 ### CDI_1250
info_echo "1250_yaml_parser.sh" info_echo "1250_yaml_parser.sh"
yaml_parser yaml_parser
info_echo "1251_yaml_reader.sh" info_echo "1251_yaml_reader.sh"
yaml_reader yaml_reader
info_echo "1252_yaml_validator.sh" info_echo "1252_yaml_validator.sh"
yaml_validator yaml_validator
info_echo "1256_yaml_xfiles.sh"
yaml_secret
info_echo "1257_yaml_xnuke.sh"
nuke_passphrase
### CDI_3200 ### CDI_3200
info_echo "3200_partitioning.sh" info_echo "3200_partitioning.sh"
partitioning partitioning
info_echo "3210_benchmarking_encryption.sh" info_echo "3210_benchmarking_encryption.sh"
benchmarking_encryption benchmarking_encryption
info_echo "3220_partition_encryption.sh" info_echo "3220_partition_encryption.sh"
partition_encryption partition_encryption
info_echo "3240_partition_formatting.sh" info_echo "3240_partition_formatting.sh"
partition_formatting partition_formatting
info_echo "3280_mount_partition.sh" info_echo "3280_mount_partition.sh"
mount_partition mount_partition
info_echo "3290_uuid_logger.sh" info_echo "3290_uuid_logger.sh"
uuid_logger uuid_logger
### CDI_4000 ### CDI_4000
info_echo "4000_debootstrap.sh" info_echo "4000_debootstrap.sh [${TARGET}]"
func_debootstrap func_debootstrap
info_echo "4005_debootstrap_checks.sh"
info_echo "4005_debootstrap_checks.sh [${TARGET}]"
check_debootstrap check_debootstrap
info_echo "4010_prepare_mounts.sh"
info_echo "4010_prepare_mounts.sh [${TARGET}]"
prepare_mounts prepare_mounts
info_echo "4015_check_usr_merge.sh"
info_echo "4011_prepare_xdg_root.sh [${TARGET}]"
prepare_xdg_root
info_echo "4015_check_usr_merge.sh [${TARGET}]"
check_usr_merge check_usr_merge
info_echo "4020_remove_x509.sh"
info_echo "4020_remove_x509.sh [${TARGET}]"
remove_x509 remove_x509
info_echo "4030_setup_hostname.sh"
info_echo "4030_setup_hostname.sh [${TARGET}]"
setup_hostname setup_hostname
info_echo "4035_setup_resolv.sh"
info_echo "4035_setup_resolv.sh [${TARGET}]"
setup_resolv setup_resolv
info_echo "4040_setup_timezone.sh"
info_echo "4040_setup_timezone.sh [${TARGET}]"
setup_timezone setup_timezone
info_echo "4050_setup_locales.sh"
info_echo "4050_setup_locales.sh [${TARGET}]"
setup_locales setup_locales
### CDI_4100 ### CDI_4100
if [[ "${VAR_DEB822}" == "true" ]]; then if [[ "${VAR_DEB822}" == "true" ]]; then
info_echo "4105_generate_sources822.sh"
info_echo "4105_generate_sources822.sh [${TARGET}]"
generate_sources822 generate_sources822
else else
info_echo "4100_generate_sources.sh"
info_echo "4100_generate_sources.sh [${TARGET}]"
generate_sources generate_sources
fi fi
info_echo "4110_update_sources.sh"
info_echo "4110_update_sources.sh [${TARGET}]"
update_sources update_sources
info_echo "4120_installation_kernel.sh"
info_echo "4120_installation_kernel.sh [${TARGET}]"
installation_kernel installation_kernel
info_echo "4121_installation_initramfs.sh"
info_echo "4121_installation_initramfs.sh [${TARGET}]"
installation_initramfs installation_initramfs
info_echo "4130_installation_toolset.sh"
info_echo "4130_installation_toolset.sh [${TARGET}]"
installation_toolset installation_toolset
info_echo "4131_installation_systemd.sh"
info_echo "4131_installation_systemd.sh [${TARGET}]"
installation_systemd installation_systemd
info_echo "4132_installation_machineid.sh"
info_echo "4132_installation_machineid.sh [${TARGET}]"
installation_machineid installation_machineid
info_echo "4133_installation_masking.sh"
info_echo "4133_installation_masking.sh [${TARGET}]"
installation_masking installation_masking
info_echo "4140_installation_microcode.sh"
info_echo "4140_installation_microcode.sh [${TARGET}]"
installation_microcode installation_microcode
info_echo "4145_installation_firmware.sh"
info_echo "4145_installation_firmware.sh [${TARGET}]"
installation_firmware installation_firmware
info_echo "4150_installation_chrony.sh"
info_echo "4150_installation_chrony.sh [${TARGET}]"
installation_chrony installation_chrony
info_echo "4160_installation_eza.sh"
info_echo "4160_installation_eza.sh [${TARGET}]"
installation_eza installation_eza
info_echo "4170_installation_lynis.sh"
info_echo "4170_installation_lynis.sh [${TARGET}]"
installation_lynis installation_lynis
### CDI_4200 ### CDI_4200
info_echo "4200_generate_fstab.sh" info_echo "4200_generate_fstab.sh [${TARGET}]"
generate_fstab generate_fstab
info_echo "4205_check_fstab.sh"
info_echo "4205_check_fstab.sh [${TARGET}]"
check_fstab check_fstab
info_echo "4210_generate_crypttab.sh"
info_echo "4210_generate_crypttab.sh [${TARGET}]"
generate_crypttab generate_crypttab
info_echo "4215_check_crypttab.sh"
check_crypttab info_echo "4220_installation_cryptsetup.sh [${TARGET}]"
info_echo "4220_installation_cryptsetup.sh"
installation_cryptsetup installation_cryptsetup
info_echo "4230_installation_grub.sh"
info_echo "4230_installation_grub.sh [${TARGET}]"
installation_grub installation_grub
if [[ "${VAR_GRUB_PASSWORD}" == "true" ]]; then if [[ "${VAR_GRUB_PASSWORD}" == "true" ]]; then
info_echo "4240_update_grub_password.sh"
info_echo "4240_update_grub_password.sh [${TARGET}]"
update_grub_password update_grub_password
fi fi
info_echo "4250_update_grub_bootparameter.sh"
info_echo "4250_update_grub_bootparameter.sh [${TARGET}]"
update_grub_bootparameter update_grub_bootparameter
### CDI_4300 ### CDI_4300
info_echo "4300_installation_network.sh" info_echo "4300_installation_network.sh [${TARGET}]"
installation_network installation_network
info_echo "4305_installation_netsec.sh"
info_echo "4305_installation_netsec.sh [${TARGET}]"
installation_netsec installation_netsec
if [[ "${VAR_DROPBEAR}" == "true" ]]; then if [[ "${VAR_DROPBEAR}" == "true" ]]; then
info_echo "4310_dropbear_build.sh"
info_echo "4310_dropbear_build.sh [${TARGET}]"
dropbear_build dropbear_build
info_echo "4311_dropbear_initramfs.sh"
info_echo "4311_dropbear_initramfs.sh [${TARGET}]"
dropbear_initramfs dropbear_initramfs
info_echo "4312_dropbear_setup.sh"
info_echo "4312_dropbear_setup.sh [${TARGET}]"
dropbear_setup dropbear_setup
fi fi
info_echo "4320_update_initramfs.sh"
info_echo "4320_update_initramfs.sh [${TARGET}]"
update_initramfs update_initramfs
info_echo "4330_installation_ssh.sh"
info_echo "4330_installation_ssh.sh [${TARGET}]"
installation_ssh installation_ssh
### CDI_4400 ### CDI_4400
info_echo "4400_kernel_modules.sh" info_echo "4400_kernel_modules.sh [${TARGET}]"
kernel_modules && kernel_modprobe kernel_modules && kernel_modprobe
info_echo "4410_kernel_sysctl.sh"
info_echo "4410_kernel_sysctl.sh [${TARGET}]"
kernel_sysctl kernel_sysctl
info_echo "4420_hardening_fail2ban.sh"
info_echo "4420_hardening_fail2ban.sh [${TARGET}]"
hardening_fail2ban hardening_fail2ban
info_echo "4430_hardening_files.sh"
info_echo "4430_hardening_files.sh [${TARGET}]"
hardening_files hardening_files
info_echo "4440_hardening_haveged.sh"
hardening_haveged info_echo "4442_hardening_jitterentropy.sh [${TARGET}]"
info_echo "4450_hardening_memory.sh" hardening_jitterentropy
info_echo "4450_hardening_memory.sh [${TARGET}]"
hardening_memory hardening_memory
info_echo "4460_hardening_openssl.sh"
info_echo "4460_hardening_openssl.sh [${TARGET}]"
hardening_openssl hardening_openssl
info_echo "4470_hardening_ufw.sh"
info_echo "4470_hardening_ufw.sh [${TARGET}]"
hardening_ufw hardening_ufw
info_echo "4480_hardening_usb.sh"
info_echo "4480_hardening_usb.sh [${TARGET}]"
hardening_usb hardening_usb
info_echo "4490_hardening_virus.sh [${TARGET}]"
hardening_virus
info_echo "4445_hardening_logrotate.sh [${TARGET}]"
hardening_logrotate
### CDI_4500 ### CDI_4500
info_echo "4500_accounts_preparation.sh" info_echo "4500_accounts_preparation.sh [${TARGET}]"
accounts_preparation accounts_preparation
info_echo "4510_accounts_hardening.sh"
info_echo "4510_accounts_hardening.sh [${TARGET}]"
accounts_hardening accounts_hardening
info_echo "4520_accounts_setup.sh"
info_echo "4520_accounts_setup.sh [${TARGET}]"
accounts_setup accounts_setup
info_echo "4530_accounts_timings.sh [${TARGET}]"
update_shadow
### CDI_4600 ### CDI_4600
#info_echo "4205_check_fstab.sh" info_echo "4600_installation_packages.sh [${TARGET}]"
installation_packages
#info_echo "4610_finalize_system.sh" info_echo "4610_installation_security.sh [${TARGET}]"
installation_security
#info_echo "4670_verify_system.sh" info_echo "4620_installation_verification.sh [${TARGET}]"
install_verification
#info_echo "4680_check_sshd_config_integrity.sh" info_echo "4630_auditing_packages.sh [${TARGET}]"
auditing_packages
#info_echo "4690_check_grub_cmdline.sh" ### CDI_4900
info_echo "4900_final_command.sh [${TARGET}]"
final_commands
### CDI_4700 info_echo "4950_final_logrotate.sh [${TARGET}]"
info_echo "4799_exiting_chroot_system.sh" final_logrotate
info_echo "4999_exiting_chroot_system.sh [${TARGET}]"
exiting_chroot_system exiting_chroot_system
### CDI_5000 ### CDI_5000
if [[ "${VAR_RECOVERY}" == "true" ]]; then if [[ "${VAR_RECOVERY}" == "true" ]]; then
wrapper_recovery
declare -gx VAR_RUN_RECOVERY="true"
info_echo "4000_debootstrap.sh [${RECOVERY}]"
func_debootstrap
info_echo "4005_debootstrap_checks.sh [${RECOVERY}]"
check_debootstrap
info_echo "4010_prepare_mounts.sh [${RECOVERY}]"
prepare_mounts
info_echo "4015_check_usr_merge.sh [${RECOVERY}]"
check_usr_merge
info_echo "4020_remove_x509.sh [${RECOVERY}]"
remove_x509
info_echo "4030_setup_hostname.sh [${RECOVERY}]"
setup_hostname
info_echo "4035_setup_resolv.sh [${RECOVERY}]"
setup_resolv
info_echo "4040_setup_timezone.sh [${RECOVERY}]"
setup_timezone
info_echo "4050_setup_locales.sh [${RECOVERY}]"
setup_locales
info_echo "4105_generate_sources_822.sh [${RECOVERY}]"
generate_sources822
info_echo "4110_update_sources.sh [${RECOVERY}]"
update_sources
info_echo "5120_installation_kernel.sh [${RECOVERY}]"
installation_kernel_reco
info_echo "5121_installation_initramfs.sh"
installation_initramfs_reco
info_echo "5130_installation_toolset.sh"
installation_toolset_reco
info_echo "5131_installation_systemd.sh"
installation_systemd_reco
info_echo "5132_installation_machineid.sh"
installation_machineid_reco
info_echo "5133_installation_masking.sh"
installation_masking_reco
info_echo "5999_exiting_chroot_recovery.sh"
exiting_chroot_recovery
declare -gx VAR_RUN_RECOVERY="false"
fi fi
### Dialog Output for Initialization END ### Dialog Output for Initialization END

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Specify the network interface card (NIC) interactively for setup. # Specify the network interface card (NIC) interactively for setup.
@@ -39,6 +39,9 @@ check_nic() {
clear clear
do_log "info" "file_only" "1030() You have selected: '${var_nic}' - proceeding with setup." do_log "info" "file_only" "1030() You have selected: '${var_nic}' - proceeding with setup."
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f check_nic
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Use chroot_exec() for: # Use chroot_exec() for:
@@ -81,6 +81,9 @@ chroot_exec() {
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f chroot_exec
####################################### #######################################
# Run a complete shell script line inside the chroot using the command 'bash -c'. # Run a complete shell script line inside the chroot using the command 'bash -c'.
@@ -133,12 +136,17 @@ chroot_script() {
if [[ "${VAR_CHROOT_DEBUG}" == "true" ]]; then if [[ "${VAR_CHROOT_DEBUG}" == "true" ]]; then
if [[ "${VAR_DEBUG_TRACE}" == "true" || "${VAR_DEBUG_TRAP}" == "true" ]]; then dump_vars_exiting; fi if [[ "${VAR_DEBUG_TRACE}" == "true" || "${VAR_DEBUG_TRAP}" == "true" ]]; then\
dump_vars_exiting
fi
case "${VAR_IN_DIALOG_WR}" in case "${VAR_IN_DIALOG_WR}" in
box ) dialog_box_cleaner ;; box ) dialog_box_cleaner ;;
gauge ) dialog_gauge_cleaner ;; gauge ) dialog_gauge_cleaner ;;
text ) dialog_text_cleaner ;; text ) dialog_text_cleaner ;;
* ) : ;;
esac esac
do_log "emergency" "tty" "1080() Launching interactive debug shell in chroot: '${var_chroot_target}'." do_log "emergency" "tty" "1080() Launching interactive debug shell in chroot: '${var_chroot_target}'."
@@ -158,6 +166,9 @@ chroot_script() {
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f chroot_script
####################################### #######################################
# Run the installer-desired code incl. positional arguments via stdin (HEREDOC) inside the chroot with bash -s. # Run the installer-desired code incl. positional arguments via stdin (HEREDOC) inside the chroot with bash -s.
@@ -178,9 +189,9 @@ chroot_script() {
####################################### #######################################
chroot_stdin() { chroot_stdin() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_chroot_target="$1"; shift ### consume TARGET declare var_chroot_target="$1"; shift ### Consume 'TARGET'.
declare payload_marker="$1"; shift ### consume marker (e.g. "__payload__") declare payload_marker="$1"; shift ### Consume marker (e.g. "__payload__").
declare var_log_level_on_error="emergency" ### default declare var_log_level_on_error="emergency" ### Default.
declare var_default_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" declare var_default_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare var_mod="${BASH_SOURCE[1]##*/}"; var_mod="${var_mod%%_*}()" declare var_mod="${BASH_SOURCE[1]##*/}"; var_mod="${var_mod%%_*}()"
@@ -223,12 +234,17 @@ chroot_stdin() {
if [[ "${VAR_CHROOT_DEBUG}" == "true" ]]; then if [[ "${VAR_CHROOT_DEBUG}" == "true" ]]; then
if [[ "${VAR_DEBUG_TRACE}" == "true" || "${VAR_DEBUG_TRAP}" == "true" ]]; then dump_vars_exiting; fi if [[ "${VAR_DEBUG_TRACE}" == "true" || "${VAR_DEBUG_TRAP}" == "true" ]]; then
dump_vars_exiting
fi
case "${VAR_IN_DIALOG_WR}" in case "${VAR_IN_DIALOG_WR}" in
box ) dialog_box_cleaner ;; box ) dialog_box_cleaner ;;
gauge ) dialog_gauge_cleaner ;; gauge ) dialog_gauge_cleaner ;;
text ) dialog_text_cleaner ;; text ) dialog_text_cleaner ;;
* ) : ;;
esac esac
do_log "emergency" "tty" "1080() Launching interactive debug shell in chroot: '${var_chroot_target}'." do_log "emergency" "tty" "1080() Launching interactive debug shell in chroot: '${var_chroot_target}'."
@@ -248,4 +264,7 @@ chroot_stdin() {
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f chroot_stdin
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -13,7 +13,7 @@
### Options in "GRUB_CMDLINE_LINUX" are always effective. ### Options in "GRUB_CMDLINE_LINUX" are always effective.
### Options in "GRUB_CMDLINE_LINUX_DEFAULT" are effective ONLY during normal boot (NOT during recovery mode). ### Options in "GRUB_CMDLINE_LINUX_DEFAULT" are effective ONLY during normal boot (NOT during recovery mode).
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Helper module to extract the current GRUB CMDLINE strings. # Helper module to extract the current GRUB CMDLINE strings.
@@ -98,6 +98,9 @@ grub_extract_current_string() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f grub_extract_current_string
####################################### #######################################
# Helper module to finish the modified GRUB CMDLINE strings. # Helper module to finish the modified GRUB CMDLINE strings.
@@ -146,4 +149,7 @@ EOF
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f grub_finalize_string
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Wrapper for preparing logfile inside chroot. # Wrapper for preparing logfile inside chroot.
@@ -28,6 +28,9 @@ chroot_logger() {
chmod 0600 "${var_logfile}" || "${ERR_CHROOT_LOGGER}" chmod 0600 "${var_logfile}" || "${ERR_CHROOT_LOGGER}"
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f chroot_logger
####################################### #######################################
# Helper Module to generate a Subnet Mask out of an IP in CCDIR Notation. # Helper Module to generate a Subnet Mask out of an IP in CCDIR Notation.
@@ -50,6 +53,9 @@ generate_subnetmask() {
printf '%s' "${var_has_ipv4_subnet}" printf '%s' "${var_has_ipv4_subnet}"
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_subnetmask
####################################### #######################################
# Collect NIC driver modules for initramfs installation (no lspci required). # Collect NIC driver modules for initramfs installation (no lspci required).
@@ -92,7 +98,9 @@ grep_nic_driver_modules() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f grep_nic_driver_modules
####################################### #######################################
# Wrapper to insert the metadata field into the specified file. # Wrapper to insert the metadata field into the specified file.
@@ -128,6 +136,9 @@ insert_comments() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f insert_comments
####################################### #######################################
# Wrapper to insert the SPDX Header into the specified file. # Wrapper to insert the SPDX Header into the specified file.
@@ -160,11 +171,18 @@ EOF
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f insert_header
####################################### #######################################
# Helper module for update, full dist-upgrade, autoclean, autopurge and autoremove. # Helper module for update, full dist-upgrade, autoclean, autopurge and autoremove.
# Globals:
# None
# Arguments: # Arguments:
# None # None
# Returns:
# 0: on success
####################################### #######################################
update_upgrade() { update_upgrade() {
apt-get update apt-get update
@@ -172,5 +190,9 @@ update_upgrade() {
apt-get autoclean -y apt-get autoclean -y
apt-get autopurge -y apt-get autopurge -y
apt-get autoremove -y apt-get autoremove -y
return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f update_upgrade
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Remove any leading or trailing whitespace. # Remove any leading or trailing whitespace.
@@ -22,6 +22,9 @@ remove_whitespace() {
declare var_out=$(printf "%s" "$1" | xargs) declare var_out=$(printf "%s" "$1" | xargs)
printf '%s' "${var_out}" printf '%s' "${var_out}"
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f remove_whitespace
####################################### #######################################
# Function to escape all shell metacharacters # Function to escape all shell metacharacters
@@ -33,6 +36,9 @@ sanitize_input() {
### %q quotes the string so that the shell re-reads it as the original literal ### %q quotes the string so that the shell re-reads it as the original literal
printf '%q' "${input}" printf '%q' "${input}"
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f sanitize_input
####################################### #######################################
# Function to remove any character not in the allowed set # Function to remove any character not in the allowed set
@@ -46,4 +52,7 @@ sanitize_string() {
declare allowed='a-zA-Z0-9._/=\[\]:"\-+ ' declare allowed='a-zA-Z0-9._/=\[\]:"\-+ '
printf '%s' "${input}" | tr -cd "${allowed}" printf '%s' "${input}" | tr -cd "${allowed}"
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f sanitize_string
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Wrapper for secure curl. # Wrapper for secure curl.
@@ -42,6 +42,9 @@ scurl() {
return "${ERR_DOWNLOAD_FAILED}" return "${ERR_DOWNLOAD_FAILED}"
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f scurl
####################################### #######################################
# Wrapper for secure wget. # Wrapper for secure wget.
@@ -73,4 +76,7 @@ swget() {
return "${ERR_DOWNLOAD_FAILED}" return "${ERR_DOWNLOAD_FAILED}"
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f swget
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,10 +10,12 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# yq_val <YQ expression> <file> - Returns value, converts null to "" # yq_val <YQ expression> <file> - Returns value, converts null to "".
# Globals:
# None
# Arguments: # Arguments:
# 1: Key String to evaluate # 1: Key String to evaluate
# 2: YAML File # 2: YAML File
@@ -23,4 +25,7 @@ yq_val() {
[[ "${var_h}" == null ]] && var_h="" [[ "${var_h}" == null ]] && var_h=""
printf '%s' "${var_h}" printf '%s' "${var_h}"
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f yq_val
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,15 +10,13 @@ include_toc: true
**Master Version**: 8.00<br> **Master Version**: 8.00<br>
**Build**: V8.00.000.2025.06.17<br> **Build**: V8.00.000.2025.06.17<br>
# 2. [1080_helper_chroot.sh](1080_helper_chroot.sh) # 2. [1080_helper_chroot.sh](../1080_helper_chroot.sh)
**Scope:** This note explains *what to use when* among **Scope:** This note explains *what to use when* among
* `chroot_exec()`, * `chroot_exec()`,
* `chroot_script()`, and * `chroot_script()`, and
* `chroot_stdin()`. * `chroot_stdin()`.
## 2.1. When to use what ## 2.1. When to use what
- **`chroot_exec (target, argv...)`** — *Simple, argv-style commands.* - **`chroot_exec (target, argv...)`** — *Simple, argv-style commands.*
Use it whenever you type a short command with discrete arguments (no shell features). Use it whenever you type a short command with discrete arguments (no shell features).
Examples from the updated user provisioning flow: `getent`, `groupadd`, `useradd`, `usermod`, `chsh`. Examples from the updated user provisioning flow: `getent`, `groupadd`, `useradd`, `usermod`, `chsh`.
@@ -79,7 +77,6 @@ and are harder to lint. Prefer `chroot_stdin` for larger edits.
surprises and keep editors/IDEs happy. surprises and keep editors/IDEs happy.
## 2.3. Common foundation across all helpers ## 2.3. Common foundation across all helpers
- **Minimal, controlled environment via `env -i`**, whitelisting only the necessities (`HOME`, `PATH`, `TERM`, `LANG/LC_ALL`, - **Minimal, controlled environment via `env -i`**, whitelisting only the necessities (`HOME`, `PATH`, `TERM`, `LANG/LC_ALL`,
noninteractive APT vars). This blocks noisy caller environments from leaking into the chroot and keeps behavior reproducible noninteractive APT vars). This blocks noisy caller environments from leaking into the chroot and keeps behavior reproducible
across systems. across systems.
@@ -88,7 +85,6 @@ and are harder to lint. Prefer `chroot_stdin` for larger edits.
- **Structured logging** for both success and failure paths, and an **interactive debug shell** when requested by the debug flags. - **Structured logging** for both success and failure paths, and an **interactive debug shell** when requested by the debug flags.
## 2.4. Decision guide ## 2.4. Decision guide
- **Is it a single command with clean argv?**`chroot_exec`. - **Is it a single command with clean argv?**`chroot_exec`.
- **Is it a short shell line with redirection/pipe/env assignment?**`chroot_script`. - **Is it a short shell line with redirection/pipe/env assignment?**`chroot_script`.
- **Is it long, quote-heavy, or multi-line logic?**`chroot_stdin` with a single-quoted heredoc. - **Is it long, quote-heavy, or multi-line logic?**`chroot_stdin` with a single-quoted heredoc.
@@ -97,7 +93,6 @@ If in doubt, start with `chroot_exec`. The moment you need a shell feature, jump
past comfort (readability, quoting, or length), upgrade to `chroot_stdin`. past comfort (readability, quoting, or length), upgrade to `chroot_stdin`.
## 2.5. Subtleties and gotchas (and how the helpers address them) ## 2.5. Subtleties and gotchas (and how the helpers address them)
- **ARG_MAX and long `-c` strings:** `bash -c` places the entire script in `argv`. On typical Linux systems you effectively have - **ARG_MAX and long `-c` strings:** `bash -c` places the entire script in `argv`. On typical Linux systems you effectively have
≈2 MiB for argv+env; very long strings or large environments hit `E2BIG`. `bash -s` (stdin) avoids this entirely. ≈2 MiB for argv+env; very long strings or large environments hit `E2BIG`. `bash -s` (stdin) avoids this entirely.
@@ -114,14 +109,12 @@ past comfort (readability, quoting, or length), upgrade to `chroot_stdin`.
is enabled, enabling immediate forensics inside the target environment. is enabled, enabling immediate forensics inside the target environment.
## 2.6. Antipatterns (what to avoid) ## 2.6. Antipatterns (what to avoid)
- **Using `chroot_exec` for anything involving the shell.** That defeats the argv-only contract and will either fail or behave unexpectedly. - **Using `chroot_exec` for anything involving the shell.** That defeats the argv-only contract and will either fail or behave unexpectedly.
- **Packing large scripts into `-c` strings.** Hard to quote, hits argv limits, and clutters process lists. Prefer stdin. - **Packing large scripts into `-c` strings.** Hard to quote, hits argv limits, and clutters process lists. Prefer stdin.
- **Relying on the callers ambient environment.** The helpers intentionally use `env -i` to avoid such a leakage; do not - **Relying on the callers ambient environment.** The helpers intentionally use `env -i` to avoid such a leakage; do not
reintroduce it unless you must. reintroduce it unless you must.
# 3. Appendix — Helper signatures & guarantees # 3. Appendix — Helper signatures & guarantees
- **`chroot_exec(target, argv...)`** - **`chroot_exec(target, argv...)`**
- Preflights the binary using `which` inside the chroot; fails early if missing. - Preflights the binary using `which` inside the chroot; fails early if missing.
- Runs with a minimal, deterministic environment. - Runs with a minimal, deterministic environment.

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Checks if a search pattern / string / value is present in an array. # Checks if a search pattern / string / value is present in an array.
@@ -31,4 +31,7 @@ validation_array() {
done done
return 1 return 1
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validation_array
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,12 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# IPv4 validation. # IPv4 validation.
# Globals: # Globals:
# ERR_INVALID_IPV4 # None
# Arguments: # Arguments:
# 1: IPv4 to validate. # 1: IPv4 to validate.
# Returns: # Returns:
@@ -30,6 +30,9 @@ validation_ipv4() {
return "${ERR_INVALID_IPV4}" return "${ERR_INVALID_IPV4}"
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validation_ipv4
####################################### #######################################
# IPv6 validation, including # IPv6 validation, including
@@ -38,7 +41,7 @@ validation_ipv4() {
# - Addresses with embedded IPv4 addresses like ::ffff:192.0.2.128 # - Addresses with embedded IPv4 addresses like ::ffff:192.0.2.128
# - Link-local addresses like fe80::1%eth0 # - Link-local addresses like fe80::1%eth0
# Globals: # Globals:
# ERR_INVALID_IPV6 # None
# Arguments: # Arguments:
# 1: IPv6 address # 1: IPv6 address
# Returns: # Returns:
@@ -88,11 +91,14 @@ validation_ipv6() {
### Success ### Success
do_log "info" "file_only" "'${var_ip}' seems to be a valid IPv6." do_log "info" "file_only" "'${var_ip}' seems to be a valid IPv6."
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validation_ipv6
####################################### #######################################
# Port validation. # Port validation.
# Globals: # Globals:
# ERR_INVALID_PORT # None
# Arguments: # Arguments:
# 1: Port number # 1: Port number
# Returns: # Returns:
@@ -107,4 +113,7 @@ validation_port() {
return "${ERR_INVALID_PORT}" return "${ERR_INVALID_PORT}"
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validation_port
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Validate all preseed network variables (IPv4 & IPv6) # Validate all preseed network variables (IPv4 & IPv6)
@@ -60,4 +60,7 @@ validation_preseed() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validation_preseed
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Parsing './.preseed/preseed.yaml' and './.preseed/partitioning.yaml'. # Parsing './.preseed/preseed.yaml' and './.preseed/partitioning.yaml'.
@@ -44,28 +44,36 @@ yaml_parser() {
### Generate Arrays for [Grub Parameter], [Locales], [NTPSec Server FQDN], [Software Packages]. ### Generate Arrays for [Grub Parameter], [Locales], [NTPSec Server FQDN], [Software Packages].
while IFS='=' read -r var_key var_value; do while IFS='=' read -r var_key var_value; do
var_value=${var_value#\'} var_value=${var_value#\'}
var_value=${var_value%\'} var_value=${var_value%\'}
# shellcheck disable=SC2034
# shellcheck disable=SC2034,SC2249
case "${var_key}" in case "${var_key}" in
grub_parameter_[0-9]*) ARY_BOOTPARAM+=("${var_value}") ;; grub_parameter_[0-9]*) ARY_BOOTPARAM+=("${var_value}") ;;
locale_locale_[0-9]*) ARY_LOCALE+=("${var_value}") ;; locale_locale_[0-9]*) ARY_LOCALE+=("${var_value}") ;;
ntp_server_[0-9]*) ARY_NTPSRVR+=("${var_value}") ;; ntp_server_[0-9]*) ARY_NTPSRVR+=("${var_value}") ;;
ssh_allow_ipv4_[0-9]*) ARY_ALLOW_IPV4+=("${var_value}") ;; ssh_allow_ipv4_[0-9]*) ARY_ALLOW_IPV4+=("${var_value}") ;;
ssh_allow_ipv6_[0-9]*) ARY_ALLOW_IPV6+=("${var_value}") ;; ssh_allow_ipv6_[0-9]*) ARY_ALLOW_IPV6+=("${var_value}") ;;
software_[0-9]*) ARY_PACKAGES+=("${var_value}") ;; software_[0-9]*) ARY_PACKAGES+=("${var_value}") ;;
esac esac
done < "${VAR_PRESEED}" done < "${VAR_PRESEED}"
var_key="" var_key=""
### Search all set variables for user_userN_name patterns. ### Search all set variables for user_userN_name patterns.
# shellcheck disable=SC2312 # shellcheck disable=SC2312
while IFS='=' read -r var_key _; do while IFS='=' read -r var_key _; do
### Accept any of these keys: name, fullname, uid, gid, shell, password, sshpubkey, authentication_* and privileges_* ### Accept any of these keys: name, fullname, uid, gid, shell, password, sshpubkey, authentication_* and privileges_*
if [[ "${var_key}" =~ ^user_user([0-9]+)_(name|fullname|uid|gid|shell|password|sshpubkey|authentication_[A-Za-z0-9_]+|privileges_[A-Za-z0-9_]+)$ ]]; then if [[ "${var_key}" =~ ^user_user([0-9]+)_(name|fullname|uid|gid|shell|password|sshpubkey|authentication_[A-Za-z0-9_]+|privileges_[A-Za-z0-9_]+)$ ]]; then
var_index=${BASH_REMATCH[1]} var_index=${BASH_REMATCH[1]}
(( var_index > VAR_USER_MAX )) && VAR_USER_MAX=var_index (( var_index > VAR_USER_MAX )) && VAR_USER_MAX=var_index
fi fi
done < "${VAR_PRESEED}" done < "${VAR_PRESEED}"
### If nothing matched, default to 0 (only user 0). ### If nothing matched, default to 0 (only user 0).
@@ -87,11 +95,14 @@ yaml_parser() {
# --- Quote unquoted values ------------------------------------------- # --- Quote unquoted values -------------------------------------------
s/^(.*)=([^'\''"]+)/\1='\''\2'\''/ # wrap value in single quotes s/^(.*)=([^'\''"]+)/\1='\''\2'\''/ # wrap value in single quotes
' "${VAR_PRESEED}" ' "${VAR_PRESEED}"
# shellcheck disable=SC1090 # shellcheck disable=SC1090
. "${VAR_PRESEED}" . "${VAR_PRESEED}"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f yaml_parser
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,31 +10,38 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Reading and extracting variables from "${PRESEED}". # Reading and extracting variables from "${PRESEED}".
# Globals: # Globals:
# BASH_REMATCH # BASH_REMATCH
# HMP_RECIPE_DEV_PARTITIONS # HMP_RECIPE_DEV_PARTITIONS
# VAR_ARCHITECTURE # VAR_APT_FULL_UPGRADE VAR_ARCHITECTURE
# VAR_CODENAME # VAR_CHROOT_DEBUG VAR_CODENAME
# VAR_NEED_RUN_IN_TARGET # VAR_DEB822 VAR_DROPBEAR
# VAR_NUKE # VAR_GRUB_PASSWORD VAR_LUKS_BACKUP
# VAR_PRESEED # VAR_LUKS_PGP VAR_LUKS_URL
# VAR_RECIPE_FIRMWARE # VAR_NEED_RUN_IN_TARGET VAR_NUKE
# VAR_RECIPE_HIGHEST_DEVICE # VAR_NUKE_ROUNDS VAR_PRESEED
# VAR_RECIPE_STRING # VAR_PROVIDER VAR_RECIPE_FIRMWARE
# VAR_RECIPE_TABLE # VAR_RECIPE_HIGHEST_DEVICE VAR_RECIPE_STRING
# VAR_RECOVERY # VAR_RECIPE_TABLE VAR_RECOVERY
# architecture # VAR_SEC_FW VAR_SSH_CA
# distribution # VAR_SSH_PORT VAR_UFW_OUT
# needrun # VAR_USER_ROOT_SPECIFIC
# apt_default_deb822 apt_full_upgrade
# architecture chroot_debug
# distribution dropbear_boot
# grub_password needrun
# provider security_ext
# security_ufw_out ssh_port
# ssh_root_ca user_root_specific
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_NO_VALID_RECIPE # ERR_NO_VALID_RECIPE: on failure
####################################### #######################################
yaml_reader() { yaml_reader() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -43,11 +50,13 @@ yaml_reader() {
declare -gx VAR_RECIPE_STRING="" VAR_RECIPE_HIGHEST_DEVICE="" VAR_ARCHITECTURE="" VAR_RECIPE_FIRMWARE="" VAR_NUKE="" \ declare -gx VAR_RECIPE_STRING="" VAR_RECIPE_HIGHEST_DEVICE="" VAR_ARCHITECTURE="" VAR_RECIPE_FIRMWARE="" VAR_NUKE="" \
VAR_RECIPE_TABLE="" VAR_NEED_RUN_IN_TARGET="false" VAR_CODENAME="" VAR_DROPBEAR="" VAR_RECOVERY="" \ VAR_RECIPE_TABLE="" VAR_NEED_RUN_IN_TARGET="false" VAR_CODENAME="" VAR_DROPBEAR="" VAR_RECOVERY="" \
VAR_GRUB_PASSWORD="false" VAR_SSH_PORT="22" VAR_DEB822="true" VAR_PROVIDER="" VAR_SSH_CA="" VAR_UFW_OUT="deny" \ VAR_GRUB_PASSWORD="false" VAR_SSH_PORT="22" VAR_DEB822="true" VAR_PROVIDER="" VAR_SSH_CA="" VAR_UFW_OUT="deny" \
VAR_CHROOT_DEBUG="false" VAR_CHROOT_DEBUG="false" VAR_SEC_FW="selinux" VAR_APT_FULL_UPGRADE="true" VAR_LUKS_BACKUP="false" \
VAR_LUKS_URL="" VAR_LUKS_PGP="" VAR_USER_ROOT_SPECIFIC=""
### Declare and substitute input files. ### Declare and substitute input files.
declare -r var_if="${VAR_PRESEED}" declare -r var_if="${VAR_PRESEED}"
declare var_line="" var_middle_part="" var_highest_dev="" var_device="" var_fields="" var_partition="" \ declare var_line="" var_middle_part="" var_highest_dev="" var_device="" var_fields="" var_partition="" \
recipe_firmware_var="" recipe_nuke_var="" recipe_nuke_rounds_var="" recipe_table_var="" recipe_recovery_var="" recipe_firmware_var="" recipe_nuke_var="" recipe_nuke_rounds_var="" recipe_table_var="" recipe_recovery_var="" \
recipe_luks_var="" recipe_luks_url="" recipe_luks_pgp=""
### Read "${var_if}" line by line. ### Read "${var_if}" line by line.
while IFS= read -r var_line; do while IFS= read -r var_line; do
@@ -143,6 +152,10 @@ END { print max }
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VAR_DEB822="${apt_default_deb822,,}" VAR_DEB822="${apt_default_deb822,,}"
### Extract Upgrade Policy.
# shellcheck disable=SC2034
VAR_APT_FULL_UPGRADE="${apt_full_upgrade,,}"
### Extract architecture. ### Extract architecture.
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VAR_ARCHITECTURE="${architecture,,}" VAR_ARCHITECTURE="${architecture,,}"
@@ -179,6 +192,19 @@ END { print max }
recipe_firmware_var="recipe_${VAR_RECIPE_STRING}_control_firmware" recipe_firmware_var="recipe_${VAR_RECIPE_STRING}_control_firmware"
VAR_RECIPE_FIRMWARE="${!recipe_firmware_var,,}" VAR_RECIPE_FIRMWARE="${!recipe_firmware_var,,}"
### Extract the chosen LUKS Backup strategy.
recipe_luks_var="recipe_${VAR_RECIPE_STRING}_control_luks_backup"
# shellcheck disable=SC2034
VAR_LUKS_BACKUP="${!recipe_luks_var,,}"
recipe_luks_pgp="recipe_${VAR_RECIPE_STRING}_control_luks_backup_pgp"
# shellcheck disable=SC2034
VAR_LUKS_PGP="${!recipe_luks_pgp,,}"
recipe_luks_url="recipe_${VAR_RECIPE_STRING}_control_luks_backup_url"
# shellcheck disable=SC2034
VAR_LUKS_URL="${!recipe_luks_url,,}"
### Extract the chosen Nuke mechanism. ### Extract the chosen Nuke mechanism.
recipe_nuke_var="recipe_${VAR_RECIPE_STRING}_control_nuke" recipe_nuke_var="recipe_${VAR_RECIPE_STRING}_control_nuke"
# shellcheck disable=SC2034 # shellcheck disable=SC2034
@@ -220,10 +246,21 @@ END { print max }
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VAR_RECOVERY="${!recipe_recovery_var,,}" VAR_RECOVERY="${!recipe_recovery_var,,}"
### Extract security extensions.
# shellcheck disable=SC2034
VAR_SEC_FW="${security_ext,,}"
### Extract ufw outgoing policy. ### Extract ufw outgoing policy.
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VAR_UFW_OUT="${security_ufw_out,,}" VAR_UFW_OUT="${security_ufw_out,,}"
guard_dir && return 0 ### Extract User Root Specific Branch.
# shellcheck disable=SC2034
VAR_USER_ROOT_SPECIFIC="${user_root_specific,,}"
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f yaml_reader
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Extended dynamic network variable checks and declarations depending on preseed.yaml. # Extended dynamic network variable checks and declarations depending on preseed.yaml.
@@ -219,11 +219,16 @@ yaml_validator() {
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f yaml_validator
####################################### #######################################
# Network connectivity prober. # Network connectivity prober.
# Globals:
# network_timeout_linkwait
# Arguments: # Arguments:
# 1: IP-Family # 1: IP-Family
# 2: TLD to probe # 2: TLD to probe
@@ -237,21 +242,33 @@ probe_link() {
### 1) Try ping (quiet, 1 probe, 3s deadline) ### 1) Try ping (quiet, 1 probe, 3s deadline)
if ping -q -c 1 -W "${network_timeout_linkwait:-3}" "-${var_fam}" "${var_target}" >/dev/null 2>&1; then if ping -q -c 1 -W "${network_timeout_linkwait:-3}" "-${var_fam}" "${var_target}" >/dev/null 2>&1; then
var_ok="true" var_ok="true"
else else
### 2) Fallback: mtr in report mode (non-interactive), no DNS to avoid TUI/delays. ### 2) Fallback: mtr in report mode (non-interactive), no DNS to avoid TUI/delays.
if command -v mtr >/dev/null 2>&1; then if command -v mtr >/dev/null 2>&1; then
### Treat as success if ANY hop resolves to something other than "???". ### Treat as success if ANY hop resolves to something other than "???".
### '-r = report', '-c 2 = two cycles', -n = no DNS, -4/-6 = address family ### '-r = report', '-c 2 = two cycles', -n = no DNS, -4/-6 = address family
# shellcheck disable=SC2312 # shellcheck disable=SC2312
if mtr "-${var_fam}" -r -c 3 -n "${var_target}" 2>/dev/null \ if mtr "-${var_fam}" -r -c 3 -n "${var_target}" 2>/dev/null \
| awk 'NR>2 && $2!="???"{ok=1} END{exit ok?0:1}'; then | awk 'NR>2 && $2!="???"{ok=1} END{exit ok?0:1}'; then
var_ok="true" var_ok="true"
fi fi
fi fi
fi fi
printf '%s' "${var_ok}" printf '%s' "${var_ok}"
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f probe_link
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,271 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
#######################################
# Debug helper: list variable names (no values).
# Globals:
# CISS_SECRETS_MAP
# Arguments:
# None
# Returns:
# 0: on success
#######################################
ciss_secrets_list_names() {
### Declare Arrays, HashMaps, and Variables.
declare var_k=""
for var_k in "${!CISS_SECRETS_MAP[@]}"; do
printf '%s.value -> %s\n' "${var_k}" "${CISS_SECRETS_MAP[${var_k}]}"
done
return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f ciss_secrets_list_names
#######################################
# Unset all previously created secret variables.
# Globals:
# CISS_SECRETS_MAP
# Arguments:
# None
# Returns:
# 0: on success
#######################################
ciss_secrets_unset() {
### Declare Arrays, HashMaps, and Variables.
declare var_k="" var_v=""
### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_trace on
for var_k in "${!CISS_SECRETS_MAP[@]}"; do
var_v="${CISS_SECRETS_MAP[${var_k}]}"
if [[ -v "${var_v}" ]]; then
unset -v "${var_v}" 2>/dev/null || true
fi
done
CISS_SECRETS_MAP=()
guard_trace off
### SECRETS handling ---------------------------------------------------------------------------------------------------------
return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f ciss_secrets_unset
#######################################
# Build the canonical var name from a dotted path (without 'secrets.' and without '.value').
# Globals:
# None
# Arguments:
# 1: Variable path
# Returns:
# 0: on success
#######################################
ciss_secret_varname_from_path() {
### Declare Arrays, HashMaps, and Variables.
declare var_path="${1:-}"
var_path="${var_path//[^A-Za-z0-9_]/_}"
var_path="${var_path^^}"
printf 'CISS_SECRET_%s' "${var_path}"
return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f ciss_secret_varname_from_path
#######################################
# Wipes the specified file securely.
# Globals:
# None
# Arguments:
# 1: File to wipe
# Returns:
# 0: on success
#######################################
ciss_secrets_wiper() {
### Declare Arrays, HashMaps, and Variables.
declare var_file="${1:-}"
if [[ -f "${var_file}" ]]; then
: >| "${var_file}"
shred -vfzu -n 5 "${var_file}" > /dev/null 2>&1 || rm -f -- "${var_file}"
fi
return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f ciss_secrets_wiper
#######################################
# Purpose:
# Parsing of only "*.value" keys from 'SECRETS.yaml' into Bash globals.
# If the file contains SOPS markers, decrypt once (streaming) with sops/age, then yq parses in a single pass.
# No base64, plain values preserved (including newlines). No repeated per-key decrypts or yq calls.
# Conventions:
# Variables: CISS_SECRET_<UPPER_SNAKE_CASE_PATH> (PATH excludes "secrets." and trailing ".value")
# All with "declare -g" (no export).
# Mapping: CISS_SECRETS_MAP["foo.bar"]=CISS_SECRET_FOO_BAR
# Globals:
# CISS_SECRETS_AGE
# CISS_SECRETS_MAP
# CISS_SECRETS_SOURCE
# DIR_CNF
# Arguments:
# None
# Returns:
# 0: on success
# ERR_DECRYPTION_SOPS: on failure
# ERR_MISSING_AGE_BIN: on failure
# ERR_MISSING_AGE_KEY: on failure
#######################################
yaml_secret() {
### Declare Arrays, HashMaps, and Variables.
declare -r SOPS_AGE_KEY_FILE="${CISS_SECRETS_AGE}"
declare -a __names=()
declare secrets_encrypted="" secrets_if="${CISS_SECRETS_SOURCE}" secrets_of="${DIR_CNF}/SECRETS_DECRYPTED.yaml" \
__SECRETS="${DIR_CNF}/SECRETS_BASH.var" \
__base="" __name="" __umask="" __path_wo_prefix="" __val="" __varname=""
__umask=$(umask)
umask 0077
### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_trace on
secrets_encrypted="$(yq -r '.secrets.x_files // false' -- "${secrets_if}")" || secrets_encrypted="false"
do_log "debug" "file_only" "1256() 'secrets_encrypted' according to secrets.x_files: '${secrets_encrypted}'."
if grep -qE '(^|\s)sops:\s*$' -- "${secrets_if}" 2>/dev/null || grep -q 'ENC\[' -- "${secrets_if}" 2>/dev/null; then
secrets_encrypted="true"
do_log "debug" "file_only" "1256() 'secrets_encrypted' according to heuristic mode: '${secrets_encrypted}'."
fi
if [[ "${secrets_encrypted}" == "true" ]]; then
if ! command -v sops >/dev/null 2>&1; then
do_log "fatal" "file_only" "1260() SOPS not found but SECRETS.yaml appears to be SOPS-managed."
return "${ERR_MISSING_AGE_BIN}"
fi
[[ -r "${SOPS_AGE_KEY_FILE}" ]] || return "${ERR_MISSING_AGE_KEY}"
sops -d --input-type=yaml --output-type=yaml -- "${secrets_if}" >| "${secrets_of}"
[[ -r "${secrets_of}" ]] || return "${ERR_DECRYPTION_SOPS}"
ciss_secrets_wiper "${secrets_if}" && mv "${secrets_of}" "${secrets_if}"
fi
yq -o=shell "${secrets_if}" >| "${__SECRETS}" && ciss_secrets_wiper "${secrets_if}"
### Keep only '*_value=' lines, normalize empty RHS, quote unquoted simple RHS.
LC_ALL=C sed -n -E '
/^[[:space:]]*(#|$)/b
s/^[[:space:]]*(export|declare[[:space:]]+-x)[[:space:]]+//;
/^[[:space:]]*[A-Za-z_][A-Za-z0-9_]*_value=/!b
s/^([[:space:]]*[A-Za-z_][A-Za-z0-9_]*_value)=[[:space:]]*$/\1='\'''\''/; t print
/^[[:space:]]*[A-Za-z_][A-Za-z0-9_]*_value=[[:space:]]*('"'"'|\"|\$'"'"')/b print
s/^([[:space:]]*[A-Za-z_][A-Za-z0-9_]*_value)=([^[[:space:]]'"'"'$][^[:space:]]*)[[:space:]]*$/\1='"'"'\2'"'"'/; t print
s/^([[:space:]]*[A-Za-z_][A-Za-z0-9_]*_value)=[[:space:]]*(.+)[[:space:]]*$/\1='"'"'\2'"'"'/; t print
:print
p
' -- "${__SECRETS}" >| "${__SECRETS}.value_only"
mv -f -- "${__SECRETS}.value_only" "${__SECRETS}"
# shellcheck disable=SC1091 source=./${__SECRETS}
source "${__SECRETS}"
ciss_secrets_wiper "${__SECRETS}"
# shellcheck disable=SC2312
mapfile -t __names < <(printf '%s\n' "${!secrets_@}")
for __name in "${__names[@]}"; do
### Keep only *_value variables
[[ "${__name}" == *_value ]] || continue
### Validate strict Bash identifier (defensive: strip accidental CR).
__name="${__name%$'\r'}"
[[ "${__name}" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || continue
### Only read if actually set; indirect check without triggering nounset.
if [[ -n "${!__name+x}" ]]; then
__val="${!__name}"
else
__val=""
fi
### Strip suffix/prefix for the map key.
__base="${__name%_value}"
__path_wo_prefix="${__base#secrets_}"
### Canonical CISS name.
__varname="$(ciss_secret_varname_from_path "${__path_wo_prefix}")"
### Assign verbatim (preserves newlines).
unset -v "${__varname}"
declare -g "${__varname}"
printf -v "${__varname}" '%s' "${__val}"
CISS_SECRETS_MAP["${__path_wo_prefix}"]="${__varname}"
done
### Hygiene: remove the intermediate variables to reduce secret surface, e.g., unset 'secrets_*_value' after transfer.
for __name in "${__names[@]}"; do
unset -v "${__name}"
done
umask "${__umask}"
guard_trace off
### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f yaml_secret
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,23 +10,27 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Generates 'nuke=HASH' Bootparameter. # Generates 'nuke=HASH' Bootparameter.
# Globals: # Globals:
# CISS_SECRET_LUKS_NUKE
# DIR_CNF # DIR_CNF
# VAR_NUKE_HASH # VAR_NUKE_HASH
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_GENERATE_SALT # ERR_GENERATE_SALT: on failure
# ERR_READ_NUKE_FILE
####################################### #######################################
nuke_passphrase() { nuke_passphrase() {
declare -r var_nuke_pwd_file="${DIR_CNF}/password_luks_nuke.txt" ### SECRETS handling ---------------------------------------------------------------------------------------------------------
declare var_temp_nuke_hash="" var_temp_plain_nuke_pwd="" var_salt="" var_nuke_rounds="" guard_trace on
### Declare Arrays, HashMaps, and Variables.
declare var_nuke_pwd="${CISS_SECRET_LUKS_NUKE}"
declare var_temp_nuke_hash="" var_salt="" var_nuke_rounds=""
# shellcheck disable=SC2312 # shellcheck disable=SC2312
var_nuke_rounds="$( var_nuke_rounds="$(
@@ -40,30 +44,30 @@ nuke_passphrase() {
' "${DIR_CNF}/partitioning.yaml" | head -n1 ' "${DIR_CNF}/partitioning.yaml" | head -n1
)" )"
[[ ! -f "${var_nuke_pwd_file}" ]] && return 0 [[ -z "${var_nuke_pwd}" ]] && return 0
guard_trace on
if ! read_password_file "${var_nuke_pwd_file}" var_temp_plain_nuke_pwd; then
return "${ERR_READ_NUKE_FILE}"
fi
guard_trace off
if ! var_salt="$(generate_salt)"; then if ! var_salt="$(generate_salt)"; then
return "${ERR_GENERATE_SALT}" return "${ERR_GENERATE_SALT}"
fi fi
var_temp_nuke_hash=$(mkpasswd --method=sha-512 --salt="${var_salt}" --rounds="${var_nuke_rounds:-8388608}" "${var_nuke_pwd}")
guard_trace on # shellcheck disable=SC2034
var_temp_nuke_hash=$(mkpasswd --method=sha-512 --salt="${var_salt}" --rounds="${var_nuke_rounds:-8388608}" "${var_temp_plain_nuke_pwd}")
guard_trace off
declare -grx VAR_NUKE_HASH="${var_temp_nuke_hash}" declare -grx VAR_NUKE_HASH="${var_temp_nuke_hash}"
unset var_temp_nuke_hash var_temp_plain_nuke_pwd
unset var_temp_nuke_hash var_nuke_pwd CISS_SECRET_LUKS_NUKE
do_log "debug" "file_only" "0105() NUKE hash starts with: [${VAR_NUKE_HASH:0:32}...]" do_log "debug" "file_only" "0105() NUKE hash starts with: [${VAR_NUKE_HASH:0:32}...]"
guard_dir && return 0 guard_trace off
} ### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f nuke_passphrase
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,13 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# EFI System Partition | EF00 | UEFI Bootloader (ESP, FAT32) # EFI System Partition | EF00 | UEFI Bootloader (ESP, FAT32)
# BIOS Boot Partition | EF02 | BIOS Bootloader area (GRUB) # BIOS Boot Partition | EF02 | BIOS Bootloader area (GRUB)
# Linux SWAP | 8200 | Linux Swap # Linux SWAP | 8200 | Linux Swap
# Linux ext4/btrfs | 8300 | Linux Filesystem (root, home) # Linux ext4/btrfs | 8300 | Linux Filesystem (root, home)
# Linux LUKS | 8309 | Linux LUKS
####################################### #######################################
####################################### #######################################
@@ -42,23 +43,28 @@ guard_sourcing
# - LUKS encryption enabled. # - LUKS encryption enabled.
# - Specific device partition data for each mount path. # - Specific device partition data for each mount path.
# Globals: # Globals:
# ARY_CRYPT_MOUNT_PATHS
# ARY_FORMT_MOUNT_PATHS
# ARY_FSTAB_MOUNT_PATHS # ARY_FSTAB_MOUNT_PATHS
# ARY_PATHS_SORTED
# DIR_LOG # DIR_LOG
# HMP_FSTAB_MOUNT_FTYPE # HMP_FSTAB_MOUNT_FTYPE
# HMP_PATH_DEV_PART
# HMP_PATH_PARTUUID # HMP_PATH_PARTUUID
# VAR_RECIPE_FIRMWARE # VAR_RECIPE_FIRMWARE
# VAR_RECIPE_STRING # VAR_RECIPE_STRING
# VAR_RECIPE_TABLE # VAR_RECIPE_TABLE
# VAR_ROOT_FS
# VAR_SETUP_PART # VAR_SETUP_PART
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# ERR_PARTITIONTBL
# ERR_PART_CREATE
# ERR_PART_READ
# ERR_TABLE_CREATE
# ERR_TABLE_DELETE
# 0: on success # 0: on success
# ERR_PARTITIONTBL: on failure
# ERR_PART_CREATE: on failure
# ERR_PART_READ: on failure
# ERR_TABLE_CREATE: on failure
# ERR_TABLE_DELETE: on failure
####################################### #######################################
partitioning() { partitioning() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -179,6 +185,7 @@ partitioning() {
var_end_arg="${var_end}" var_end_arg="${var_end}"
fi fi
# shellcheck disable=SC2249
case "${VAR_RECIPE_TABLE,,}" in case "${VAR_RECIPE_TABLE,,}" in
gpt) gpt)
@@ -211,6 +218,7 @@ partitioning() {
### Assign the correct GPT typecode via sgdisk if the table is GPT. ### Assign the correct GPT typecode via sgdisk if the table is GPT.
if [[ "${VAR_RECIPE_TABLE,,}" == "gpt" ]]; then if [[ "${VAR_RECIPE_TABLE,,}" == "gpt" ]]; then
# shellcheck disable=SC2249
case "${var_mount_path,,}" in case "${var_mount_path,,}" in
"/") "/")
@@ -253,13 +261,15 @@ partitioning() {
esac esac
# shellcheck disable=SC2249
case "${var_encryption,,}" in case "${var_encryption,,}" in
true) true)
case "${var_mount_path,,}" in case "${var_mount_path,,}" in
/tmp|swap) : ;; /tmp|swap)
typecode="ca7d7ccb-63ed-4c53-861c-1742536059cc" ;; ### Linux LUKS Partition
*) *)
typecode="ca7d7ccb-63ed-4c53-861c-1742536059cc" ;; ### Linux LUKS Partition typecode="ca7d7ccb-63ed-4c53-861c-1742536059cc" ;; ### Linux LUKS Partition
@@ -283,6 +293,7 @@ partitioning() {
### Set the bootable flag if necessary. ### Set the bootable flag if necessary.
if [[ "${var_boot,,}" == "true" ]]; then if [[ "${var_boot,,}" == "true" ]]; then
# shellcheck disable=SC2249
case "${VAR_RECIPE_TABLE,,}:${VAR_RECIPE_FIRMWARE,,}" in case "${VAR_RECIPE_TABLE,,}:${VAR_RECIPE_FIRMWARE,,}" in
gpt:uefi|mbr:uefi) gpt:uefi|mbr:uefi)
@@ -304,16 +315,22 @@ partitioning() {
udevadm settle udevadm settle
for i in {1..10}; do for i in {1..10}; do
var_uuid=$(blkid -s PARTUUID -o value "/dev/${var_dev}${var_part}") && [[ -n "${var_uuid}" ]] && break var_uuid=$(blkid -s PARTUUID -o value "/dev/${var_dev}${var_part}") && [[ -n "${var_uuid}" ]] && break
sleep 0.25 sleep 0.25
done done
if [[ -z "${var_uuid}" ]]; then if [[ -z "${var_uuid}" ]]; then
do_log "fatal" "file_only" "3200() Partition: '/dev/${var_dev}${var_part}' could not read PARTUUID." do_log "fatal" "file_only" "3200() Partition: '/dev/${var_dev}${var_part}' could not read PARTUUID."
return "${ERR_PART_READ}" return "${ERR_PART_READ}"
else else
HMP_PATH_PARTUUID["${var_mount_path}"]="${var_uuid}" HMP_PATH_PARTUUID["${var_mount_path}"]="${var_uuid}"
do_log "debug" "file_only" "3200() [HMP_PATH_PARTUUID]: '${var_mount_path}' -> '${HMP_PATH_PARTUUID["${var_mount_path}"]}'." do_log "debug" "file_only" "3200() [HMP_PATH_PARTUUID]: '${var_mount_path}' -> '${HMP_PATH_PARTUUID["${var_mount_path}"]}'."
fi fi
### Gathering information for forthcoming modules 32n0(). ### Gathering information for forthcoming modules 32n0().
@@ -337,17 +354,21 @@ partitioning() {
### Gathering information for '/etc/fstab'-generation in 4200(). ### Gathering information for '/etc/fstab'-generation in 4200().
if [[ "${var_mount_true}" == "true" ]]; then if [[ "${var_mount_true}" == "true" ]]; then
# shellcheck disable=SC2034 # shellcheck disable=SC2034
ARY_FSTAB_MOUNT_PATHS+=("${var_mount_path}") ARY_FSTAB_MOUNT_PATHS+=("${var_mount_path}")
do_log "debug" "file_only" "3200() [ARY_FSTAB_MOUNT_PATHS]: '${var_mount_path}'." do_log "debug" "file_only" "3200() [ARY_FSTAB_MOUNT_PATHS]: '${var_mount_path}'."
HMP_FSTAB_MOUNT_FTYPE["${var_mount_path}"]="${var_fs}" HMP_FSTAB_MOUNT_FTYPE["${var_mount_path}"]="${var_fs}"
do_log "debug" "file_only" "3200() [HMP_FSTAB_MOUNT_FTYPE]: '${var_mount_path}' -> '${HMP_FSTAB_MOUNT_FTYPE["${var_mount_path}"]}'." do_log "debug" "file_only" "3200() [HMP_FSTAB_MOUNT_FTYPE]: '${var_mount_path}' -> '${HMP_FSTAB_MOUNT_FTYPE["${var_mount_path}"]}'."
fi fi
### Gathering information for '/etc/initramfs-tools/conf.d/fsroot'-generation in 4121(). ### Gathering information for '/etc/initramfs-tools/conf.d/fsroot'-generation in 4121().
if [[ "${var_mount_path}" == "/" ]]; then if [[ "${var_mount_path}" == "/" ]]; then
# shellcheck disable=SC2034 # shellcheck disable=SC2034
VAR_ROOT_FS="${var_fs}" VAR_ROOT_FS="${var_fs}"
fi fi
done done
@@ -381,6 +402,9 @@ partitioning() {
printf "%s\n" "${ary_paths_unsorted[@]}" >| "${DIR_LOG}/3200_mount_paths_unsorted.log" printf "%s\n" "${ary_paths_unsorted[@]}" >| "${DIR_LOG}/3200_mount_paths_unsorted.log"
printf "%s\n" "${ARY_PATHS_SORTED[@]}" >| "${DIR_LOG}/3200_mount_paths_sorted.log" printf "%s\n" "${ARY_PATHS_SORTED[@]}" >| "${DIR_LOG}/3200_mount_paths_sorted.log"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f partitioning
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Benchmark cryptsetup KDF to determine pbkdf-memory and pbkdf-force-iterations for given pbkdf-threads. # Benchmark cryptsetup KDF to determine pbkdf-memory and pbkdf-force-iterations for given pbkdf-threads.
@@ -27,7 +27,8 @@ guard_sourcing
# 0: on success # 0: on success
####################################### #######################################
benchmarking_encryption() { benchmarking_encryption() {
declare var_result="" ### Declare Arrays, HashMaps, and Variables.
declare var_result=""
# shellcheck disable=SC2155 # shellcheck disable=SC2155
declare -girx VAR_KDF_THREADS=$(yq_val ".recipe.${VAR_RECIPE_STRING}.control.kdf.threads" "${VAR_SETUP_PART}") declare -girx VAR_KDF_THREADS=$(yq_val ".recipe.${VAR_RECIPE_STRING}.control.kdf.threads" "${VAR_SETUP_PART}")
# shellcheck disable=SC2155 # shellcheck disable=SC2155
@@ -37,7 +38,7 @@ benchmarking_encryption() {
sync sync
echo "BENCHMARK CRYPTSETUP ARGON2ID KDF PARAMETER - DROPPING PAGES ..." echo "BENCHMARK CRYPTSETUP ARGON2ID KDF PARAMETER - DROPPING PAGES ..."
echo 3 >| /proc/sys/vm/drop_caches echo 3 >| /proc/sys/vm/drop_caches || true
# shellcheck disable=SC2312 # shellcheck disable=SC2312
var_result=$(cryptsetup benchmark --pbkdf argon2id --iter-time "${VAR_ITER_TIME:-3000}" --pbkdf-parallel "${VAR_KDF_THREADS:-1}" 2>/dev/null \ var_result=$(cryptsetup benchmark --pbkdf argon2id --iter-time "${VAR_ITER_TIME:-3000}" --pbkdf-parallel "${VAR_KDF_THREADS:-1}" 2>/dev/null \
@@ -53,6 +54,9 @@ benchmarking_encryption() {
# shellcheck disable=SC2155 # shellcheck disable=SC2155
declare -girx VAR_KDF_MEMORY=$(awk -F'[ ,]+' '{print $4}' <<<"${var_result}") declare -girx VAR_KDF_MEMORY=$(awk -F'[ ,]+' '{print $4}' <<<"${var_result}")
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f benchmarking_encryption
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,15 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Function to encrypt the respective partition on each entry of 'ARY_CRYPT_MOUNT_PATHS'. # Function to encrypt the respective partition on each entry of 'ARY_CRYPT_MOUNT_PATHS'.
# Globals: # Globals:
# ARY_CRYPT_MOUNT_PATHS # ARY_CRYPT_MOUNT_PATHS
# CISS_SECRET_LUKS_BACKUP
# CISS_SECRET_LUKS_BOOT
# CISS_SECRET_LUKS_COMMON
# DIR_BAK # DIR_BAK
# DIR_CNF # DIR_CNF
# DIR_LOG # DIR_LOG
@@ -23,29 +26,31 @@ guard_sourcing
# HMP_EPHEMERAL_FS_LABEL # HMP_EPHEMERAL_FS_LABEL
# HMP_PATH_DEV_PART # HMP_PATH_DEV_PART
# HMP_PATH_ENCLABEL # HMP_PATH_ENCLABEL
# HMP_PATH_FSUUID
# HMP_PATH_LUKSUUID # HMP_PATH_LUKSUUID
# VAR_CRYPT_BOOT
# VAR_CRYPT_RECOVERY # VAR_CRYPT_RECOVERY
# VAR_CRYPT_ROOT # VAR_CRYPT_ROOT
# VAR_FINAL_FQDN
# VAR_ITER_TIME # VAR_ITER_TIME
# VAR_KDF_ITERATIONS # VAR_KDF_ITERATIONS
# VAR_KDF_MEMORY # VAR_KDF_MEMORY
# VAR_KDF_THREADS # VAR_KDF_THREADS
# VAR_LUKS_BACKUP
# VAR_LUKS_PGP
# VAR_LUKS_URL
# VAR_RECIPE_STRING # VAR_RECIPE_STRING
# VAR_SETUP_PART # VAR_SETUP_PART
# VAR_SETUP_PATH
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_LUKS_HEADER_ENC: on failure
####################################### #######################################
partition_encryption() { partition_encryption() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -Ag HMP_PATH_LUKSUUID # Used in: 3290() - [Mount Path:LUKS UUID]. declare -Ag HMP_PATH_LUKSUUID # Used in: 3290() - [Mount Path:LUKS UUID].
# Used in: 4210() - [Mount Path:LUKS UUID]. # Used in: 4210() - [Mount Path:LUKS UUID].
declare -Ag HMP_PATH_FSUUID # Used in: 3240() - [Mount Path:Filesystem UUID].
# Used in: 3290() - [Mount Path:Filesystem UUID].
# Used in: 4200() - [Mount Path:Filesystem UUID].
# Used in: 4210() - [Mount Path:Filesystem UUID].
declare -Ag HMP_EPHEMERAL_ENCLABEL # Used in: 4200() - [Mount Path:LUKS Encryption Label]. declare -Ag HMP_EPHEMERAL_ENCLABEL # Used in: 4200() - [Mount Path:LUKS Encryption Label].
declare -Ag HMP_EPHEMERAL_FS_LABEL # Used in: 4210() - [Mount Path:Ephemeral Host FS Label]. Substituted by FS-UUID declare -Ag HMP_EPHEMERAL_FS_LABEL # Used in: 4210() - [Mount Path:Ephemeral Host FS Label]. Substituted by FS-UUID
@@ -58,10 +63,34 @@ partition_encryption() {
var_encryption_ephemeral="" var_encryption_integrity="" var_encryption_cipher="" var_encryption_hash="" \ var_encryption_ephemeral="" var_encryption_integrity="" var_encryption_cipher="" var_encryption_hash="" \
var_encryption_key="" var_encryption_label="" var_encryption_meta="" var_encryption_slot="" \ var_encryption_key="" var_encryption_label="" var_encryption_meta="" var_encryption_slot="" \
var_encryption_pbkdf="" var_encryption_rng="" var_filesystem_label="" var_mount_path="" var_uuid="" var_fs="" \ var_encryption_pbkdf="" var_encryption_rng="" var_filesystem_label="" var_mount_path="" var_uuid="" var_fs="" \
var_fs_uuid="" var_luks_backup_file="" var_luks_backup_name="" var_pgp_publickey="" var_luks_backup_pgp="" \
var_temp_plain_nc_auth=""
declare -a ary_luks_opts=() declare -a ary_luks_opts=()
### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_trace on
printf '%s' "${CISS_SECRET_LUKS_BOOT}" >| "${DIR_CNF}/password_luks_boot.txt" && chmod 0600 "${DIR_CNF}/password_luks_boot.txt"
printf '%s' "${CISS_SECRET_LUKS_COMMON}" >| "${DIR_CNF}/password_luks_common.txt" && chmod 0600 "${DIR_CNF}/password_luks_common.txt"
unset CISS_SECRET_LUKS_BOOT CISS_SECRET_LUKS_COMMON
guard_trace on
### SECRETS handling ---------------------------------------------------------------------------------------------------------
if [[ -n "${VAR_LUKS_URL}" ]]; then
VAR_LUKS_URL=${VAR_LUKS_URL%/}
### SECRETS handling -------------------------------------------------------------------------------------------------------
guard_trace on
var_temp_plain_nc_auth="${CISS_SECRET_LUKS_BACKUP}"
unset CISS_SECRET_LUKS_BACKUP
guard_trace on
### SECRETS handling -------------------------------------------------------------------------------------------------------
do_log "debug" "file_only" "3220() Var: [var_temp_plain_nc_auth] set."
fi
for var_encryption_path in "${ARY_CRYPT_MOUNT_PATHS[@]}"; do for var_encryption_path in "${ARY_CRYPT_MOUNT_PATHS[@]}"; do
### Initialize Arrays and Variables ### Initialize Arrays and Variables
@@ -128,15 +157,6 @@ partition_encryption() {
var_filesystem_label=$(get_label "${var_encryption_path}" "${var_fs}" "file") var_filesystem_label=$(get_label "${var_encryption_path}" "${var_fs}" "file")
mkfs.ext4 -L "${var_filesystem_label}" "/dev/${var_dev}" 1M
do_log "info" "file_only" "3220() Ephemeral: '${var_encryption_path}' prepared on: '/dev/${var_dev}'."
var_fs_uuid=$(blkid -s UUID -o value "/dev/${var_dev}")
### Gathering information for '/etc/fstab'-generation in 4040() and '/etc/crypttab'-generation in 4060().
# shellcheck disable=SC2034
HMP_PATH_FSUUID["${var_encryption_path}"]="${var_fs_uuid}"
do_log "debug" "file_only" "3220() [HMP_PATH_FSUUID] : '${var_encryption_path}' -> '${HMP_PATH_FSUUID["${var_encryption_path}"]}'"
HMP_EPHEMERAL_ENCLABEL["${var_encryption_path}"]="${var_encryption_label}" HMP_EPHEMERAL_ENCLABEL["${var_encryption_path}"]="${var_encryption_label}"
HMP_EPHEMERAL_FS_LABEL["${var_encryption_path}"]="${var_filesystem_label}" HMP_EPHEMERAL_FS_LABEL["${var_encryption_path}"]="${var_filesystem_label}"
@@ -172,18 +192,19 @@ partition_encryption() {
fi fi
cryptsetup luksHeaderBackup --header-backup-file="${DIR_BAK}/luks_header_${var_dev}.bak" "/dev/${var_dev}" ### Opening the encrypted container.
do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header saved: '${DIR_BAK}/luks_header_${var_dev}.bak'."
### Opening encrypted container.
if [[ "${var_encryption_path,,}" == "/boot" ]]; then if [[ "${var_encryption_path,,}" == "/boot" ]]; then
cryptsetup luksOpen "/dev/${var_dev}" \ cryptsetup luksOpen "/dev/${var_dev}" \
--key-file="${DIR_CNF}/password_luks_boot.txt" \ --key-file="${DIR_CNF}/password_luks_boot.txt" \
"${var_encryption_label}" "${var_encryption_label}"
else else
cryptsetup luksOpen "/dev/${var_dev}" \ cryptsetup luksOpen "/dev/${var_dev}" \
--key-file="${DIR_CNF}/password_luks_common.txt" \ --key-file="${DIR_CNF}/password_luks_common.txt" \
"${var_encryption_label}" "${var_encryption_label}"
fi fi
do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' opened as '/dev/mapper/${var_encryption_label}'." do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' opened as '/dev/mapper/${var_encryption_label}'."
@@ -203,8 +224,95 @@ partition_encryption() {
do_log "debug" "file_only" "3220() [HMP_PATH_LUKSUUID]: '${var_encryption_path}' -> '${HMP_PATH_LUKSUUID["${var_encryption_path}"]}'" do_log "debug" "file_only" "3220() [HMP_PATH_LUKSUUID]: '${var_encryption_path}' -> '${HMP_PATH_LUKSUUID["${var_encryption_path}"]}'"
do_log "debug" "file_only" "3220() [HMP_PATH_ENCLABEL]: '${var_encryption_path}' -> '${HMP_PATH_ENCLABEL["${var_encryption_path}"]}'" do_log "debug" "file_only" "3220() [HMP_PATH_ENCLABEL]: '${var_encryption_path}' -> '${HMP_PATH_ENCLABEL["${var_encryption_path}"]}'"
### Backup the LUKS Header.
if [[ "${VAR_LUKS_BACKUP}" == "true" ]]; then
var_luks_backup_file="${DIR_BAK}/luks_header_${var_dev}.bak"
var_luks_backup_name="${VAR_FINAL_FQDN}_luks_header_${var_dev}.bak.pgp"
var_luks_backup_pgp="${DIR_BAK}/luks_header_${var_dev}.bak.pgp"
case "${VAR_LUKS_PGP}" in
ciss) var_pgp_publickey="${VAR_SETUP_PATH}/.pubkey/marc_s_weidner_msw@coresecret.dev_0xE62E84F8_public.asc" ;;
physnet) var_pgp_publickey="${VAR_SETUP_PATH}/.pubkey/zimnol_andre_h_git.cs@physnet.eu_0x8A659CC7B4D63AE6_public.asc" ;;
none) do_log "error" "file_only" "3220() No PGP public key for LUKS Header encryption provided."; continue ;;
*) do_log "fatal" "file_only" "3220() No valid PGP public key for LUKS Header encryption provided."; return "${ERR_LUKS_HEADER_ENC}" ;;
esac
if cryptsetup luksHeaderBackup --header-backup-file="${var_luks_backup_file}" "/dev/${var_dev}"; then
do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header saved: '${var_luks_backup_file}'."
else
do_log "fatal" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header backup failed for: '${var_luks_backup_file}'."
return "${ERR_LUKS_HEADER_ENC}"
fi
if gpg --batch --yes --no-tty --compress-level 0 \
--recipient-file "${var_pgp_publickey}" \
--encrypt -o "${var_luks_backup_pgp}" -- "${var_luks_backup_file}"; then
do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header encrypted: '${var_luks_backup_pgp}'."
if command -v shred >/dev/null 2>&1; then
shred -vfzu -n 5 "${var_luks_backup_file}" || rm -f "${var_luks_backup_file}"
else
rm -f "${var_luks_backup_file}"
fi
else
do_log "fatal" "file_only" "3220() GPG encryption failed for '${var_luks_backup_file}'. Keeping plaintext for diagnostics."
return "${ERR_LUKS_HEADER_ENC}"
fi
if [[ -n "${VAR_LUKS_URL}" ]]; then
### SECRETS handling ---------------------------------------------------------------------------------------------------
guard_trace on
if curl --silent --show-error --fail --retry 2 "${VAR_LUKS_URL}/public.php/webdav/${var_luks_backup_name}" \
--upload-file "${var_luks_backup_pgp}" --user "${var_temp_plain_nc_auth}" > /dev/null 2>&1; then
do_log "info" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header upload: '${VAR_LUKS_URL}' successful."
rm -f "${var_luks_backup_pgp}"
else
do_log "warn" "file_only" "3220() Partition: '/dev/${var_dev}' LUKS Header upload: '${VAR_LUKS_URL}' failed."
fi
guard_trace off
### SECRETS handling ---------------------------------------------------------------------------------------------------
fi
fi
done done
guard_dir && return 0 ### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_trace on
[[ -n "${VAR_LUKS_URL}" ]] && unset var_temp_plain_nc_auth
guard_trace off
### SECRETS handling ---------------------------------------------------------------------------------------------------------
ciss_secrets_wiper "${DIR_CNF}/password_luks_boot.txt"
ciss_secrets_wiper "${DIR_CNF}/password_luks_common.txt"
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f partition_encryption
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Function to format the respective partition on each entry of 'ARY_FORMT_MOUNT_PATHS'. # Function to format the respective partition on each entry of 'ARY_FORMT_MOUNT_PATHS'.
@@ -59,10 +59,11 @@ partition_formatting() {
case "${var_format_path,,}" in case "${var_format_path,,}" in
swap|/tmp) swap|/tmp)
do_log "info" "file_only" "3240() Partition: '/dev/${var_dev}' ephemeral encryption already prepared in 3220(): '${var_format_path}'." do_log "info" "file_only" "3240() Partition: '/dev/${var_dev}' ephemeral encryption devices do not need formatting: '${var_format_path}'."
### Nothing more to do here. ### Nothing more to do here.
continue continue
;; ;;
*) : ;;
esac esac
if [[ "${var_encryption_enable,,}" == "true" ]]; then if [[ "${var_encryption_enable,,}" == "true" ]]; then
@@ -137,6 +138,9 @@ partition_formatting() {
done done
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f partition_formatting
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,11 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Function to create the mount command, incl. mount path and options, and mount the respective device. # Function to create the mount command, incl. mount path and options, and mount the respective device.
# Globals: # Globals:
# ERR_MOUNTING_DEV
# TARGET # TARGET
# Arguments: # Arguments:
# 1: MOUNT_PATH # 1: MOUNT_PATH
@@ -24,6 +23,7 @@ guard_sourcing
# 4: MOUNT_FILESYSTEM # 4: MOUNT_FILESYSTEM
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_MOUNTING_DEV: on failure
####################################### #######################################
mount_with_dir() { mount_with_dir() {
declare var_mount_path="${1}" var_mount_device="${2}" var_mount_options="${3:-}" var_mount_fs="${4:-}" declare var_mount_path="${1}" var_mount_device="${2}" var_mount_options="${3:-}" var_mount_fs="${4:-}"
@@ -60,7 +60,7 @@ mount_with_dir() {
### Already absolute path. ### Already absolute path.
elif [[ "${var_mount_device}" == /dev/* ]]; then elif [[ "${var_mount_device}" == /dev/* ]]; then
: ### Do nothing : ### Do nothing.
### Alternative checks for LABEL and PARTUUID. ### Alternative checks for LABEL and PARTUUID.
else else
@@ -104,16 +104,23 @@ mount_with_dir() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f mount_with_dir
####################################### #######################################
# Device Path Resolver. # Device Path Resolver.
# Outputs '/dev/mapper/<encryption_label>' # Outputs '/dev/mapper/<encryption_label>'
# Outputs '/dev/<dev><partition>' # Outputs '/dev/<dev><partition>'
# Globals:
# None
# Arguments: # Arguments:
# 1: Device # 1: Device
# 2: Partition # 2: Partition
# 3: Boolean Encryption # 3: Boolean Encryption
# 4: Encryption Label # 4: Encryption Label
# Returns:
# 0: on success
####################################### #######################################
resolve_device() { resolve_device() {
declare local_var_dev="$1" local_var_partition="$2" local_var_enc_boolean="$3" local_var_enc_label="$4" declare local_var_dev="$1" local_var_partition="$2" local_var_enc_boolean="$3" local_var_enc_label="$4"
@@ -130,15 +137,20 @@ resolve_device() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f resolve_device
####################################### #######################################
# Validates btrfs compression algo and level. # Validates btrfs compression algo and level.
# Globals:
# None
# Arguments: # Arguments:
# 1: var_fs_btrfs_compress # 1: var_fs_btrfs_compress
# 2: var_fs_btrfs_level # 2: var_fs_btrfs_level
# Returns: # Returns:
# 0: Valid combination. # 0: Valid combination.
# 1: Invalid combination. # ERR_BTRFS_OPTION: on failure
####################################### #######################################
validate_btrfs_compression() { validate_btrfs_compression() {
declare var_algo="$1" var_level="$2" declare var_algo="$1" var_level="$2"
@@ -151,19 +163,20 @@ validate_btrfs_compression() {
esac esac
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f validate_btrfs_compression
####################################### #######################################
# Function for mounting all partitions for debootstrap, including the generation of btrfs subvolumes. # Function for mounting all partitions for debootstrap, including the generation of btrfs subvolumes.
# Globals: # Globals:
# ARY_CRYPT_MOUNT_PATHS
# ARY_PATHS_SORTED # ARY_PATHS_SORTED
# DIR_LOG # DIR_LOG
# ERR_BTRFS_INITPH
# ERR_BTRFS_OPTION
# ERR_BTRFS_SUBVOL
# ERR_MOUNTING_DEV
# HMP_FSTAB_MOUNT_OPTS # HMP_FSTAB_MOUNT_OPTS
# HMP_PATH_DEV_PART # HMP_PATH_DEV_PART
# HMP_PATH_FSUUID # HMP_PATH_FSUUID
# HMP_PATH_PARTUUID
# NL # NL
# TARGET # TARGET
# VAR_RECIPE_STRING # VAR_RECIPE_STRING
@@ -173,11 +186,10 @@ validate_btrfs_compression() {
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_BTRFS_INITPH # ERR_BTRFS_INITPH: on failure
# ERR_BTRFS_OPTION # ERR_BTRFS_OPTION: on failure
# ERR_BTRFS_SUBVOL # ERR_BTRFS_SUBVOL: on failure
# ERR_MOUNTING_DEV # ERR_MOUNTING_DEV: on failure
# ERR_MOUNTING_ROOT
####################################### #######################################
mount_partition() { mount_partition() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -187,7 +199,7 @@ mount_partition() {
declare var_mount_path="" var_dev_part="" var_dev="" var_btrfs_options="" \ declare var_mount_path="" var_dev_part="" var_dev="" var_btrfs_options="" \
var_encryption_label="" var_fs_btrfs_compress="" var_fs_btrfs_level="" var_fs_btrfs_snapshot="" \ var_encryption_label="" var_fs_btrfs_compress="" var_fs_btrfs_level="" var_fs_btrfs_snapshot="" \
var_fs_btrfs_subvolume="" var_fs_version="" var_mount_options="" var_mount_optsnap="" var_mount_path="" \ var_fs_btrfs_subvolume="" var_fs_version="" var_mount_options="" var_mount_optsnap="" var_mount_path="" \
var_snapshot="" var_fs_uuid="" var_snapshot="" var_fs_uuid="" var_partuuid=""
declare -a ary_cmd=() ary_cmd_mount=() declare -a ary_cmd=() ary_cmd_mount=()
@@ -212,19 +224,18 @@ mount_partition() {
var_encryption_label=$(get_label "${var_mount_path}" "${var_fs_version}" "luks") var_encryption_label=$(get_label "${var_mount_path}" "${var_fs_version}" "luks")
fi fi
var_fs_uuid="${HMP_PATH_FSUUID["${var_mount_path}"]}"
if [[ -z "${var_fs_uuid}" ]]; then
do_log "error" "file_only" "3280() FS-UUID for mount path: '${var_mount_path}' not found in: 'HMP_PATH_FSUUID'."
return "${ERR_MOUNTING_DEV}"
fi
### Mounting of Ephemeral 'SWAP' and '/tmp' as per https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption#UUID_and_LABEL ### Mounting of Ephemeral 'SWAP' and '/tmp' as per https://wiki.archlinux.org/title/Dm-crypt/Swap_encryption#UUID_and_LABEL
if [[ "${var_mount_path,,}" == "swap" ]]; then if [[ "${var_mount_path,,}" == "swap" ]]; then
cryptsetup open --type plain --key-file /dev/random \ var_partuuid="${HMP_PATH_PARTUUID["${var_mount_path}"]}"
--offset 2048 --cipher aes-xts-plain64 --key-size 512 \
--sector-size 4096 "/dev/disk/by-uuid/${var_fs_uuid}" "${var_encryption_label}" ### Gathering information for '/etc/fstab'-generation in 4040().
HMP_FSTAB_MOUNT_OPTS["SWAP"]="${var_mount_options}"
cryptsetup open --type plain \
--key-file /dev/urandom \
--cipher aes-xts-plain64 --key-size 512 \
"/dev/disk/by-partuuid/${var_partuuid}" "${var_encryption_label}"
mkswap "/dev/mapper/${var_encryption_label}" mkswap "/dev/mapper/${var_encryption_label}"
do_log "debug" "file_only" "3280() [mkswap /dev/mapper/${var_encryption_label}]." do_log "debug" "file_only" "3280() [mkswap /dev/mapper/${var_encryption_label}]."
@@ -239,9 +250,12 @@ mount_partition() {
elif [[ "${var_mount_path,,}" == "/tmp" ]]; then elif [[ "${var_mount_path,,}" == "/tmp" ]]; then
cryptsetup open --type plain --key-file /dev/random \ var_partuuid="${HMP_PATH_PARTUUID["${var_mount_path}"]}"
--offset 2048 --cipher aes-xts-plain64 --key-size 512 \
--sector-size 4096 "/dev/disk/by-uuid/${var_fs_uuid}" "${var_encryption_label}" cryptsetup open --type plain \
--key-file /dev/urandom \
--cipher aes-xts-plain64 --key-size 512 \
"/dev/disk/by-partuuid/${var_partuuid}" "${var_encryption_label}"
mkdir -p "${TARGET}/tmp" mkdir -p "${TARGET}/tmp"
@@ -262,6 +276,8 @@ mount_partition() {
fi fi
var_fs_uuid="${HMP_PATH_FSUUID["${var_mount_path}"]}"
if [[ "${var_fs_version,,}" == "btrfs" ]]; then if [[ "${var_fs_version,,}" == "btrfs" ]]; then
var_fs_btrfs_subvolume=$(get_label "${var_mount_path}" "${var_fs_version}" "sub") var_fs_btrfs_subvolume=$(get_label "${var_mount_path}" "${var_fs_version}" "sub")
@@ -350,6 +366,10 @@ mount_partition() {
do_log "info" "file_only" "3280() Mounted: '${var_fs_uuid}' on: '${TARGET}${var_mount_path}' Options='${var_mount_options}'." do_log "info" "file_only" "3280() Mounted: '${var_fs_uuid}' on: '${TARGET}${var_mount_path}' Options='${var_mount_options}'."
;; ;;
*)
do_log "info" "file_only" "3280() No valid FS found for: '${var_mount_path}'."
;;
esac esac
var_dev="${var_dev_part%.*}" var_dev="${var_dev_part%.*}"
@@ -364,6 +384,9 @@ mount_partition() {
done done
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f mount_partition
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Logger for all generated partition, LUKS container and file system UUIDs. # Logger for all generated partition, LUKS container and file system UUIDs.
@@ -29,30 +29,41 @@ uuid_logger() {
printf 'PARTITION UUID Partition:\n' >> "${LOG_UID}" printf 'PARTITION UUID Partition:\n' >> "${LOG_UID}"
for var_key in "${!HMP_PATH_PARTUUID[@]}"; do for var_key in "${!HMP_PATH_PARTUUID[@]}"; do
var_mountpoint="${var_key}" var_mountpoint="${var_key}"
var_uuid="${HMP_PATH_PARTUUID[${var_key}]}" var_uuid="${HMP_PATH_PARTUUID[${var_key}]}"
### Left-aligned field width 63; "UUID=" starts directly after column 64. ### Left-aligned field width 63; "UUID=" starts directly after column 64.
printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}" printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}"
done done
printf '\n' >> "${LOG_UID}" printf '\n' >> "${LOG_UID}"
printf 'LUKS CONTAINER UUID:\n' >> "${LOG_UID}" printf 'LUKS CONTAINER UUID:\n' >> "${LOG_UID}"
for var_key in "${!HMP_PATH_LUKSUUID[@]}"; do for var_key in "${!HMP_PATH_LUKSUUID[@]}"; do
var_mountpoint="${var_key}" var_mountpoint="${var_key}"
var_uuid="${HMP_PATH_LUKSUUID[${var_key}]}" var_uuid="${HMP_PATH_LUKSUUID[${var_key}]}"
### Left-aligned field width 63; "UUID=" starts directly after column 64. ### Left-aligned field width 63; "UUID=" starts directly after column 64.
printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}" printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}"
done done
printf '\n' >> "${LOG_UID}" printf '\n' >> "${LOG_UID}"
printf 'FILESYSTEM UUID:\n' >> "${LOG_UID}" printf 'FILESYSTEM UUID:\n' >> "${LOG_UID}"
for var_key in "${!HMP_PATH_FSUUID[@]}"; do for var_key in "${!HMP_PATH_FSUUID[@]}"; do
var_mountpoint="${var_key}" var_mountpoint="${var_key}"
var_uuid="${HMP_PATH_FSUUID[${var_key}]}" var_uuid="${HMP_PATH_FSUUID[${var_key}]}"
### Left-aligned field width 63; "UUID=" starts directly after column 64. ### Left-aligned field width 63; "UUID=" starts directly after column 64.
printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}" printf '%-63sUUID=%s\n' "${var_mountpoint}" "${var_uuid}" >> "${LOG_UID}"
done done
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f uuid_logger
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Returns standardized labels for the provided mount path depending on filesystem and art of label. # Returns standardized labels for the provided mount path depending on filesystem and art of label.
@@ -64,6 +64,7 @@ get_label() {
file) file)
# shellcheck disable=SC2249
case "${var_path}:${var_file}" in case "${var_path}:${var_file}" in
swap:*) var_return_label="host_swap" ;; swap:*) var_return_label="host_swap" ;;
@@ -117,4 +118,7 @@ get_label() {
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f get_label
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,32 +10,41 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install a minimal Debian environment using the 'debootstrap' command. # Install a minimal Debian environment using the 'debootstrap' command.
# Globals: # Globals:
# LOG_DBS # LOG_DBS
# LOG_REC
# RECOVERY
# TARGET # TARGET
# VAR_ARCHITECTURE # VAR_ARCHITECTURE
# VAR_CODENAME # VAR_CODENAME
# VAR_RUN_RECOVERY
# debootstrap_includes # debootstrap_includes
# debootstrap_mirror # debootstrap_mirror
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_DEBOOTSTRAP # ERR_DEBOOTSTRAP: on failure
####################################### #######################################
func_debootstrap() { func_debootstrap() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_arch="${VAR_ARCHITECTURE}" declare -r var_arch="${VAR_ARCHITECTURE}"
declare -r var_dist="${VAR_CODENAME}" declare -r var_dist="${VAR_CODENAME}"
declare -r var_target="${TARGET}"
declare -r var_mirror="${debootstrap_mirror}" declare -r var_mirror="${debootstrap_mirror}"
declare -r var_includes="${debootstrap_includes}" declare -r var_includes="${debootstrap_includes}"
declare -a ary_cmd=() declare -a ary_cmd=()
declare var_log="${LOG_DBS}"
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_log="${LOG_REC}"
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
ary_cmd+=( "debootstrap" "--arch=${var_arch}" "--keep-debootstrap-dir" "--log-extra-deps" "--merged-usr" ) ary_cmd+=( "debootstrap" "--arch=${var_arch}" "--keep-debootstrap-dir" "--log-extra-deps" "--merged-usr" )
if [[ -n "${var_includes}" ]]; then ary_cmd+=( "--include=${var_includes}" ); fi if [[ -n "${var_includes}" ]]; then ary_cmd+=( "--include=${var_includes}" ); fi
@@ -45,7 +54,7 @@ func_debootstrap() {
do_log "debug" "file_only" "4000() Executing: [${ary_cmd[*]}]" do_log "debug" "file_only" "4000() Executing: [${ary_cmd[*]}]"
# shellcheck disable=SC2312 # shellcheck disable=SC2312
if "${ary_cmd[@]}" | tee "${LOG_DBS}"; then if "${ary_cmd[@]}" | tee "${var_log}"; then
do_log "info" "file_only" "4000() [${ary_cmd[*]}] successful." do_log "info" "file_only" "4000() [${ary_cmd[*]}] successful."
@@ -54,6 +63,7 @@ func_debootstrap() {
install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/hooks" install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/hooks"
install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/keys" install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/keys"
install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/log" install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/log"
install -d -m 0700 -o root -g root "${var_target}/root/.ciss/cdi/log/pre-env"
mv -T "${var_target}/debootstrap" "${var_target}/root/.ciss/cdi/debootstrap" mv -T "${var_target}/debootstrap" "${var_target}/root/.ciss/cdi/debootstrap"
@@ -61,7 +71,7 @@ func_debootstrap() {
chmod 0700 "${var_target}/root/.ciss/cdi" chmod 0700 "${var_target}/root/.ciss/cdi"
chmod 0700 "${var_target}/root/.ciss/cdi/debootstrap" chmod 0700 "${var_target}/root/.ciss/cdi/debootstrap"
guard_dir && return 0 guard_dir; return 0
else else
@@ -70,4 +80,7 @@ func_debootstrap() {
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f func_debootstrap
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Preliminary post debootstrap checks. # Preliminary post debootstrap checks.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -24,10 +26,14 @@ guard_sourcing
check_debootstrap() { check_debootstrap() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4005_debootstrap_checks.log" declare -r var_logfile="/root/.ciss/cdi/log/4005_debootstrap_checks.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_script "${TARGET}" " chroot_logger "${var_target}${var_logfile}"
chroot_script "${var_target}" "
{ {
### Header ### Header
echo '==[debootstrap checks]==' echo '==[debootstrap checks]=='
@@ -78,6 +84,9 @@ check_debootstrap() {
} >> ${var_logfile} } >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f check_debootstrap
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,25 +10,26 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Configure the target system for chroot. # Configure the target system for chroot.
# Globals: # Globals:
# ERR_CHRT_MOUNTS # RECOVERY
# TARGET # TARGET
# VAR_CHROOT_ACTIVATED # VAR_CHROOT_ACTIVATED
# VAR_NEED_RUN_IN_TARGET # VAR_NEED_RUN_IN_TARGET
# VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# ERR_CHRT_MOUNTS
# 0: on success # 0: on success
# ERR_CHRT_MOUNTS: on failure
####################################### #######################################
prepare_mounts() { prepare_mounts() {
### Notes ### Notes
# This file mounts all necessary pseudo filesystems into the target root environment to enable chroot operations. # This function mounts all necessary pseudo filesystems into the target root environment to enable chroot operations.
# --rbind: recursive binding. # --rbind: recursive binding.
# --make-rslave: In this case, the mount point is marked as 'slave'. # --make-rslave: In this case, the mount point is marked as 'slave'.
# This means changes to the source mount (e.g., /proc) are propagated to the target mount (e.g., "${TARGET}/proc"). # This means changes to the source mount (e.g., /proc) are propagated to the target mount (e.g., "${TARGET}/proc").
@@ -52,68 +53,80 @@ prepare_mounts() {
) )
declare var_path="" var_fs="" var_src="" var_opts="" declare var_path="" var_fs="" var_src="" var_opts=""
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
for var_path in "${!HMP_SPECIAL_MOUNTS[@]}"; do for var_path in "${!HMP_SPECIAL_MOUNTS[@]}"; do
mkdir -p "${TARGET}${var_path}" mkdir -p "${var_target}${var_path}"
done done
for var_path in "${!HMP_SPECIAL_MOUNTS[@]}"; do for var_path in "${!HMP_SPECIAL_MOUNTS[@]}"; do
IFS=" " read -r var_fs var_src var_opts <<< "${HMP_SPECIAL_MOUNTS[${var_path}]}" IFS=" " read -r var_fs var_src var_opts <<< "${HMP_SPECIAL_MOUNTS[${var_path}]}"
if mountpoint -q "${TARGET}${var_path}"; then if mountpoint -q "${var_target}${var_path}"; then
do_log "info" "file_only" "4010() Skipped: '${TARGET}${var_path}' is already a mountpoint." do_log "info" "file_only" "4010() Skipped: '${var_target}${var_path}' is already a mountpoint."
continue continue
fi fi
if ! mount -t "${var_fs}" "${var_src}" "${TARGET}${var_path}" -o "${var_opts}"; then if ! mount -t "${var_fs}" "${var_src}" "${var_target}${var_path}" -o "${var_opts}"; then
do_log "emergency" "file_only" "4010() Command: [mount -t ${var_fs} ${var_src} ${TARGET}${var_path} -o ${var_opts}] failed." do_log "emergency" "file_only" "4010() Command: [mount -t ${var_fs} ${var_src} ${var_target}${var_path} -o ${var_opts}] failed."
return "${ERR_CHRT_MOUNTS}" return "${ERR_CHRT_MOUNTS}"
fi fi
do_log "info" "file_only" "4010() Command: [mount -t ${var_fs} ${var_src} ${TARGET}${var_path} -o ${var_opts}] successful." do_log "info" "file_only" "4010() Command: [mount -t ${var_fs} ${var_src} ${var_target}${var_path} -o ${var_opts}] successful."
done done
if [[ "${VAR_NEED_RUN_IN_TARGET:-false}" == "true" ]]; then if [[ "${VAR_NEED_RUN_IN_TARGET:-false}" == "true" ]]; then
mkdir -p "${TARGET}/run" mkdir -p "${var_target}/run"
if ! mount --make-rslave --rbind /run "${TARGET}/run"; then if ! mount --make-rslave --rbind /run "${var_target}/run"; then
do_log "emergency" "file_only" "4010() Command: [mount --make-rslave --rbind /run ${TARGET}/run] failed." do_log "emergency" "file_only" "4010() Command: [mount --make-rslave --rbind /run ${var_target}/run] failed."
return "${ERR_CHRT_MOUNTS}" return "${ERR_CHRT_MOUNTS}"
fi fi
do_log "info" "file_only" "4010() Command: [mount --make-rslave --rbind /run ${TARGET}/run] successful." do_log "info" "file_only" "4010() Command: [mount --make-rslave --rbind /run ${var_target}/run] successful."
fi fi
if ! chroot_exec "${var_target}" mkdir -p /etc/systemd/system/multi-user.target.wants; then
if ! chroot_exec "${TARGET}" mkdir -p /etc/systemd/system/multi-user.target.wants; then do_log "emergency" "file_only" "4010() Command: [chroot_exec ${var_target} mkdir -p /etc/systemd/system/multi-user.target.wants] failed."
do_log "emergency" "file_only" "4010() Command: [chroot_exec ${TARGET} mkdir -p /etc/systemd/system/multi-user.target.wants] failed."
return "${ERR_CHRT_MOUNTS}" return "${ERR_CHRT_MOUNTS}"
fi fi
do_log "info" "file_only" "4010() Command: [chroot_exec ${TARGET} mkdir -p /etc/systemd/system/multi-user.target.wants] successful." do_log "info" "file_only" "4010() Command: [chroot_exec ${var_target} mkdir -p /etc/systemd/system/multi-user.target.wants] successful."
mkdir -p "${TARGET}/media/cdrom0" mkdir -p "${var_target}/media/cdrom0"
# shellcheck disable=SC2034 if [[ "${VAR_RUN_RECOVERY}" == "false" ]]; then
declare -gx VAR_CHROOT_ACTIVATED="system"
do_log "info" "file_only" "4010() Command: [declare -gx VAR_CHROOT_ACTIVATED=system]"
guard_dir && return 0 declare -gx VAR_CHROOT_ACTIVATED="system"
do_log "info" "file_only" "4010() Command: [declare -gx VAR_CHROOT_ACTIVATED=system]"
elif [[ "${VAR_RUN_RECOVERY}" == "true" ]]; then
declare -gx VAR_CHROOT_ACTIVATED="recovery"
do_log "info" "file_only" "4010() Command: [declare -gx VAR_CHROOT_ACTIVATED=recovery]"
fi
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f prepare_mounts
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,62 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
#######################################
# Prepare '/root' for XDG framework.
# Globals:
# RECOVERY
# TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH
# Arguments:
# None
# Returns:
# 0: on success
#######################################
prepare_xdg_root() {
### Declare Arrays, HashMaps, and Variables.
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -m 0755 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/profile.d/ciss-xdg.sh" "${var_target}/etc/profile.d/"
install -m 0444 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/default/ciss-xdg-profile" "${var_target}/etc/default/"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/ciss_xdg_tmp.sh" "${var_target}/root/"
# shellcheck disable=SC2016
chroot_script "${var_target}" '
install -d -m 0755 /etc/xdg
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
### Create canonical directories.
_xdg_umask="$(umask)"
umask 0077
[[ -d "${XDG_CONFIG_HOME}" ]] || install -d -m 0700 -- "${XDG_CONFIG_HOME}"
[[ -d "${XDG_DATA_HOME}" ]] || install -d -m 0700 -- "${XDG_DATA_HOME}"
[[ -d "${XDG_CACHE_HOME}" ]] || install -d -m 0700 -- "${XDG_CACHE_HOME}"
[[ -d "${XDG_STATE_HOME}" ]] || install -d -m 0700 -- "${XDG_STATE_HOME}"
[[ -d "${XDG_STATE_HOME}/bash" ]] || install -d -m 0700 -- "${XDG_STATE_HOME}/bash"
[[ -d "${XDG_STATE_HOME}/less" ]] || install -d -m 0700 -- "${XDG_STATE_HOME}/less"
umask "$_xdg_umask"
unset _xdg_umask
'
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f prepare_xdg_root
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Check if the target system is not 'tainted: unmerged-usr'. # Check if the target system is not 'tainted: unmerged-usr'.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# architecture # architecture
# Arguments: # Arguments:
# None # None
@@ -25,25 +27,30 @@ guard_sourcing
check_usr_merge() { check_usr_merge() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4015_check_usr_merge.log" declare -r var_logfile="/root/.ciss/cdi/log/4015_check_usr_merge.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_logger "${var_target}${var_logfile}"
# shellcheck disable=SC2312 # shellcheck disable=SC2312
chroot_script "${TARGET}" " chroot_script "${var_target}" "
test -L /bin && test $(readlink -f /bin) = '/usr/bin' && echo 'MERGED:/bin' >> ${var_logfile} || echo 'UNMERGED:/bin' >> ${var_logfile} test -L /bin && test $(readlink -f /bin) = '/usr/bin' && echo 'MERGED:/bin' >> ${var_logfile} || echo 'UNMERGED:/bin' >> ${var_logfile}
test -L /sbin && test $(readlink -f /sbin) = '/usr/sbin' && echo 'MERGED:/sbin' >> ${var_logfile} || echo 'UNMERGED:/sbin' >> ${var_logfile} test -L /sbin && test $(readlink -f /sbin) = '/usr/sbin' && echo 'MERGED:/sbin' >> ${var_logfile} || echo 'UNMERGED:/sbin' >> ${var_logfile}
test -L /lib && test $(readlink -f /lib) = '/usr/lib' && echo 'MERGED:/lib' >> ${var_logfile} || echo 'UNMERGED:/lib' >> ${var_logfile} test -L /lib && test $(readlink -f /lib) = '/usr/lib' && echo 'MERGED:/lib' >> ${var_logfile} || echo 'UNMERGED:/lib' >> ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
if [[ "${architecture}" == "amd64" ]]; then if [[ "${architecture}" == "amd64" ]]; then
# shellcheck disable=SC2312 # shellcheck disable=SC2312
chroot_script "${TARGET}" " chroot_script "${var_target}" "
test -L /lib64 && test $(readlink -f /lib64) = '/usr/lib64' && echo 'MERGED:/lib64' >> ${var_logfile} || echo 'UNMERGED:/lib64' >> ${var_logfile} test -L /lib64 && test $(readlink -f /lib64) = '/usr/lib64' && echo 'MERGED:/lib64' >> ${var_logfile} || echo 'UNMERGED:/lib64' >> ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f check_usr_merge
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Chroot hook for deleting all expired X.509 certificates in the target system. # Chroot hook for deleting all expired X.509 certificates in the target system.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH # VAR_SETUP_PATH
# Arguments: # Arguments:
# None # None
@@ -23,21 +25,28 @@ guard_sourcing
# 0: on success # 0: on success
####################################### #######################################
remove_x509() { remove_x509() {
### Declare Arrays, HashMaps, and Variables.
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/chroot/hooks/4020_remove_x509.hooks.sh" \ install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/chroot/hooks/4020_remove_x509.hooks.sh" \
"${TARGET}/root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh" "${var_target}/root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh"
if ! chroot_script "${var_target}" "/root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh" "emergency"; then
if ! chroot_script "${TARGET}" "/root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh" "emergency"; then do_log "warn" "file_only" "4020() Command: [chroot_script ${var_target} /root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh emergency] failed."
do_log "warn" "file_only" "4020() Command: [chroot_script ${TARGET} /root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh emergency] failed."
else else
do_log "debug" "file_only" "4020() Command: [chroot_script ${TARGET} /root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh emergency] successful." do_log "debug" "file_only" "4020() Command: [chroot_script ${var_target} /root/.ciss/cdi/hooks/4020_remove_x509.hooks.sh emergency] successful."
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f remove_x509
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,16 +10,18 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Configure the '/etc/hostname' | '/etc/hosts' | '/etc/mailname' files. # Configure the '/etc/hostname' | '/etc/hosts' | '/etc/mailname' files.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_FINAL_FQDN # VAR_FINAL_FQDN
# VAR_FINAL_IPV4 # VAR_FINAL_IPV4
# VAR_FINAL_IPV6 # VAR_FINAL_IPV6
# VAR_LINK_IPV6 # VAR_LINK_IPV6
# VAR_RUN_RECOVERY
# network_ipv6 # network_ipv6
# Arguments: # Arguments:
# None # None
@@ -27,36 +29,42 @@ guard_sourcing
# 0: on success # 0: on success
####################################### #######################################
setup_hostname() { setup_hostname() {
### Create the '${TARGET}/etc/hostname' file. ### Declare Arrays, HashMaps, and Variables.
cat << EOF >| "${TARGET}/etc/hostname" declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
### Create the '${var_target}/etc/hostname' file.
cat << EOF >| "${var_target}/etc/hostname"
${VAR_FINAL_FQDN} ${VAR_FINAL_FQDN}
EOF EOF
chmod 0644 "${TARGET}/etc/hostname" chmod 0644 "${var_target}/etc/hostname"
do_log "info" "file_only" "4030() File generated: '${TARGET}/etc/hostname' | hostname '${VAR_FINAL_FQDN}'." do_log "info" "file_only" "4030() File generated: '${var_target}/etc/hostname' | hostname '${VAR_FINAL_FQDN}'."
### Create the '${TARGET}/etc/mailname' file. ### Create the '${var_target}/etc/mailname' file.
cat << EOF >| "${TARGET}/etc/mailname" cat << EOF >| "${var_target}/etc/mailname"
${VAR_FINAL_FQDN} ${VAR_FINAL_FQDN}
EOF EOF
chmod 0644 "${TARGET}/etc/mailname" chmod 0644 "${var_target}/etc/mailname"
do_log "info" "file_only" "4030() File generated: '${TARGET}/etc/mailname' | mailname '${VAR_FINAL_FQDN}'." do_log "info" "file_only" "4030() File generated: '${var_target}/etc/mailname' | mailname '${VAR_FINAL_FQDN}'."
### Generate '${TARGET}/etc/hosts' basic IPv4 entries ### Generate '${var_target}/etc/hosts' basic IPv4 entries
cat << EOF >| "${TARGET}/etc/hosts" cat << EOF >| "${var_target}/etc/hosts"
127.0.0.1 localhost 127.0.0.1 localhost
${VAR_FINAL_IPV4} ${VAR_FINAL_FQDN} ${VAR_FINAL_IPV4} ${VAR_FINAL_FQDN}
EOF EOF
chmod 0644 "${TARGET}/etc/hosts" chmod 0644 "${var_target}/etc/hosts"
do_log "info" "file_only" "4030() File generated: '${TARGET}/etc/hosts' with basic IPv4 entries." do_log "info" "file_only" "4030() File generated: '${var_target}/etc/hosts' with basic IPv4 entries."
### Generate '${TARGET}/etc/hosts' basic IPv6 entries ### Generate '${var_target}/etc/hosts' basic IPv6 entries
if [[ "${VAR_LINK_IPV6,,}" == "true" || "${network_ipv6,,}" == "true" ]]; then if [[ "${VAR_LINK_IPV6,,}" == "true" || "${network_ipv6,,}" == "true" ]]; then
cat << EOF >> "${TARGET}/etc/hosts" cat << EOF >> "${var_target}/etc/hosts"
# The following lines are desirable for IPv6 capable hosts # The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback ::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet fe00::0 ip6-localnet
@@ -68,10 +76,13 @@ ${VAR_FINAL_IPV6} ${VAR_FINAL_FQDN}
EOF EOF
do_log "info" "file_only" "4030() File updated: '${TARGET}/etc/hosts' with basic IPv6 entries." do_log "info" "file_only" "4030() File updated: '${var_target}/etc/hosts' with basic IPv6 entries."
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f setup_hostname
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,20 +10,18 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Configure the '/etc/resolv.conf' file. # Configure the '/etc/resolv.conf' file.
# Globals: # Globals:
# ARY_IPV4_NS # ARY_IPV4_NS
# ARY_IPV6_NS # ARY_IPV6_NS
# DIR_BAK # RECOVERY
# TARGET # TARGET
# VAR_ARCHITECTURE
# VAR_CODENAME
# VAR_FINAL_IPV6 # VAR_FINAL_IPV6
# VAR_LINK_IPV6 # VAR_LINK_IPV6
# VAR_VERSION # VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -32,59 +30,66 @@ guard_sourcing
setup_resolv() { setup_resolv() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare ns="" declare ns=""
declare var_target="${TARGET}"
if [[ -f "${TARGET}/etc/resolv.conf" ]]; then ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc" if [[ -f "${var_target}/etc/resolv.conf" ]]; then
mv "${TARGET}/etc/resolv.conf" "${TARGET}/root/.ciss/cdi/backup/etc/resolv.conf.bak"
do_log "info" "file_only" "4035() Existing '${TARGET}/etc/resolv.conf' moved." mkdir -p "${var_target}/root/.ciss/cdi/backup/etc"
mv "${var_target}/etc/resolv.conf" "${var_target}/root/.ciss/cdi/backup/etc/resolv.conf.bak"
do_log "info" "file_only" "4035() Existing '${var_target}/etc/resolv.conf' moved."
fi fi
touch "${TARGET}/etc/resolv.conf" touch "${var_target}/etc/resolv.conf"
chmod 0644 "${TARGET}/etc/resolv.conf" chmod 0644 "${var_target}/etc/resolv.conf"
### Create '/etc/resolv.conf' IPv4 entries for static configuration. ### Create '/etc/resolv.conf' IPv4 entries for static configuration.
insert_header "${TARGET}/etc/resolv.conf" insert_header "${var_target}/etc/resolv.conf"
insert_comments "${TARGET}/etc/resolv.conf" insert_comments "${var_target}/etc/resolv.conf"
cat << EOF >> "${TARGET}/etc/resolv.conf" cat << EOF >> "${var_target}/etc/resolv.conf"
### Custom DNS IPv4 configuration ### Custom DNS IPv4 configuration
EOF EOF
for ns in "${ARY_IPV4_NS[@]}"; do for ns in "${ARY_IPV4_NS[@]}"; do
echo "nameserver ${ns}" >> "${TARGET}/etc/resolv.conf" echo "nameserver ${ns}" >> "${var_target}/etc/resolv.conf"
do_log "info" "file_only" "4035() IPv4 nameserver added: [${ns}]." do_log "info" "file_only" "4035() IPv4 nameserver added: [${ns}]."
done done
echo "" >> "${TARGET}/etc/resolv.conf" echo "" >> "${var_target}/etc/resolv.conf"
do_log "info" "file_only" "4035() IPv4 nameserver at: '${TARGET}/etc/resolv.conf' configured." do_log "info" "file_only" "4035() IPv4 nameserver at: '${var_target}/etc/resolv.conf' configured."
### Create '/etc/resolv.conf' IPv6 entries for static configuration. ### Create '/etc/resolv.conf' IPv6 entries for static configuration.
if [[ "${VAR_LINK_IPV6,,}" == "true" || -n "${VAR_FINAL_IPV6}" ]]; then if [[ "${VAR_LINK_IPV6,,}" == "true" || -n "${VAR_FINAL_IPV6}" ]]; then
cat << EOF >> "${TARGET}/etc/resolv.conf" cat << EOF >> "${var_target}/etc/resolv.conf"
### Custom DNS IPv6 configuration ### Custom DNS IPv6 configuration
EOF EOF
for ns in "${ARY_IPV6_NS[@]}"; do for ns in "${ARY_IPV6_NS[@]}"; do
echo "nameserver ${ns}" >> "${TARGET}/etc/resolv.conf" echo "nameserver ${ns}" >> "${var_target}/etc/resolv.conf"
do_log "info" "file_only" "4035() IPv6 nameserver added: [${ns}]." do_log "info" "file_only" "4035() IPv6 nameserver added: [${ns}]."
done done
echo "" >> "${TARGET}/etc/resolv.conf" echo "" >> "${var_target}/etc/resolv.conf"
do_log "info" "file_only" "4035() IPv6 nameserver at: '${TARGET}/etc/resolv.conf' configured." do_log "info" "file_only" "4035() IPv6 nameserver at: '${var_target}/etc/resolv.conf' configured."
fi fi
cat << EOF >> "${TARGET}/etc/resolv.conf" cat << EOF >> "${var_target}/etc/resolv.conf"
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f setup_resolv
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Configure the '/etc/timezone' | '/etc/localtime' files. # Configure the '/etc/timezone' | '/etc/localtime' files.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# ntp_timezone # ntp_timezone
# Arguments: # Arguments:
# None # None
@@ -23,17 +25,26 @@ guard_sourcing
# 0: on success # 0: on success
####################################### #######################################
setup_timezone() { setup_timezone() {
### Create '${TARGET}/etc/timezone' file. ### Declare Arrays, HashMaps, and Variables.
cat << EOF >| "${TARGET}/etc/timezone" declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
### Create the '$ {var_target}/etc / timezone' file.
cat << EOF >| "${var_target}/etc/timezone"
${ntp_timezone:-UTC} ${ntp_timezone:-UTC}
EOF EOF
chmod 0644 "${TARGET}/etc/timezone" chmod 0644 "${var_target}/etc/timezone"
do_log "info" "file_only" "4040() File generated: '${TARGET}/etc/timezone' | timezone '${ntp_timezone:-UTC}'." do_log "info" "file_only" "4040() File generated: '${var_target}/etc/timezone' | timezone '${ntp_timezone:-UTC}'."
chroot_exec "${TARGET}" ln -sf "/usr/share/zoneinfo/${ntp_timezone}" /etc/localtime chroot_exec "${var_target}" ln -sf "/usr/share/zoneinfo/${ntp_timezone}" /etc/localtime
chroot_exec "${TARGET}" dpkg-reconfigure -f noninteractive tzdata chroot_exec "${var_target}" dpkg-reconfigure -f noninteractive tzdata
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f setup_timezone
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,16 +10,16 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Set locale, locale overrides and configure keyboard layout. # Set locale, locale overrides and configure keyboard layout.
# Globals: # Globals:
# ARY_LOCALE # ARY_LOCALE
# RECOVERY
# TARGET # TARGET
# VAR_ARCHITECTURE # VAR_DATE
# VAR_CODENAME # VAR_RUN_RECOVERY
# VAR_VERSION
# locale_country # locale_country
# locale_keyboard_xkb_keymap # locale_keyboard_xkb_keymap
# locale_language # locale_language
@@ -42,15 +42,22 @@ guard_sourcing
setup_locales() { setup_locales() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_locale_hook="/root/.ciss/cdi/hooks/4050_setup_locales.hooks.sh" declare var_locale_hook="/root/.ciss/cdi/hooks/4050_setup_locales.hooks.sh"
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
### Give priority to '${locale_locale}' over separately configured variables '${locale_country}' and '${locale_language}'. ### Give priority to '${locale_locale}' over separately configured variables '${locale_country}' and '${locale_language}'.
### If 'locale_locale' is not set, build it from 'locale_language' and 'locale_country'. ### If 'locale_locale' is not set, build it from 'locale_language' and 'locale_country'.
if [[ -n "${locale_language:-}" && -n "${locale_country:-}" && -z "${ARY_LOCALE[0]:-}" ]]; then if [[ -n "${locale_language:-}" && -n "${locale_country:-}" && -z "${ARY_LOCALE[0]:-}" ]]; then
# shellcheck disable=SC2034
ARY_LOCALE+="${locale_language}_${locale_country}.UTF-8" ARY_LOCALE+="${locale_language}_${locale_country}.UTF-8"
fi fi
### Creat Hook in target. ### Creat Hook in target.
cat << EOF >| "${TARGET}${var_locale_hook}" cat << EOF >| "${var_target}${var_locale_hook}"
#!/bin/bash #!/bin/bash
# SPDX-Version: 3.0 # SPDX-Version: 3.0
# SPDX-CreationInfo: ${VAR_DATE}; WEIDNER, Marc S.; <msw@coresecret.dev> # SPDX-CreationInfo: ${VAR_DATE}; WEIDNER, Marc S.; <msw@coresecret.dev>
@@ -72,7 +79,7 @@ declare loc=""
EOF EOF
cat << 'EOF' >> "${TARGET}${var_locale_hook}" cat << 'EOF' >> "${var_target}${var_locale_hook}"
ary_locale+=( "${locale_0}" ) ary_locale+=( "${locale_0}" )
[[ -n "${locale_1}" ]] && ary_locale+=( "${locale_1}" ) [[ -n "${locale_1}" ]] && ary_locale+=( "${locale_1}" )
@@ -94,7 +101,7 @@ done
EOF EOF
cat << EOF >> "${TARGET}${var_locale_hook}" cat << EOF >> "${var_target}${var_locale_hook}"
update-locale \ update-locale \
LANG=${ARY_LOCALE[0]} \ LANG=${ARY_LOCALE[0]} \
LC_ADDRESS=${locale_override_address:-${ARY_LOCALE[0]}} \ LC_ADDRESS=${locale_override_address:-${ARY_LOCALE[0]}} \
@@ -112,13 +119,13 @@ LC_IDENTIFICATION=${ARY_LOCALE[0]}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0700 "${TARGET}${var_locale_hook}" chmod 0700 "${var_target}${var_locale_hook}"
chroot_script "${TARGET}" "${var_locale_hook}" chroot_script "${var_target}" "${var_locale_hook}"
### Set the keyboard layout for the system (for consoles). ### Set the keyboard layout for the system (for consoles).
insert_header "${TARGET}/etc/default/keyboard" insert_header "${var_target}/etc/default/keyboard"
insert_comments "${TARGET}/etc/default/keyboard" insert_comments "${var_target}/etc/default/keyboard"
cat << EOF >> "${TARGET}/etc/default/keyboard" cat << EOF >> "${var_target}/etc/default/keyboard"
# KEYBOARD CONFIGURATION FILE # KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page. # Consult the keyboard(5) manual page.
@@ -130,9 +137,12 @@ BACKSPACE="guess"
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
chmod 0644 "${TARGET}/etc/default/keyboard" chmod 0644 "${var_target}/etc/default/keyboard"
do_log "info" "file_only" "4050() Keyboard layout updated: 'XKBLAYOUT=${locale_keyboard_xkb_keymap}' -> '${TARGET}/etc/default/keyboard'." do_log "info" "file_only" "4050() Keyboard layout updated: 'XKBLAYOUT=${locale_keyboard_xkb_keymap}' -> '${var_target}/etc/default/keyboard'."
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f setup_locales
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,101 @@
---
gitea: none
include_toc: true
---
# 1. CISS.debian.installer
**Centurion Intelligence Consulting Agency Information Security Standard**<br>
*The CISS Debian Installer provides a fully automated and hardened installation process.*<br>
**Master Version**: 8.00<br>
**Build**: V8.00.000.2025.06.17<br>
# 2. [4000_debootstrap.sh](../4000_debootstrap.sh)
This module provisions a minimal Debian userspace into the installers target root (`$TARGET`) using `debootstrap`.
It encapsulates argument construction, execution, logging, and the controlled hand-off of the `/debootstrap` working tree into a
private, permissions-hardened folder under `root/.ciss/cdi/`.
## 2.1. Responsibilities
- Resolve architecture, distribution codename, mirror, and optionally include-set from the global environment.
- Execute `debootstrap` with deterministic flags (`--keep-debootstrap-dir`, `--log-extra-deps`, `--merged-usr`) and optional `--include=`.
- Stream all `debootstrap` output to a dedicated log (`$LOG_DBS`) for reproducibility and forensics.
- Post-provisioning: create a sealed directory hierarchy beneath `$TARGET/root/.ciss/cdi/` and relocate the working directory
from `$TARGET/debootstrap` to `$TARGET/root/.ciss/cdi/debootstrap`.
- Emit structured progress diagnostics via the common logging facility.
- Return a specific non-zero error code on failure to enable consistent trap-level handling.
## 2.2. Inputs & Globals
- **`$VAR_ARCHITECTURE`** — target architecture (e.g., `amd64`, `arm64`).
- **`$VAR_CODENAME`** — Debian release codename (e.g., `trixie`).
- **`$debootstrap_mirror`** — HTTP/HTTPS mirror base URL.
- **`$debootstrap_includes`** — comma-separated package list to seed into the base system (optional).
- **`$TARGET`** — absolute mount path of the target root filesystem.
- **`$LOG_DBS`** — file path to receive `debootstrap` combined output via `tee`.
- **`ERR_DEBOOTSTRAP`** — module-specific error code for uniform failure signaling.
> All variables are expected to be pre-validated and exported by the installer setup/bootstrap chain.
## 2.3. Execution Flow
* **Command assembly**
- Build `ary_cmd` as:
```
debootstrap \
--arch="${VAR_ARCHITECTURE}" \
--keep-debootstrap-dir \
--log-extra-deps \
--merged-usr \
[--include="${debootstrap_includes}"] \
"${VAR_CODENAME}" "${TARGET}" "${debootstrap_mirror}"
```
- Emit a debug log line with the fully materialized command.
* **Run & log**
- Execute the array-form command; pipe stdout/stderr to `$LOG_DBS` using `tee`.
- On success, emit an informational log entry; on failure, emit an emergency log and `return ${ERR_DEBOOTSTRAP}`.
* **Post-provisioning layout (on success)**
- Create (mode `0700`, owned by `root:root`) under `$TARGET/root/.ciss/cdi/`:
- `backup/`, `debootstrap/`, `hooks/`, `keys/`, `log/`
- Move the working directory:
- `mv -T "$TARGET/debootstrap" "$TARGET/root/.ciss/cdi/debootstrap"`
- Reassert restrictive permissions on `.ciss/`, `.ciss/cdi/`, and `.ciss/cdi/debootstrap/`.
- Invoke `guard_dir` (module guard) and return `0`.
## 2.4. Design Paradigms
- **Array-based invocation**: Prevents word-splitting and globbing pitfalls; arguments are passed verbatim to `execve`.
- **Deterministic defaults**:
- `--merged-usr`: aligns the base system with usrmerge conventions (Debian ≥ 12).
- `--keep-debootstrap-dir`: preserves provenance and the exact state of the bootstrap transaction.
- `--log-extra-deps`: surfaces additional dependency resolution in logs for auditability.
- **Fail-fast and traceable**: Execution is meant to run under global hardening (`set -Ceuo pipefail`, `inherit_errexit`) and
integrates with the installer trap/debug framework; logs are persisted for triage.
## 2.5. Security Considerations
- **Least exposure of artifacts**: The bootstrap working directory is relocated into a sealed, root-only area (`0700`).
This avoids exposing transient metadata under world-readable paths.
- **No shell expansion in command string**: Array execution and explicit variables reduce injection risk and ambiguity.
- **Privilege hygiene**: Directory creation and moves are executed with explicit ownership/mode; no reliance on ambient umask.
- **Provenance retention**: Keeping the original `debootstrap` directory (under a protected path) allows later verification of
package selection, scripts, and logs.
## 2.6. Logging & Artifacts
- **Primary log**: `${LOG_DBS}` receives the raw `debootstrap` stream (via `tee`).
- **Provenance**: `${TARGET}/root/.ciss/cdi/debootstrap/` contains the retained working directory after a successful run.
- **Installer meta-folders**: `${TARGET}/root/.ciss/cdi/{backup,debootstrap,hooks,keys,log}/` (all `0700`).
These artifacts integrate with the global debug facilities when enabled.
## 2.7. Failure Modes & Exit Codes
- **Network or mirror failure** → non-zero `debootstrap` exit → module returns `ERR_DEBOOTSTRAP`.
- **Invalid codename/arch** → early `debootstrap` abort → `ERR_DEBOOTSTRAP`.
- **Insufficient permissions or target not writable** → directory creation/move fails → `ERR_DEBOOTSTRAP`.
Errors are surfaced to the installers `ERR`/`EXIT` traps, which will record environment, stack, and runtime context.
## 2.8. Best Practices
- Use `--include` judiciously; keep the base system minimal and defer optional packages to dedicated post-bootstrap tasks.
- Treat `${TARGET}/root/.ciss/cdi/` as sensitive metadata: back it up or snapshot it if you require later audits.
---
**[no tracking | no logging | no advertising | no profiling | no bullshit](https://coresecret.eu/)**
<!-- vim: set number et ts=2 sw=2 sts=2 ai tw=128 ft=markdown -->

View File

@@ -10,15 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Generate target '/etc/apt/sources.list' entries. # Generate target '/etc/apt/sources.list' entries.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_ARCHITECTURE # VAR_RUN_RECOVERY
# VAR_CODENAME
# VAR_VERSION
# apt_contrib # apt_contrib
# apt_deb_sources # apt_deb_sources
# apt_mirror_directory # apt_mirror_directory
@@ -39,8 +38,12 @@ guard_sourcing
####################################### #######################################
generate_sources() { generate_sources() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -a ary_components=() declare -a ary_components=()
declare var_arch="" var_codename="" var_deb_src="" var_dir="" var_hostname="" var_hostsecure="" var_url="" var_surl="" declare var_arch="" var_codename="" var_deb_src="" var_dir="" var_hostname="" var_hostsecure="" var_url="" var_surl=""
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
# shellcheck disable=SC2154 # "${architecture}" # shellcheck disable=SC2154 # "${architecture}"
var_arch="${architecture,,}" var_arch="${architecture,,}"
@@ -77,25 +80,25 @@ generate_sources() {
fi fi
: >| "${TARGET}/etc/apt/sources.list" : >| "${var_target}/etc/apt/sources.list"
chmod 0644 "${TARGET}/etc/apt/sources.list" chmod 0644 "${var_target}/etc/apt/sources.list"
### Main Repository ### Main Repository
# shellcheck disable=SC2153 # shellcheck disable=SC2153
insert_header "${TARGET}/etc/apt/sources.list" insert_header "${var_target}/etc/apt/sources.list"
insert_comments "${TARGET}/etc/apt/sources.list" insert_comments "${var_target}/etc/apt/sources.list"
cat << EOF >> "${TARGET}/etc/apt/sources.list" cat << EOF >> "${var_target}/etc/apt/sources.list"
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
# OFFICIAL DEBIAN REPOS # # OFFICIAL DEBIAN REPOS #
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
deb ${var_url} ${var_codename} ${ary_components[*]} deb ${var_url} ${var_codename} ${ary_components[*]}
EOF EOF
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename} ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename} ${ary_components[*]}'."
if [[ "${var_deb_src}" == "true" ]]; then if [[ "${var_deb_src}" == "true" ]]; then
echo "deb-src ${var_url} ${var_codename} ${ary_components[*]}" >> "${TARGET}/etc/apt/sources.list" echo "deb-src ${var_url} ${var_codename} ${ary_components[*]}" >> "${var_target}/etc/apt/sources.list"
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename} ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename} ${ary_components[*]}'."
fi fi
@@ -103,16 +106,16 @@ EOF
### Security Repository ### Security Repository
if [[ "${apt_updates_security,,}" == "true" ]]; then if [[ "${apt_updates_security,,}" == "true" ]]; then
cat << EOF >> "${TARGET}/etc/apt/sources.list" cat << EOF >> "${var_target}/etc/apt/sources.list"
deb ${var_surl} ${var_codename}-security ${ary_components[*]} deb ${var_surl} ${var_codename}-security ${ary_components[*]}
EOF EOF
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb ${var_surl} ${var_codename}-security ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb ${var_surl} ${var_codename}-security ${ary_components[*]}'."
if [[ "${var_deb_src}" == "true" ]]; then if [[ "${var_deb_src}" == "true" ]]; then
echo "deb-src ${var_surl} ${var_codename}-security ${ary_components[*]}" >> "${TARGET}/etc/apt/sources.list" echo "deb-src ${var_surl} ${var_codename}-security ${ary_components[*]}" >> "${var_target}/etc/apt/sources.list"
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb-src ${var_surl} ${var_codename}-security ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb-src ${var_surl} ${var_codename}-security ${ary_components[*]}'."
fi fi
@@ -122,16 +125,16 @@ EOF
### Updates Repository ### Updates Repository
if [[ "${apt_updates_release,,}" == "true" ]]; then if [[ "${apt_updates_release,,}" == "true" ]]; then
cat << EOF >> "${TARGET}/etc/apt/sources.list" cat << EOF >> "${var_target}/etc/apt/sources.list"
deb ${var_url} ${var_codename}-updates ${ary_components[*]} deb ${var_url} ${var_codename}-updates ${ary_components[*]}
EOF EOF
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename}-updates ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename}-updates ${ary_components[*]}'."
if [[ "${var_deb_src}" == "true" ]]; then if [[ "${var_deb_src}" == "true" ]]; then
echo "deb-src ${var_url} ${var_codename}-updates ${ary_components[*]}" >> "${TARGET}/etc/apt/sources.list" echo "deb-src ${var_url} ${var_codename}-updates ${ary_components[*]}" >> "${var_target}/etc/apt/sources.list"
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename}-updates ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename}-updates ${ary_components[*]}'."
fi fi
@@ -141,16 +144,16 @@ EOF
### Backports Repository ### Backports Repository
if [[ "${apt_updates_backports,,}" == "true" ]]; then if [[ "${apt_updates_backports,,}" == "true" ]]; then
cat << EOF >> "${TARGET}/etc/apt/sources.list" cat << EOF >> "${var_target}/etc/apt/sources.list"
deb ${var_url} ${var_codename}-backports ${ary_components[*]} deb ${var_url} ${var_codename}-backports ${ary_components[*]}
EOF EOF
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename}-backports ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb ${var_url} ${var_codename}-backports ${ary_components[*]}'."
if [[ "${var_deb_src,,}" == "true" ]]; then if [[ "${var_deb_src,,}" == "true" ]]; then
echo "deb-src ${var_url} ${var_codename}-backports ${ary_components[*]}" >> "${TARGET}/etc/apt/sources.list" echo "deb-src ${var_url} ${var_codename}-backports ${ary_components[*]}" >> "${var_target}/etc/apt/sources.list"
do_log "info" "file_only" "4100() ${TARGET}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename}-backports ${ary_components[*]}'." do_log "info" "file_only" "4100() ${var_target}/etc/apt/sources.list entry generated: 'deb-src ${var_url} ${var_codename}-backports ${ary_components[*]}'."
fi fi
@@ -158,32 +161,35 @@ EOF
### Clean up 'sources.list' ### Clean up 'sources.list'
sed -i '/^#/!s/[[:space:]]\+/ /g' "${TARGET}/etc/apt/sources.list" sed -i '/^#/!s/[[:space:]]\+/ /g' "${var_target}/etc/apt/sources.list"
cat << EOF >> "${TARGET}/etc/apt/sources.list" cat << EOF >> "${var_target}/etc/apt/sources.list"
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
insert_header "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" insert_header "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
insert_comments "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" insert_comments "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
cat << 'EOF' >> "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" cat << 'EOF' >> "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
Acquire::PDiffs "false"; Acquire::PDiffs "false";
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
sed -i -E 's|^([[:space:]]*)#+|\1//|' "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" sed -i -E 's|^([[:space:]]*)#+|\1//|' "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
insert_header "${TARGET}/etc/apt/apt.conf.d/91-acquire" insert_header "${var_target}/etc/apt/apt.conf.d/91-acquire"
insert_comments "${TARGET}/etc/apt/apt.conf.d/91-acquire" insert_comments "${var_target}/etc/apt/apt.conf.d/91-acquire"
cat << 'EOF' >> "${TARGET}/etc/apt/apt.conf.d/91-acquire" cat << 'EOF' >> "${var_target}/etc/apt/apt.conf.d/91-acquire"
Acquire::Retries "3"; Acquire::Retries "3";
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
sed -i -E 's|^([[:space:]]*)#+|\1//|' "${TARGET}/etc/apt/apt.conf.d/91-acquire" sed -i -E 's|^([[:space:]]*)#+|\1//|' "${var_target}/etc/apt/apt.conf.d/91-acquire"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_sources
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Generate target '/etc/apt/sources.list.d/' deb.822 entries. # Generate target '/etc/apt/sources.list.d/' deb.822 entries.
@@ -36,8 +36,12 @@ guard_sourcing
####################################### #######################################
generate_sources822() { generate_sources822() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -a ary_components=() ary_types=() declare -a ary_components=() ary_types=()
declare var_arch="" var_codename="" var_deb_src="" var_dir="" var_hostname="" var_hostsecure="" var_url="" var_surl="" declare var_arch="" var_codename="" var_deb_src="" var_dir="" var_hostname="" var_hostsecure="" var_url="" var_surl=""
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
# shellcheck disable=SC2154 # "${architecture}" # shellcheck disable=SC2154 # "${architecture}"
var_arch="${architecture,,}" var_arch="${architecture,,}"
@@ -79,9 +83,9 @@ generate_sources822() {
### Main Repository ### Main Repository
insert_header "${TARGET}/etc/apt/sources.list.d/trixie.sources" insert_header "${var_target}/etc/apt/sources.list.d/trixie.sources"
insert_comments "${TARGET}/etc/apt/sources.list.d/trixie.sources" insert_comments "${var_target}/etc/apt/sources.list.d/trixie.sources"
cat << EOF >> "${TARGET}/etc/apt/sources.list.d/trixie.sources" cat << EOF >> "${var_target}/etc/apt/sources.list.d/trixie.sources"
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
# OFFICIAL DEBIAN REPOS # # OFFICIAL DEBIAN REPOS #
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
@@ -98,9 +102,9 @@ EOF
### Security Repository ### Security Repository
if [[ "${apt_updates_security,,}" == "true" ]]; then if [[ "${apt_updates_security,,}" == "true" ]]; then
insert_header "${TARGET}/etc/apt/sources.list.d/trixie-security.sources" insert_header "${var_target}/etc/apt/sources.list.d/trixie-security.sources"
insert_comments "${TARGET}/etc/apt/sources.list.d/trixie-security.sources" insert_comments "${var_target}/etc/apt/sources.list.d/trixie-security.sources"
cat << EOF >> "${TARGET}/etc/apt/sources.list.d/trixie-security.sources" cat << EOF >> "${var_target}/etc/apt/sources.list.d/trixie-security.sources"
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
# OFFICIAL DEBIAN REPOS # # OFFICIAL DEBIAN REPOS #
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
@@ -117,9 +121,9 @@ EOF
### Updates Repository ### Updates Repository
if [[ "${apt_updates_release,,}" == "true" ]]; then if [[ "${apt_updates_release,,}" == "true" ]]; then
insert_header "${TARGET}/etc/apt/sources.list.d/trixie-updates.sources" insert_header "${var_target}/etc/apt/sources.list.d/trixie-updates.sources"
insert_comments "${TARGET}/etc/apt/sources.list.d/trixie-updates.sources" insert_comments "${var_target}/etc/apt/sources.list.d/trixie-updates.sources"
cat << EOF >> "${TARGET}/etc/apt/sources.list.d/trixie-updates.sources" cat << EOF >> "${var_target}/etc/apt/sources.list.d/trixie-updates.sources"
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
# OFFICIAL DEBIAN REPOS # # OFFICIAL DEBIAN REPOS #
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
@@ -137,9 +141,9 @@ EOF
### Backports Repository ### Backports Repository
if [[ "${apt_updates_backports,,}" == "true" ]]; then if [[ "${apt_updates_backports,,}" == "true" ]]; then
insert_header "${TARGET}/etc/apt/sources.list.d/trixie-backports.sources" insert_header "${var_target}/etc/apt/sources.list.d/trixie-backports.sources"
insert_comments "${TARGET}/etc/apt/sources.list.d/trixie-backports.sources" insert_comments "${var_target}/etc/apt/sources.list.d/trixie-backports.sources"
cat << EOF >> "${TARGET}/etc/apt/sources.list.d/trixie-backports.sources" cat << EOF >> "${var_target}/etc/apt/sources.list.d/trixie-backports.sources"
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
# OFFICIAL DEBIAN REPOS # # OFFICIAL DEBIAN REPOS #
#------------------------------------------------------------------------------------------------------------------------------# #------------------------------------------------------------------------------------------------------------------------------#
@@ -156,30 +160,33 @@ EOF
fi fi
if [[ -f "${TARGET}/etc/apt/sources.list" ]]; then if [[ -f "${var_target}/etc/apt/sources.list" ]]; then
rm -f "${TARGET}/etc/apt/sources.list" rm -f "${var_target}/etc/apt/sources.list"
fi fi
insert_header "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" insert_header "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
insert_comments "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" insert_comments "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
cat << 'EOF' >> "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" cat << 'EOF' >> "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
Acquire::PDiffs "false"; Acquire::PDiffs "false";
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
sed -i -E 's|^([[:space:]]*)#+|\1//|' "${TARGET}/etc/apt/apt.conf.d/90-no-pdiffs" sed -i -E 's|^([[:space:]]*)#+|\1//|' "${var_target}/etc/apt/apt.conf.d/90-no-pdiffs"
insert_header "${TARGET}/etc/apt/apt.conf.d/91-acquire" insert_header "${var_target}/etc/apt/apt.conf.d/91-acquire"
insert_comments "${TARGET}/etc/apt/apt.conf.d/91-acquire" insert_comments "${var_target}/etc/apt/apt.conf.d/91-acquire"
cat << 'EOF' >> "${TARGET}/etc/apt/apt.conf.d/91-acquire" cat << 'EOF' >> "${var_target}/etc/apt/apt.conf.d/91-acquire"
Acquire::Retries "3"; Acquire::Retries "3";
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
sed -i -E 's|^([[:space:]]*)#+|\1//|' "${TARGET}/etc/apt/apt.conf.d/91-acquire" sed -i -E 's|^([[:space:]]*)#+|\1//|' "${var_target}/etc/apt/apt.conf.d/91-acquire"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_sources822
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Update generated sources. # Update generated sources.
@@ -18,7 +18,9 @@ guard_sourcing
# to suppress the 'update-initramfs'-Kernel-Hooks, according to the initramfs-tools manpage: # to suppress the 'update-initramfs'-Kernel-Hooks, according to the initramfs-tools manpage:
# https://manpages.debian.org/testing/initramfs-tools-core/initramfs-tools.7.en.html # https://manpages.debian.org/testing/initramfs-tools-core/initramfs-tools.7.en.html
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# apt_updates_policy # apt_updates_policy
# Arguments: # Arguments:
# None # None
@@ -28,35 +30,42 @@ guard_sourcing
update_sources() { update_sources() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4110_update_sources.log" declare -r var_logfile="/root/.ciss/cdi/log/4110_update_sources.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_logger "${var_target}${var_logfile}"
### Update generated sources. ### Update generated sources.
# shellcheck disable=SC2312 # shellcheck disable=SC2312
chroot_script "${TARGET}" "apt-get update 2>&1 | tee -a ${var_logfile}; echo ExitCode: \$? >> ${var_logfile}" chroot_script "${var_target}" "
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get update 2>&1 | tee -a ${var_logfile}
"
do_log "info" "file_only" "4110() Sources lists: updated successfully." do_log "info" "file_only" "4110() Sources lists: updated successfully."
### Update unattended, security, or no unattended updates at all. ### Update unattended, security, or no unattended updates at all.
if [[ "${apt_updates_policy,,}" == "unattended" ]]; then if [[ "${apt_updates_policy,,}" == "unattended" ]]; then
chroot_script "${TARGET}" " chroot_script "${var_target}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests unattended-upgrades 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests unattended-upgrades 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
do_log "info" "file_only" "4110() The update policy was set at installation time to: '${apt_updates_policy}'." do_log "info" "file_only" "4110() The update policy was set at installation time to: '${apt_updates_policy}'."
elif [[ "${apt_updates_policy,,}" == "security" ]]; then elif [[ "${apt_updates_policy,,}" == "security" ]]; then
chroot_script "${TARGET}" " chroot_script "${var_target}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests unattended-upgrades 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests unattended-upgrades 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
# shellcheck disable=SC2016 # shellcheck disable=SC2016
sed -i 's/^[[:space:]]*"origin=Debian,codename=\${distro_codename},label=Debian";/\/\/ &/' "${TARGET}/etc/apt/apt.conf.d/50unattended-upgrades" sed -i 's/^[[:space:]]*"origin=Debian,codename=\${distro_codename},label=Debian";/\/\/ &/' "${var_target}/etc/apt/apt.conf.d/50unattended-upgrades"
do_log "info" "file_only" "4110() The update policy was set at installation time to: '${apt_updates_policy}'." do_log "info" "file_only" "4110() The update policy was set at installation time to: '${apt_updates_policy}'."
elif [[ "${apt_updates_policy,,}" == "none" ]]; then elif [[ "${apt_updates_policy,,}" == "none" ]]; then
@@ -69,6 +78,9 @@ update_sources() {
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f update_sources
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Installation of the specified kernel. # Installation of the specified kernel.
@@ -34,29 +34,31 @@ installation_kernel() {
if [[ -n "${VAR_KERNEL}" ]]; then if [[ -n "${VAR_KERNEL}" ]]; then
chroot_script "${TARGET}" ' chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
apt-get install -y --no-install-recommends --no-install-suggests '"${VAR_KERNEL}"' initramfs-tools 2>&1 | tee -a '"${var_logfile}"' [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: $? >> '"${var_logfile}"' apt-get install -y --no-install-recommends --no-install-suggests ${VAR_KERNEL} initramfs-tools 2>&1 | tee -a ${var_logfile}
' "
do_log "info" "file_only" "4120() Kernel image: '${VAR_KERNEL}' installed successfully." do_log "info" "file_only" "4120() Kernel image: '${VAR_KERNEL}' installed successfully."
guard_dir && return 0 guard_dir; return 0
else else
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ${image} initramfs-tools 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests ${image} initramfs-tools 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
do_log "info" "file_only" "4120() Kernel image: '${image}' installed successfully." do_log "info" "file_only" "4120() Kernel image: '${image}' installed successfully."
guard_dir && return 0 guard_dir; return 0
fi fi
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_kernel
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Installation of 'initramfs'-environment. # Installation of 'initramfs'-environment.
@@ -28,7 +28,14 @@ guard_sourcing
####################################### #######################################
installation_initramfs() { installation_initramfs() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_modules="" declare var_modules="" var_whereiam=""
# shellcheck disable=SC2312
if [[ -x "$(command -v virt-what)" ]]; then
var_whereiam=$(virt-what | head -n1)
else
var_whereiam=$(grep -iE 'kvm|vmware|qemu' /sys/class/dmi/id/product_name 2>/dev/null || echo "baremetal")
fi
mkdir -p "${TARGET}/etc/initramfs-tools/files" mkdir -p "${TARGET}/etc/initramfs-tools/files"
@@ -41,13 +48,29 @@ installation_initramfs() {
var_modules=$(grep_nic_driver_modules) var_modules=$(grep_nic_driver_modules)
cat << EOF >> "${TARGET}/etc/initramfs-tools/modules" cat << EOF >> "${TARGET}/etc/initramfs-tools/modules"
### Custom NIC driver:
### Custom NIC driver
${var_modules} ${var_modules}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
if [[ "${var_whereiam}" =~ ^(kvm|vmware|qemu)$ ]]; then
cat << EOF >> "${TARGET}/etc/initramfs-tools/modules"
### QEMU Bochs-compatible virtual machine support:
bochs
### Virtio support:
virtio_pci
virtio_blk
virtio_scsi
virtio_console
virtio_rng
EOF
fi
printf "%s\n" '# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf' >> "${TARGET}/etc/initramfs-tools/modules"
### MODULES: [ most | netboot | dep | list ] ### MODULES: [ most | netboot | dep | list ]
## 'most' - Add most filesystem and all hard-drive drivers. ## 'most' - Add most filesystem and all hard-drive drivers.
## 'dep' - Try and guess the modules to load. ## 'dep' - Try and guess the modules to load.
@@ -71,6 +94,13 @@ FSTYPE=${VAR_ROOT_FS}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
guard_dir && return 0 cat << EOF >> "${TARGET}/etc/initramfs-tools/conf.d/resume"
RESUME=none
EOF
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_initramfs
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Check and set up the minimum required tools for the next installation steps. # Check and set up the minimum required tools for the next installation steps.
@@ -49,8 +49,8 @@ installation_toolset() {
[awk]="gawk" [awk]="gawk"
[gdisk]="gdisk" [gdisk]="gdisk"
[gnupg]="gnupg" [gnupg]="gnupg"
[haveged]="haveged"
[update-initramfs]="initramfs-tools" [update-initramfs]="initramfs-tools"
[jitterentropy-rngd]="jitterentropy-rngd"
[jq]="jq" [jq]="jq"
[loadkeys]="kbd" [loadkeys]="kbd"
[setfont]="kbd" [setfont]="kbd"
@@ -60,7 +60,9 @@ installation_toolset() {
[parted]="parted" [parted]="parted"
[lspci]="pciutils" [lspci]="pciutils"
[pwgen]="pwgen" [pwgen]="pwgen"
[rsyslogd]="rsyslog"
[sudo]="sudo" [sudo]="sudo"
[pam_systemd]="libpam-systemd"
[tree]="tree" [tree]="tree"
[unzip]="unzip" [unzip]="unzip"
[lsusb]="usbutils" [lsusb]="usbutils"
@@ -95,12 +97,15 @@ installation_toolset() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ${ary_unique_pkgs[*]} 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests ${ary_unique_pkgs[*]} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_toolset
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Ensure systemd is in place. # Ensure systemd is in place.
@@ -35,8 +35,8 @@ installation_systemd() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests systemd systemd-sysv dbus 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests systemd systemd-sysv dbus 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
else else
@@ -49,6 +49,9 @@ installation_systemd() {
systemctl --version 2>&1 | tee -a ${var_logfile} | grep -qi 'systemd' || echo '[WARN]: systemd not verifiable' >> ${var_logfile} systemctl --version 2>&1 | tee -a ${var_logfile} | grep -qi 'systemd' || echo '[WARN]: systemd not verifiable' >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_systemd
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Generate machine-id if missing. # Generate machine-id if missing.
@@ -33,6 +33,9 @@ installation_machineid() {
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_machineid
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Turn off Energy saving mode and ctrl-alt-del. # Turn off Energy saving mode and ctrl-alt-del.
@@ -25,15 +25,16 @@ installation_masking() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
systemctl mask ctrl-alt-del.target sleep.target suspend.target hibernate.target hybrid-sleep.target systemctl mask ctrl-alt-del.target sleep.target suspend.target hibernate.target hybrid-sleep.target
" "
do_log "info" "file_only" "4133() Masked: [ctrl-alt-del.target sleep.target suspend.target hibernate.target hybrid-sleep.target]" do_log "info" "file_only" "4133() Masked: [ctrl-alt-del.target sleep.target suspend.target hibernate.target hybrid-sleep.target]"
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
systemctl mask plymouth-start.service plymouth-quit.service plymouth-quit-wait.service plymouth-read-write.service systemctl mask plymouth-start.service plymouth-quit.service plymouth-quit-wait.service plymouth-read-write.service
" "
do_log "info" "file_only" "4133() Masked: [plymouth-start.service plymouth-quit.service plymouth-quit-wait.service plymouth-read-write.service]" do_log "info" "file_only" "4133() Masked: [plymouth-start.service plymouth-quit.service plymouth-quit-wait.service plymouth-read-write.service]"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_masking
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install microcode updates depending on architecture (amd64, arm64, intel64) and environment (Baremetal, VM). # Install microcode updates depending on architecture (amd64, arm64, intel64) and environment (Baremetal, VM).
@@ -56,16 +56,16 @@ installation_microcode() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ${var_microcode_pkgs} 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests ${var_microcode_pkgs} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
else else
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests --only-upgrade ${var_microcode_pkgs} 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests --only-upgrade ${var_microcode_pkgs} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
fi fi
@@ -76,6 +76,9 @@ installation_microcode() {
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_microcode
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install microcode updates depending on architecture (amd64, arm64, intel64) and environment (Baremetal, VM). # Install microcode updates depending on architecture (amd64, arm64, intel64) and environment (Baremetal, VM).
@@ -294,12 +294,15 @@ installation_firmware() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ${ary_pkgs_resolved[*]} 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests ${ary_pkgs_resolved[*]} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_firmware
####################################### #######################################
# Helper: Wildcardize a module alias (bus-aware, conservative) # Helper: Wildcardize a module alias (bus-aware, conservative)
@@ -352,4 +355,7 @@ wildcard_mod_alias() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f wildcard_mod_alias
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Setup chrony NTPSec client. # Setup chrony NTPSec client.
@@ -49,8 +49,8 @@ installation_chrony() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests chrony 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests chrony 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
if [[ ! -e "${TARGET}/etc/systemd/system/multi-user.target.wants/chrony.service" ]]; then if [[ ! -e "${TARGET}/etc/systemd/system/multi-user.target.wants/chrony.service" ]]; then
@@ -71,13 +71,15 @@ installation_chrony() {
do_log "debug" "file_only" "4150() Executing: [chroot_script ${TARGET} chronyd -Q -f /etc/chrony/chrony.conf]." do_log "debug" "file_only" "4150() Executing: [chroot_script ${TARGET} chronyd -Q -f /etc/chrony/chrony.conf]."
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
chronyd -Q -f /etc/chrony/chrony.conf 2>&1 | tee -a ${var_logfile} chronyd -Q -f /etc/chrony/chrony.conf 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
do_log "info" "file_only" "4150() Chrony NTPsec client installed." do_log "info" "file_only" "4150() Chrony NTPsec client installed."
rm -f "${var_of}" rm -f "${var_of}"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_chrony
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install Cisofy Lynis. # Install Cisofy Lynis.
@@ -49,11 +49,14 @@ EOF
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get update apt-get update
apt-get install -y --no-install-recommends --no-install-suggests eza 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests eza 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_eza
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install Cisofy Lynis. # Install Cisofy Lynis.
@@ -49,11 +49,14 @@ EOF
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get update apt-get update
apt-get install -y --no-install-recommends --no-install-suggests lynis 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests lynis 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_lynis
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Wrapper to write '/etc/fstab' entries. # Wrapper to write '/etc/fstab' entries.
@@ -42,6 +42,9 @@ write_fstab() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f write_fstab
####################################### #######################################
# Generate the '/etc/fstab' target entries. # Generate the '/etc/fstab' target entries.
@@ -90,7 +93,7 @@ EOF
var_fs_uuid="/dev/mapper/${var_dmapper}" var_fs_uuid="/dev/mapper/${var_dmapper}"
var_fs_path="${var_path}" var_fs_path="${var_path}"
var_fs_type="${HMP_FSTAB_MOUNT_FTYPE["${var_path}"]}" var_fs_type="${HMP_FSTAB_MOUNT_FTYPE["${var_path}"]}"
var_fs_opts="${HMP_FSTAB_MOUNT_OPTS["${var_path}"]},x-systemd.makefs,x-systemd.fsck=no" var_fs_opts="${HMP_FSTAB_MOUNT_OPTS["${var_path}"]}"
var_fs_pass="0" var_fs_pass="0"
;; ;;
@@ -146,6 +149,9 @@ EOF
continue continue
;; ;;
*)
do_log "info" "file_only" "4200() No valid FS found for: '${var_fs_path}'."
esac esac
done done
@@ -155,7 +161,7 @@ EOF
var_fs_uuid="/dev/mapper/${var_dmapper}" var_fs_uuid="/dev/mapper/${var_dmapper}"
var_fs_path="none" var_fs_path="none"
var_fs_type="swap" var_fs_type="swap"
var_fs_opts="defaults" var_fs_opts="${HMP_FSTAB_MOUNT_OPTS["SWAP"]}"
var_fs_pass="0" var_fs_pass="0"
write_fstab "${var_fs_uuid}" "${var_fs_path}" "${var_fs_type}" "${var_fs_opts}" "${var_fs_pass}" write_fstab "${var_fs_uuid}" "${var_fs_path}" "${var_fs_type}" "${var_fs_opts}" "${var_fs_pass}"
@@ -163,11 +169,10 @@ EOF
mkdir -p "${TARGET}/media/cdrom0" mkdir -p "${TARGET}/media/cdrom0"
cat << 'EOF' >> "${TARGET}/etc/fstab" cat << 'EOF' >> "${TARGET}/etc/fstab"
/dev/sr0 /media/cdrom0 auto noauto,nofail,ro,user,x-systemd.automount,x-systemd.device-timeout=0 0 0 # /dev/sr0 /media/cdrom0 auto noauto,nofail,ro,user,x-systemd.automount,x-systemd.device-timeout=0 0 0 0 0
#/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
EOF EOF
do_log "info" "file_only" "4200() fstab entry generated: '/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0'." do_log "info" "file_only" "4200() fstab entry generated: '/dev/sr0 /media/cdrom0 auto noauto,nofail,ro,user,x-systemd.automount,x-systemd.device-timeout=0 0 0'."
cat << 'EOF' >> "${TARGET}/etc/fstab" cat << 'EOF' >> "${TARGET}/etc/fstab"
### Secure tmpfs mounts for a hardened system ### Secure tmpfs mounts for a hardened system
@@ -185,6 +190,9 @@ tmpfs /run tmpfs
# vim: number et ts=2 sw=2 sts=2 ai tw=200 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=200 ft=sh
EOF EOF
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_fstab
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Basic '/etc/fstab' checks inside chroot. # Basic '/etc/fstab' checks inside chroot.
@@ -48,6 +48,9 @@ check_fstab() {
} 2>&1 | tee -a '"${var_logfile}"' } 2>&1 | tee -a '"${var_logfile}"'
' '
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f check_fstab
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# '/etc/crypttab' entry writer and logger. # '/etc/crypttab' entry writer and logger.
@@ -32,6 +32,9 @@ write_crypttab() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f write_crypttab
####################################### #######################################
# Generate the '/etc/crypttab' target entries. # Generate the '/etc/crypttab' target entries.
@@ -43,13 +46,14 @@ write_crypttab() {
# TARGET # TARGET
# VAR_DROPBEAR # VAR_DROPBEAR
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
generate_crypttab() { generate_crypttab() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_key="" var_encryption_label="" var_luks_uuid="" var_ephemeral_enclabel="" var_host_fs_label="" declare var_key="" var_encryption_label="" var_luks_uuid="" var_ephemeral_enclabel="" var_host_fs_label="" \
var_host_partuuid=""
ensure_lowercase "VAR_DROPBEAR" ensure_lowercase "VAR_DROPBEAR"
@@ -86,26 +90,26 @@ EOF
case "${var_key,,}" in case "${var_key,,}" in
"/") "/")
write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "luks,discard,initramfs,keyscript=decrypt_keyctl,tries=1" write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "pw_main" "check,discard,initramfs,keyscript=decrypt_keyctl,luks,noauto,same-cpu-crypt,tries=1"
;; ;;
"/usr") "/usr")
write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "luks,discard,initramfs,keyscript=decrypt_keyctl,tries=1" write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "pw_main" "check,discard,initramfs,keyscript=decrypt_keyctl,luks,noauto,same-cpu-crypt,tries=1"
;; ;;
"/boot") "/boot")
write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "luks,discard,noauto" write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "pw_boot" "check,discard,initramfs,keyscript=decrypt_keyctl,luks,noauto,same-cpu-crypt,tries=1"
;; ;;
*) *)
write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "luks,discard,initramfs,keyscript=decrypt_keyctl,tries=1" write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "pw_main" "check,discard,initramfs,keyscript=decrypt_keyctl,luks,noauto,same-cpu-crypt,tries=1"
;; ;;
esac esac
else else
write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "luks,discard" write_crypttab "${var_encryption_label}" "UUID=${var_luks_uuid}" "none" "check,discard,luks,same-cpu-crypt"
fi fi
@@ -121,15 +125,17 @@ EOF
case "${var_key,,}" in case "${var_key,,}" in
swap) swap)
#write_crypttab "${var_ephemeral_enclabel}" "LABEL=${var_host_fs_label}" "/dev/random" "swap,offset=2048,cipher=aes-xts-plain64,size=512,sector-size=4096,discard" write_crypttab "${var_ephemeral_enclabel}" "PARTUUID=${var_host_partuuid}" "/dev/random" "cipher=aes-xts-plain64,size=512,discard,swap"
write_crypttab "${var_ephemeral_enclabel}" "PARTUUID=${var_host_partuuid}" "/dev/random" "offset=2048,cipher=aes-xts-plain64,size=512,sector-size=4096,discard,plain,swap"
;; ;;
/tmp) /tmp)
#write_crypttab "${var_ephemeral_enclabel}" "LABEL=${var_host_fs_label}" "/dev/random" "offset=2048,cipher=aes-xts-plain64,size=512,sector-size=4096,discard,tmp=ext4" write_crypttab "${var_ephemeral_enclabel}" "PARTUUID=${var_host_partuuid}" "/dev/random" "cipher=aes-xts-plain64,size=512,discard,tmp=ext4"
write_crypttab "${var_ephemeral_enclabel}" "PARTUUID=${var_host_partuuid}" "/dev/random" "offset=2048,cipher=aes-xts-plain64,size=512,sector-size=4096,discard,plain" mkdir -p "${TARGET}/etc/tmpfiles.d"
chroot_script "${TARGET}" "systemctl mask tmp.mount" insert_header "${TARGET}/etc/tmpfiles.d/10-tmp.conf"
do_log "info" "file_only" "4210() Masked: [tmp.mount]" insert_comments "${TARGET}/etc/tmpfiles.d/10-tmp.conf"
cat << 'EOF' >> "${TARGET}/etc/tmpfiles.d/10-tmp.conf"
d /tmp 1777 root root -
EOF
;; ;;
*) *)
@@ -146,6 +152,9 @@ EOF
# vim: number et ts=2 sw=2 sts=2 ai tw=200 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=200 ft=sh
EOF EOF
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_crypttab
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Installation of 'cryptsetup' and 'cryptsetup-initramfs' after '/etc/crypttab' generation. # Installation of 'cryptsetup' and 'cryptsetup-initramfs' after '/etc/crypttab' generation.
@@ -30,12 +30,15 @@ installation_cryptsetup() {
chroot_logger "${TARGET}${var_logfile}" chroot_logger "${TARGET}${var_logfile}"
chroot_script "${TARGET}" ' chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
apt-get install -y --no-install-recommends --no-install-suggests cryptsetup cryptsetup-initramfs 2>&1 | tee -a '"${var_logfile}"' [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: $? >> '"${var_logfile}"' apt-get install -y --no-install-recommends --no-install-suggests cryptsetup cryptsetup-initramfs 2>&1 | tee -a ${var_logfile}
' "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_cryptsetup
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# --- UEFI GRUB Installation Strategy --- # --- UEFI GRUB Installation Strategy ---
@@ -38,16 +38,17 @@ guard_sourcing
# VAR_SETUP_PATH # VAR_SETUP_PATH
# grub_background_enable # grub_background_enable
# grub_background_path # grub_background_path
# grub_latest # grub_bootdev
# grub_force_efi
# grub_prober # grub_prober
# grub_skip # grub_skip
# grub_update_nvram
# var_update_grub_required # var_update_grub_required
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_GRUB_BACKGROUND # ERR_GRUB_ARCHITECTURE: on failure
# ERR_GRUB_EFI_FORCE
####################################### #######################################
installation_grub() { installation_grub() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -77,16 +78,16 @@ installation_grub() {
amd64) amd64)
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends grub2-common grub-efi-amd64 grub-efi-amd64-bin 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends grub2-common grub-efi-amd64 grub-efi-amd64-bin 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
;; ;;
arm64) arm64)
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends grub2-common grub-efi-arm64 grub-efi-arm64-bin 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends grub2-common grub-efi-arm64 grub-efi-arm64-bin 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
;; ;;
@@ -100,8 +101,8 @@ installation_grub() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends grub2-common grub-pc grub-pc-bin 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends grub2-common grub-pc grub-pc-bin 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
fi fi
@@ -208,8 +209,11 @@ EOF
fi fi
chmod -R 0700 "${TARGET}/etc/grub.d" chmod -R 0700 "${TARGET}/etc/grub.d"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_grub
####################################### #######################################
# Installs GRUB to BIOS in BIOS mode. # Installs GRUB to BIOS in BIOS mode.
@@ -222,7 +226,7 @@ EOF
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_GRUB_INSTALL # ERR_GRUB_INSTALL: on failure
####################################### #######################################
install_grub_bios() { install_grub_bios() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -253,21 +257,22 @@ install_grub_bios() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f install_grub_bios
####################################### #######################################
# Installs GRUB to ESP in UEFI mode. # Installs GRUB to ESP in UEFI mode.
# Globals: # Globals:
# TARGET # TARGET
# VAR_MODINFO_PATH # VAR_MODINFO_PATH
# grub_bootdev
# grub_force_efi
# grub_update_nvram # grub_update_nvram
# var_update_grub_required # var_update_grub_required
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_GRUB_INSTALL # ERR_GRUB_INSTALL: on failure
####################################### #######################################
install_grub_uefi() { install_grub_uefi() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -294,12 +299,15 @@ install_grub_uefi() {
[[ "${grub_update_nvram}" == "false" ]] && ary_uefi_arg+=( --no-nvram ) [[ "${grub_update_nvram}" == "false" ]] && ary_uefi_arg+=( --no-nvram )
chroot_exec "${TARGET}" grub-install "${ary_uefi_arg[@]}" "${grub_bootdev}" || return "${ERR_GRUB_INSTALL}" chroot_exec "${TARGET}" grub-install "${ary_uefi_arg[@]}" || return "${ERR_GRUB_INSTALL}"
do_log "info" "file_only" "4230() Installed: GRUB on Device: '${grub_bootdev}' [UEFI]." do_log "info" "file_only" "4230() Installed: GRUB on [ESP]."
var_update_grub_required="true" var_update_grub_required="true"
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f install_grub_uefi
####################################### #######################################
# Get the path of the required Grub modules. # Get the path of the required Grub modules.
@@ -316,6 +324,7 @@ get_grub_modinfo_path() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -gx VAR_MODINFO_PATH="" declare -gx VAR_MODINFO_PATH=""
# shellcheck disable=SC2249
case "${VAR_RECIPE_FIRMWARE}" in case "${VAR_RECIPE_FIRMWARE}" in
uefi) uefi)
@@ -339,4 +348,7 @@ get_grub_modinfo_path() {
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f get_grub_modinfo_path
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,31 +10,34 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Append the GRUB superuser block to '/etc/grub.d/40_custom'. # Append the GRUB superuser block to '/etc/grub.d/40_custom'.
# Globals: # Globals:
# DIR_CNF # CISS_SECRET_GRUB
# TARGET # TARGET
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_READ_GRUB_FILE # ERR_READ_GRUB_FILE: on failure
####################################### #######################################
update_grub_password() { update_grub_password() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_username="superadmin" var_password="" var_password_file="${DIR_CNF}/password_grub.txt" \ declare var_username="superadmin" var_password="" \
var_of="${TARGET}/etc/grub.d/40_custom" var_grub_entry="" var_of="${TARGET}/etc/grub.d/40_custom" var_grub_entry=""
### SECRETS handling ---------------------------------------------------------------------------------------------------------
guard_trace on guard_trace on
var_password=$(<"${var_password_file}") || return "${ERR_READ_GRUB_FILE}" var_password="${CISS_SECRET_GRUB}" || return "${ERR_READ_GRUB_FILE}"
unset CISS_SECRET_GRUB
var_grub_entry=$(generate_grub_password_pbkdf2 "${var_username}" "${var_password}") var_grub_entry=$(generate_grub_password_pbkdf2 "${var_username}" "${var_password}")
guard_trace off guard_trace off
### SECRETS handling ---------------------------------------------------------------------------------------------------------
### Append if not already present. ### Append if not already present.
if ! grep -q "set superusers=" "${var_of}"; then if ! grep -q "set superusers=" "${var_of}"; then
@@ -48,11 +51,16 @@ update_grub_password() {
chroot_exec "${TARGET}" update-grub chroot_exec "${TARGET}" update-grub
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f update_grub_password
####################################### #######################################
# Generate PBKDF2 password hash for GRUB. # Generate PBKDF2 password hash for GRUB.
# Globals:
# None
# Arguments: # Arguments:
# 1: Username (default to superadmin). # 1: Username (default to superadmin).
# 2: User password. # 2: User password.
@@ -79,4 +87,7 @@ EOF
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f generate_grub_password_pbkdf2
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,10 +10,10 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
### Options in "GRUB_CMDLINE_LINUX" are always effective. ### Options in "GRUB_CMDLINE_LINUX" are always effective, (incl. recovery).
### Options in "GRUB_CMDLINE_LINUX_DEFAULT" are effective ONLY during normal boot (NOT during recovery mode). ### Options in "GRUB_CMDLINE_LINUX_DEFAULT" are effective ONLY during normal boot (NOT during recovery mode).
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening: update the Grub boot parameter and the Dropbear and Nuke parameters if opted in. # Hardening: update the Grub boot parameter and the Dropbear and Nuke parameters if opted in.
@@ -25,6 +25,7 @@ guard_sourcing
# VAR_DROPBEAR # VAR_DROPBEAR
# VAR_NUKE # VAR_NUKE
# VAR_NUKE_HASH # VAR_NUKE_HASH
# VAR_SEC_FW
# VV_GRUB_CMDLINE_LINUX # VV_GRUB_CMDLINE_LINUX
# VV_GRUB_CMDLINE_LINUX_DEFAULT # VV_GRUB_CMDLINE_LINUX_DEFAULT
# Arguments: # Arguments:
@@ -55,10 +56,20 @@ update_grub_bootparameter() {
done done
if [[ "${VAR_SEC_FW}" == "apparmor" ]]; then
VV_GRUB_CMDLINE_LINUX="${VV_GRUB_CMDLINE_LINUX:+${VV_GRUB_CMDLINE_LINUX} }apparmor=1 security=apparmor lsm=lockdown,yama,integrity,apparmor,bpf"
elif [[ "${VAR_SEC_FW}" == "selinux" ]]; then
### We start in permissive mode first, so we don't pass 'enforcing=1' through the command line.
VV_GRUB_CMDLINE_LINUX="${VV_GRUB_CMDLINE_LINUX:+${VV_GRUB_CMDLINE_LINUX} }selinux=1 security=selinux"
fi
if [[ "${VAR_DROPBEAR}" == "true" ]]; then if [[ "${VAR_DROPBEAR}" == "true" ]]; then
var_label="${HMP_PATH_ENCLABEL["/"]}" var_label="${HMP_PATH_ENCLABEL["/"]}"
VV_GRUB_CMDLINE_LINUX="${VV_GRUB_CMDLINE_LINUX:+${VV_GRUB_CMDLINE_LINUX} }cryptdevice=${VAR_CRYPT_ROOT}:cryptroot root=/dev/mapper/${var_label}" VV_GRUB_CMDLINE_LINUX="${VV_GRUB_CMDLINE_LINUX} cryptdevice=${VAR_CRYPT_ROOT}:cryptroot root=/dev/mapper/${var_label}"
fi fi
if [[ "${VAR_NUKE}" == "true" ]]; then if [[ "${VAR_NUKE}" == "true" ]]; then
@@ -72,6 +83,9 @@ update_grub_bootparameter() {
chroot_exec "${TARGET}" update-grub chroot_exec "${TARGET}" update-grub
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f update_grub_bootparameter
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Setup network. # Setup network.
@@ -24,9 +24,9 @@ guard_sourcing
# VAR_FINAL_IPV6_CIDR # VAR_FINAL_IPV6_CIDR
# VAR_FINAL_IPV6_GW # VAR_FINAL_IPV6_GW
# VAR_FINAL_NIC # VAR_FINAL_NIC
# VAR_LINK_IPV6
# network_autoconfig_enable # network_autoconfig_enable
# network_choose_interface_auto # network_choose_interface_auto
# network_static_dns_dhcp_override
# network_static_ipv4nameserver_0 # network_static_ipv4nameserver_0
# network_static_ipv6address # network_static_ipv6address
# network_static_ipv6nameserver_0 # network_static_ipv6nameserver_0
@@ -45,23 +45,20 @@ installation_network() {
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get purge -y dhcpcd isc-dhcp-client 2>&1 | tee -a ${var_logfile} apt-get purge -y dhcpcd isc-dhcp-client 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
apt-get install -y --no-install-suggests ifupdown dhcpcd-base 2>&1 | tee -a ${var_logfile} [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: \$? >> ${var_logfile} apt-get install -y --no-install-suggests dhcpcd-base ifupdown 2>&1 | tee -a ${var_logfile}
" "
echo "systemctl disable systemd-networkd NetworkManager" >> "${TARGET}${var_logfile}"
echo "systemctl disable dhcpcd.service" >> "${TARGET}${var_logfile}"
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
systemctl disable systemd-networkd NetworkManager 2>/dev/null | tee -a ${var_logfile} || true systemctl disable systemd-networkd NetworkManager 2>/dev/null | tee -a ${var_logfile} || true
systemctl disable dhcpcd.service 2>/dev/null | tee -a ${var_logfile} || true
echo ExitCode: \$? >> ${var_logfile}
" "
mkdir -p "${TARGET}/etc/network/interfaces.d" mkdir -p "${TARGET}/etc/network/interfaces.d"
@@ -80,7 +77,7 @@ installation_network() {
# For servers or systems with static interfaces that should always be available (e.g., eth0 on a server). # For servers or systems with static interfaces that should always be available (e.g., eth0 on a server).
# For configurations where the interface should be active regardless of the cable status. # For configurations where the interface should be active regardless of the cable status.
# allow-hotplug: # allow-hotplug:
# For systems with dynamic or removable network devices (e.g., laptops or USB adapters). # For systems with dynamic or removable network devices (e.g., laptops, USB adapters, VMs).
# To avoid boot delays when interfaces are unavailable. # To avoid boot delays when interfaces are unavailable.
insert_header "${TARGET}/etc/network/interfaces" insert_header "${TARGET}/etc/network/interfaces"
@@ -89,15 +86,10 @@ installation_network() {
# This file describes the network interfaces available on your system # This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5). # and how to activate them. For more information, see interfaces(5).
source-directory /etc/network/interfaces.d
# The loopback network interface # The loopback network interface
auto lo auto lo
iface lo inet loopback iface lo inet loopback
auto ${VAR_FINAL_NIC}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces" chmod 0644 "${TARGET}/etc/network/interfaces"
do_log "info" "file_only" "4300() Header '${TARGET}/etc/network/interfaces' created." do_log "info" "file_only" "4300() Header '${TARGET}/etc/network/interfaces' created."
@@ -106,86 +98,68 @@ EOF
### Configure network interfaces based on 'preseed.yaml' and create network configuration files for IPv4. ### Configure network interfaces based on 'preseed.yaml' and create network configuration files for IPv4.
if [[ "${network_autoconfig_enable}" == "true" && "${network_choose_interface_auto}" == "true" ]]; then if [[ "${network_autoconfig_enable}" == "true" && "${network_choose_interface_auto}" == "true" ]]; then
insert_header "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp" cat << EOF >> "${TARGET}/etc/network/interfaces"
insert_comments "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
cat << EOF >> "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
# The primary network interface: IPv4 via DHCP # The primary network interface: IPv4 via DHCP
auto ${VAR_FINAL_NIC}
iface ${VAR_FINAL_NIC} inet dhcp iface ${VAR_FINAL_NIC} inet dhcp
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured with DHCP." do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured with DHCP."
elif [[ "${network_autoconfig_enable}" == "true" && "${network_choose_interface_auto}" == "false" ]]; then elif [[ "${network_autoconfig_enable}" == "true" && "${network_choose_interface_auto}" == "false" ]]; then
insert_header "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp" cat << EOF >> "${TARGET}/etc/network/interfaces"
insert_comments "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
cat << EOF >> "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
# The primary network interface: IPv4 via DHCP # The primary network interface: IPv4 via DHCP
auto ${VAR_FINAL_NIC}
iface ${VAR_FINAL_NIC} inet dhcp iface ${VAR_FINAL_NIC} inet dhcp
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces.d/10-ipv4-dhcp"
do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured with DHCP." do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured with DHCP."
fi fi
if [[ "${network_autoconfig_enable}" == "false" ]]; then if [[ "${network_autoconfig_enable}" == "false" ]]; then
insert_header "${TARGET}/etc/network/interfaces.d/10-ipv4-static" cat << EOF >> "${TARGET}/etc/network/interfaces"
insert_comments "${TARGET}/etc/network/interfaces.d/10-ipv4-static"
cat << EOF >> "${TARGET}/etc/network/interfaces.d/10-ipv4-static"
# The primary network interface: IPv4 via static IP # The primary network interface: IPv4 via static IP
auto ${VAR_FINAL_NIC}
iface ${VAR_FINAL_NIC} inet static iface ${VAR_FINAL_NIC} inet static
address ${VAR_FINAL_IPV4} address ${VAR_FINAL_IPV4}
netmask ${VAR_FINAL_IPV4_SUBNET} netmask ${VAR_FINAL_IPV4_SUBNET}
gateway ${VAR_FINAL_IPV4_GW} gateway ${VAR_FINAL_IPV4_GW}
dns-nameservers ${ARY_IPV4_NS[*]}
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces.d/10-ipv4-static"
do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured statically." do_log "info" "file_only" "4300() IPv4 on the primary NIC: '${VAR_FINAL_NIC}' configured statically."
fi fi
### Configure network interfaces based on 'preseed.yaml' and create network configuration files for IPv6. ### Configure network interfaces based on 'preseed.yaml' and create network configuration files for IPv6.
if [[ "${network_autoconfig_enable}" == "true" && -z "${network_static_ipv6address}" ]]; then if [[ "${network_autoconfig_enable}" == "true" && -z "${network_static_ipv6address}" ]]; then
insert_header "${TARGET}/etc/network/interfaces.d/10-ipv6-dhcp" cat << EOF >> "${TARGET}/etc/network/interfaces"
insert_comments "${TARGET}/etc/network/interfaces.d/10-ipv6-dhcp"
cat << EOF >> "${TARGET}/etc/network/interfaces.d/10-ipv6-dhcp"
# The primary network interface: IPv6 via SLAAC (+ stateless DHCPv6 for DNS) # The primary network interface: IPv6 via SLAAC (+ stateless DHCPv6 for DNS)
iface ${VAR_FINAL_NIC} inet6 auto iface ${VAR_FINAL_NIC} inet6 auto
accept_ra 2 accept_ra 2
dhcp 1
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces.d/10-ipv6-dhcp" do_log "info" "file_only" "4300() IPv6 on the primary NIC: '${VAR_FINAL_NIC}' configured with stateless DHCPv6."
do_log "info" "file_only" "4300() IPv6 on the primary NIC: '${VAR_FINAL_NIC}' configured with DHCP."
elif [[ "${network_autoconfig_enable}" == "false" || -n "${network_static_ipv6address}" ]]; then elif [[ "${network_autoconfig_enable}" == "false" || -n "${network_static_ipv6address}" ]]; then
insert_header "${TARGET}/etc/network/interfaces.d/10-ipv6-static" cat << EOF >> "${TARGET}/etc/network/interfaces"
insert_comments "${TARGET}/etc/network/interfaces.d/10-ipv6-static"
cat << EOF >> "${TARGET}/etc/network/interfaces.d/10-ipv6-static"
# The primary network interface: IPv6 via static IP # The primary network interface: IPv6 via static IP
iface ${VAR_FINAL_NIC} inet6 static iface ${VAR_FINAL_NIC} inet6 static
address ${VAR_FINAL_IPV6_CIDR} address ${VAR_FINAL_IPV6_CIDR}
gateway ${VAR_FINAL_IPV6_GW} gateway ${VAR_FINAL_IPV6_GW}
dns-nameservers ${ARY_IPV6_NS[*]} ### Optional harden, no RA on static v6
pre-up sysctl -w net.ipv6.conf.ens3.accept_ra=0
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
chmod 0644 "${TARGET}/etc/network/interfaces.d/10-ipv6-static"
do_log "info" "file_only" "4300() IPv6 on the primary NIC: '${VAR_FINAL_NIC}' configured statically." do_log "info" "file_only" "4300() IPv6 on the primary NIC: '${VAR_FINAL_NIC}' configured statically."
fi fi
printf '# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf\n' >> "${TARGET}/etc/network/interfaces"
### Prepare basic 'dhcpcd-base' DHCP Client options. ### Prepare basic 'dhcpcd-base' DHCP Client options.
if [[ -f "${TARGET}/etc/dhcpcd.conf" ]]; then if [[ -f "${TARGET}/etc/dhcpcd.conf" ]]; then
@@ -199,6 +173,9 @@ EOF
insert_header "${TARGET}/etc/dhcpcd.conf" insert_header "${TARGET}/etc/dhcpcd.conf"
insert_comments "${TARGET}/etc/dhcpcd.conf" insert_comments "${TARGET}/etc/dhcpcd.conf"
cat << 'EOF' >> "${TARGET}/etc/dhcpcd.conf" cat << 'EOF' >> "${TARGET}/etc/dhcpcd.conf"
### No Global APIPA-Fallback.
noipv4ll
### A ServerID is required by RFC2131. ### A ServerID is required by RFC2131.
require dhcp_server_identifier require dhcp_server_identifier
@@ -210,6 +187,7 @@ option host_name
option domain_name option domain_name
option domain_search option domain_search
option domain_name_servers option domain_name_servers
option rapid_commit
### Most distributions have NTP support. ### Most distributions have NTP support.
option ntp_servers option ntp_servers
@@ -219,18 +197,18 @@ fqdn both
EOF EOF
### Ensure 'dhcpcd-base' DHCP Client is not overwriting the static nameserver settings. ### Ensure 'dhcpcd-base' DHCP Client is not overwriting the static nameserver settings.
### Collect static DNS from YAML (IPv4 and IPv6). ### Collect static DNS from YAML (IPv4 and IPv6).
[[ -n "${network_static_ipv4nameserver_0:-}" ]] && ary_dns_supersede+=( "${ARY_IPV4_NS[@]}" ) [[ -n "${network_static_ipv4nameserver_0:-}" ]] && ary_dns_supersede+=( "${ARY_IPV4_NS[@]}" )
[[ -n "${network_static_ipv6nameserver_0:-}" ]] && ary_dns_supersede+=( "${ARY_IPV6_NS[@]}" ) [[ -n "${network_static_ipv6nameserver_0:-}" ]] && ary_dns_supersede+=( "${ARY_IPV6_NS[@]}" )
if [[ "${#ary_dns_supersede[@]}" -gt 0 ]]; then if [[ "${#ary_dns_supersede[@]}" -gt 0 && "${network_static_dns_dhcp_override}" == "true" ]]; then
cat << EOF >> "${TARGET}/etc/dhcpcd.conf" cat << EOF >> "${TARGET}/etc/dhcpcd.conf"
### Enforce static DNS ### Enforce static DNS
nooption domain_name_servers nooption domain_name_servers
nohook rdnssd nohook rdnssd
nohook resolvconf
### Static DNS-resolvers ### Static DNS-resolvers
interface ${VAR_FINAL_NIC} interface ${VAR_FINAL_NIC}
@@ -243,18 +221,23 @@ EOF
fi fi
if [[ "${VAR_LINK_IPV6}" == "true" && -n "${network_static_ipv6address}" ]]; then
echo " noipv6rs" >> "${TARGET}/etc/dhcpcd.conf"
fi
### Footer (always). ### Footer (always).
echo '' >> "${TARGET}/etc/dhcpcd.conf" echo '' >> "${TARGET}/etc/dhcpcd.conf"
echo '# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf' >> "${TARGET}/etc/dhcpcd.conf" echo '# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf' >> "${TARGET}/etc/dhcpcd.conf"
### Check dhcpcd connectivity. ### Check dhcpcd connectivity.
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
dhcpcd -T ${VAR_FINAL_NIC} | tee -a ${var_logfile} dhcpcd -T ${VAR_FINAL_NIC} | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_network
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Installation of packages 'fail2ban' and 'ufw'. # Installation of packages 'fail2ban' and 'ufw'.
@@ -28,11 +28,14 @@ installation_netsec() {
chroot_logger "${TARGET}${var_logfile}" chroot_logger "${TARGET}${var_logfile}"
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
apt-get install -y --no-install-suggests fail2ban ufw 2>&1 | tee -a ${var_logfile} [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: \$? >> ${var_logfile} apt-get install -y --no-install-suggests fail2ban ufw 2>&1 | tee -a ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_netsec
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,22 +10,19 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Build Ultra Hardened dropbear-2025.88 from sources. # Build Ultra Hardened dropbear-2025.88 from sources.
# Globals: # Globals:
# DIR_TMP # DIR_TMP
# PATH # TARGET
# PATH_SEPARATOR
# SHELLOPTS
# VAR_DEBUG_TRACE
# VAR_SETUP_PATH # VAR_SETUP_PATH
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
# ERR_PATH_NOT_VALID # ERR_PATH_NOT_VALID: on failure
####################################### #######################################
dropbear_build() { dropbear_build() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
@@ -74,6 +71,9 @@ dropbear_build() {
guard_trace off guard_trace off
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f dropbear_build
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,13 +10,15 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install the 'dropbear-initramfs' and replace the binaries with those from the previous Ultra Hardened build. # Install the 'dropbear-initramfs' and replace the binaries with those from the previous Ultra Hardened build.
# Globals: # Globals:
# DIR_TMP # DIR_TMP
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -26,45 +28,83 @@ dropbear_initramfs() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_file="" declare var_file=""
declare -r var_logfile="/root/.ciss/cdi/log/4311_dropbear_initramfs.log" declare -r var_logfile="/root/.ciss/cdi/log/4311_dropbear_initramfs.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_script "${TARGET}" ' chroot_logger "${var_target}${var_logfile}"
chroot_script "${var_target}" "
export INITRD=No export INITRD=No
apt-get install -y --no-install-recommends --no-install-suggests dropbear-initramfs 2>&1 | tee -a '"${var_logfile}"' [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: $? >> '"${var_logfile}"' apt-get install -y --no-install-recommends --no-install-suggests dropbear-initramfs dropbear-bin 2>&1 | tee -a ${var_logfile}
' "
chroot_script "${var_target}" "
chroot_script "${TARGET}" '
export INITRD=No export INITRD=No
apt-get install -y --no-install-recommends --no-install-suggests gpgv 2>&1 | tee -a '"${var_logfile}"' [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: $? >> '"${var_logfile}"' apt-get purge -y dropbear dropbear-run || true
' "
chroot_script "${var_target}" "
chroot_script "${TARGET}" '
export INITRD=No export INITRD=No
apt-mark hold dropbear dropbear-initramfs 2>&1 | tee -a '"${var_logfile}"' [[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
echo ExitCode: $? >> '"${var_logfile}"' apt-get install -y --no-install-recommends --no-install-suggests gpgv 2>&1 | tee -a ${var_logfile}
' "
chroot_script "${var_target}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-mark hold dropbear dropbear-initramfs 2>&1 | tee -a ${var_logfile}
"
mv "${TARGET}/usr/sbin/dropbear" "${TARGET}/usr/sbin/dropbear.trixie" mv "${var_target}/usr/sbin/dropbear" "${var_target}/usr/sbin/dropbear.trixie"
install -D -m 0755 -o root -g root "${DIR_TMP}/build/dropbear-2025.88/dropbear" "${TARGET}/usr/sbin/" install -D -m 0755 -o root -g root "${DIR_TMP}/build/dropbear-2025.88/dropbear" "${var_target}/usr/sbin/"
do_log "debug" "file_only" "4311() Installation [dropbear] successful." do_log "debug" "file_only" "4311() Installation [dropbear] successful."
for var_file in dbclient dropbearconvert dropbearkey; do for var_file in dbclient dropbearconvert dropbearkey; do
mv "${TARGET}/usr/bin/${var_file}" "${TARGET}/usr/bin/${var_file}.trixie"
install -D -m 0755 -o root -g root "${DIR_TMP}/build/dropbear-2025.88/${var_file}" "${TARGET}/usr/bin/" mv "${var_target}/usr/bin/${var_file}" "${var_target}/usr/bin/${var_file}.trixie"
install -D -m 0755 -o root -g root "${DIR_TMP}/build/dropbear-2025.88/${var_file}" "${var_target}/usr/bin/"
do_log "debug" "file_only" "4311() Installation [${var_file}] successful." do_log "debug" "file_only" "4311() Installation [${var_file}] successful."
done done
mkdir -p "${var_target}/etc/initramfs-tools/scripts/init-bottom"
insert_header "${TARGET}/etc/apt/preferences.d/99-mask-dropbear" cat << 'EOF' >| "${var_target}/etc/initramfs-tools/scripts/init-bottom/zzzz-dropbear-kill"
insert_comments "${TARGET}/etc/apt/preferences.d/99-mask-dropbear" #!/bin/sh
cat << 'EOF' >> "${TARGET}/etc/apt/preferences.d/99-mask-dropbear"
PREREQ=""
prereqs() { echo "${PREREQ}"; }
# shellcheck disable=SC2249
case "${1}" in
prereqs) prereqs; exit 0 ;;
esac
### Stop dropbear shipped in the initramfs after root pivot.
[ -x /bin/pidof ] || exit 0
P=$(/bin/pidof dropbear 2>/dev/null) || true
[ -n "${P}" ] || exit 0
/bin/kill -TERM "${P}" 2>/dev/null || true
/bin/sleep 1
/bin/kill -KILL "${P}" 2>/dev/null || true
exit 0
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF
chmod 0755 "${var_target}/etc/initramfs-tools/scripts/init-bottom/zzzz-dropbear-kill"
insert_header "${var_target}/etc/apt/preferences.d/99-mask-dropbear"
insert_comments "${var_target}/etc/apt/preferences.d/99-mask-dropbear"
cat << 'EOF' >> "${var_target}/etc/apt/preferences.d/99-mask-dropbear"
# Never install the dropbear daemon package at all. # Never install the dropbear daemon package at all.
Package: dropbear Package: dropbear
Pin: release * Pin: release *
@@ -73,10 +113,9 @@ Pin-Priority: -1
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
insert_header "${var_target}/etc/apt/preferences.d/99-mask-dropbear-initramfs"
insert_header "${TARGET}/etc/apt/preferences.d/99-mask-dropbear-initramfs" insert_comments "${var_target}/etc/apt/preferences.d/99-mask-dropbear-initramfs"
insert_comments "${TARGET}/etc/apt/preferences.d/99-mask-dropbear-initramfs" cat << 'EOF' >> "${var_target}/etc/apt/preferences.d/99-mask-dropbear-initramfs"
cat << 'EOF' >> "${TARGET}/etc/apt/preferences.d/99-mask-dropbear-initramfs"
# Keep the currently installed initramfs integration; never upgrade it. # Keep the currently installed initramfs integration; never upgrade it.
Package: dropbear-initramfs Package: dropbear-initramfs
Pin: release * Pin: release *
@@ -85,10 +124,12 @@ Pin-Priority: -1
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
chroot_script "${var_target}" "systemctl mask dropbear.service dropbear.socket"
chroot_script "${TARGET}" "systemctl mask dropbear.service dropbear.socket"
do_log "info" "file_only" "4311() Masked: [dropbear.service dropbear.socket]" do_log "info" "file_only" "4311() Masked: [dropbear.service dropbear.socket]"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f dropbear_initramfs
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Set up the 'dropbear-initramfs' environment. # Set up the 'dropbear-initramfs' environment.
@@ -39,14 +39,16 @@ guard_sourcing
####################################### #######################################
dropbear_setup() { dropbear_setup() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare network_static_ipv4ntpserver_0="192.53.103.108" \ declare -r network_static_ipv4ntpserver_0="192.53.103.108" \
var_force_command_string='command="/usr/local/bin/unlock_wrapper.sh",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ' var_force_command_string='command="/usr/local/bin/unlock_wrapper.sh",no-agent-forwarding,no-port-forwarding,no-X11-forwarding '
### Prepare strong dropbear host keys. ### Prepare strong dropbear host keys.
rm -f "${TARGET}"/etc/dropbear/initramfs/dropbear*key* rm -f "${TARGET}"/etc/dropbear/initramfs/dropbear*key*
chroot_exec "${TARGET}" /usr/bin/dropbearkey -t rsa -s 4096 -f /etc/dropbear/initramfs/dropbear_rsa_host_key -C "root@${VAR_FINAL_FQDN}" # shellcheck disable=SC2312
chroot_exec "${TARGET}" /usr/bin/dropbearkey -t ed25519 -f /etc/dropbear/initramfs/dropbear_ed25519_host_key -C "root@${VAR_FINAL_FQDN}" chroot_exec "${TARGET}" /usr/bin/dropbearkey -t rsa -s 4096 -f /etc/dropbear/initramfs/dropbear_rsa_host_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
# shellcheck disable=SC2312
chroot_exec "${TARGET}" /usr/bin/dropbearkey -t ed25519 -f /etc/dropbear/initramfs/dropbear_ed25519_host_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
chmod 0600 "${TARGET}"/etc/dropbear/initramfs/dropbear*key* chmod 0600 "${TARGET}"/etc/dropbear/initramfs/dropbear*key*
chown root:root "${TARGET}"/etc/dropbear/initramfs/dropbear*key* chown root:root "${TARGET}"/etc/dropbear/initramfs/dropbear*key*
@@ -138,8 +140,11 @@ EOF
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f dropbear_setup
####################################### #######################################
# Write '/etc/dropbear/initramfs/dropbear.conf'. # Write '/etc/dropbear/initramfs/dropbear.conf'.
@@ -195,6 +200,10 @@ DROPBEAR_OPTIONS="-b /etc/dropbear/banner -E -I 300 -K 60 -p ${dropbear_port}"
EOF EOF
do_log "info" "file_only" "4312() Written: '${TARGET}/etc/dropbear/initramfs/dropbear.conf'." do_log "info" "file_only" "4312() Written: '${TARGET}/etc/dropbear/initramfs/dropbear.conf'."
do_log "info" "file_only" "4312() Written: 'DROPBEAR_OPTIONS=\"-b /etc/dropbear/banner -E -I 300 -K 60 -p ${dropbear_port}\"'."
return 0 return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f write_dropbear_conf
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,13 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Deploy all changes made using the 'update-grub' and 'update-initramfs' commands. # Deploy all changes made using the 'update-grub' and 'update-initramfs' commands.
# Globals: # Globals:
# TARGET # TARGET
# VAR_KERNEL
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -24,24 +25,29 @@ guard_sourcing
update_initramfs() { update_initramfs() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4320_update_initramfs.log" declare -r var_logfile="/root/.ciss/cdi/log/4320_update_initramfs.log"
# shellcheck disable=SC2153
declare -r var_kernel="${VAR_KERNEL#linux-image-}"
chroot_logger "${TARGET}${var_logfile}" chroot_logger "${TARGET}${var_logfile}"
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
update-grub 2>&1 | tee -a ${var_logfile} update-grub 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
"
chroot_script "${TARGET}" "
update-initramfs -c -v -k all 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
update-grub 2>&1 | tee -a ${var_logfile} depmod -a ${var_kernel} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile} update-initramfs -c -v -k all 2>&1 | tee -a ${var_logfile}
" "
guard_dir && return 0 chroot_script "${TARGET}" "
update-grub 2>&1 | tee -a ${var_logfile}
"
chmod 0400 "${TARGET}/boot/grub/grub.cfg"
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f update_initramfs
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,20 +10,25 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Setup ssh server. # Setup ssh server.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_DROPBEAR # VAR_DROPBEAR
# VAR_FINAL_FQDN # VAR_FINAL_FQDN
# VAR_FINAL_IPV4 # VAR_FINAL_IPV4
# VAR_FINAL_IPV6 # VAR_FINAL_IPV6
# VAR_FINAL_NIC
# VAR_LINK_IPV6
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH # VAR_SETUP_PATH
# VAR_SSH_CA # VAR_SSH_CA
# VAR_SSH_PORT # VAR_SSH_PORT
# VAR_USER_MAX # VAR_USER_MAX
# network_static_ipv6address
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -31,14 +36,52 @@ guard_sourcing
####################################### #######################################
installation_ssh() { installation_ssh() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -a ary_user=() declare -a ary_user=()
declare -i i=0 declare -i i=0
declare var_auth="" var_name="" var_ca="" var_pub="" declare -r var_logfile="/root/.ciss/cdi/log/4330_installation_ssh.log"
declare var_auth="" var_name="" var_ca="" var_pub=""
declare var_target="${TARGET}"
chroot_exec "${TARGET}" apt-get install -y --no-install-recommends --no-install-suggests ssh ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/banner" "${TARGET}/etc/" chroot_logger "${var_target}${var_logfile}"
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/motd" "${TARGET}/etc/"
chroot_script "${var_target}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ssh 2>&1 | tee -a ${var_logfile}
"
mkdir -p "${var_target}/etc/systemd/system/ssh.service.d"
if [[ "${VAR_LINK_IPV6}" == "true" && -n "${network_static_ipv6address}" ]]; then
# shellcheck disable=SC2312
cat << EOF >| "${var_target}/etc/systemd/system/ssh.service.d/override.conf"
[Unit]
After=ifup@${VAR_FINAL_NIC}.service network.target
Wants=ifup@${VAR_FINAL_NIC}.service
[Service]
### Block until the exact v6 address is present and not tentative.
### If any tentative IPv6 address exists on the device, wait and retry.
### Check for the exact global address (fixed-string match, include trailing "/").
ExecStartPre=/bin/sh -c '\
for i in \$(seq 1 60); do \
ip -6 addr show dev ${VAR_FINAL_NIC} tentative | grep -q "inet6" && { sleep 0.5; continue; }; \
ip -6 addr show dev ${VAR_FINAL_NIC} scope global | grep -Fq " ${VAR_FINAL_IPV6}/" && exit 0; \
sleep 0.5; \
done; \
echo "IPv6 address ${VAR_FINAL_IPV6} on ${VAR_FINAL_NIC} not ready"; exit 1'
TimeoutStartSec=40s
Restart=on-failure
RestartSec=2s
EOF
fi
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/banner" "${var_target}/etc/"
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/motd" "${var_target}/etc/"
do_log "info" "file_only" "4420() Installed SSH '/etc/banner' and '/etc/motd'." do_log "info" "file_only" "4420() Installed SSH '/etc/banner' and '/etc/motd'."
### Only process those for which both *_name and *_authentication_access_ssh are set. ### Only process those for which both *_name and *_authentication_access_ssh are set.
@@ -51,67 +94,95 @@ installation_ssh() {
fi fi
done done
rm -rf "${TARGET}"/etc/ssh/ssh_host_*key* chroot_script "${var_target}" "
awk '\$5 >= 4000' /etc/ssh/moduli >| /etc/ssh/moduli.safe
rm -rf /etc/ssh/moduli
mv /etc/ssh/moduli.safe /etc/ssh/moduli
"
#shellcheck disable=SC2312 rm -rf "${var_target}"/etc/ssh/ssh_host_*key*
chroot_exec "${TARGET}" ssh-keygen -o -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
#shellcheck disable=SC2312
chroot_exec "${TARGET}" ssh-keygen -o -N "" -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc/ssh" if [[ -f "${var_target}/etc/dropbear/initramfs/dropbear_ed25519_host_key" ]]; then
cp "${TARGET}/etc/ssh/sshd_config" "${TARGET}/root/.ciss/cdi/backup/etc/ssh/sshd_config.bak"
cp "${TARGET}/etc/ssh/ssh_config" "${TARGET}/root/.ciss/cdi/backup/etc/ssh/ssh_config.bak"
rm -f "${TARGET}/etc/ssh/sshd_config"
install -D -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/ssh/sshd_config" "${TARGET}/etc/ssh/sshd_config" chroot_script "${var_target}" "
chmod 0600 "${TARGET}/etc/ssh/ssh_config" dropbearconvert dropbear openssh /etc/dropbear/initramfs/dropbear_ed25519_host_key /etc/ssh/ssh_host_ed25519_key
"
insert_comments "${TARGET}/etc/ssh/sshd_config" chroot_script "${var_target}" "
dropbearconvert dropbear openssh /etc/dropbear/initramfs/dropbear_rsa_host_key /etc/ssh/ssh_host_rsa_key
"
# shellcheck disable=SC2153 chroot_script "${var_target}" "
sed -i -E "s|^[[:space:]]*ListenAddressIPV4[[:space:]]+.*$|$(printf '%-29s%s' 'ListenAddress' "${VAR_FINAL_IPV4}")|" "${TARGET}/etc/ssh/sshd_config" dropbearkey -y -f /etc/dropbear/initramfs/dropbear_ed25519_host_key /etc/ssh/ssh_host_ed25519_key.pub
"
chroot_script "${var_target}" "
dropbearkey -y -f /etc/dropbear/initramfs/dropbear_rsa_host_key /etc/ssh/ssh_host_rsa_key.pub
"
if [[ -n "${VAR_FINAL_IPV6}" ]]; then
sed -i -E "s|^[[:space:]]*ListenAddressIPV6[[:space:]]+.*$|$(printf '%-29s%s' 'ListenAddress' "${VAR_FINAL_IPV6}")|" "${TARGET}/etc/ssh/sshd_config"
else else
sed -i "/^[[:space:]]*ListenAddressIPV6[[:space:]]*/d" "${TARGET}/etc/ssh/sshd_config"
# shellcheck disable=SC2312
chroot_exec "${var_target}" ssh-keygen -o -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
# shellcheck disable=SC2312
chroot_exec "${var_target}" ssh-keygen -o -N "" -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -C "root@${VAR_FINAL_FQDN}-$(date -I)"
fi fi
sed -i -E "s|^[[:space:]]*Port[[:space:]]+.*$|$(printf '%-29s%s' 'Port' "${VAR_SSH_PORT}")|" "${TARGET}/etc/ssh/sshd_config" mkdir -p "${var_target}/root/.ciss/cdi/backup/etc/ssh"
cp "${var_target}/etc/ssh/sshd_config" "${var_target}/root/.ciss/cdi/backup/etc/ssh/sshd_config.bak"
cp "${var_target}/etc/ssh/ssh_config" "${var_target}/root/.ciss/cdi/backup/etc/ssh/ssh_config.bak"
rm -f "${var_target}/etc/ssh/sshd_config"
install -D -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/ssh/sshd_config" "${var_target}/etc/ssh/sshd_config"
chmod 0600 "${var_target}/etc/ssh/ssh_config"
insert_comments "${var_target}/etc/ssh/sshd_config"
# shellcheck disable=SC2153
sed -i -E "s|^[[:space:]]*ListenAddressIPV4[[:space:]]+.*$|$(printf '%-29s%s' 'ListenAddress' "${VAR_FINAL_IPV4}")|" "${var_target}/etc/ssh/sshd_config"
if [[ -n "${VAR_FINAL_IPV6}" ]]; then
sed -i -E "s|^[[:space:]]*ListenAddressIPV6[[:space:]]+.*$|$(printf '%-29s%s' 'ListenAddress' "${VAR_FINAL_IPV6}")|" "${var_target}/etc/ssh/sshd_config"
else
sed -i "/^[[:space:]]*ListenAddressIPV6[[:space:]]*/d" "${var_target}/etc/ssh/sshd_config"
fi
sed -i -E "s|^[[:space:]]*Port[[:space:]]+.*$|$(printf '%-29s%s' 'Port' "${VAR_SSH_PORT}")|" "${var_target}/etc/ssh/sshd_config"
if (( ${#ary_user[@]} > 0 )); then if (( ${#ary_user[@]} > 0 )); then
sed -i -E "s|^\s*AllowUsers\s+.*$|$(printf '%-29s%s' 'AllowUsers' "root ${ary_user[*]}")|" "${TARGET}/etc/ssh/sshd_config" sed -i -E "s|^\s*AllowUsers\s+.*$|$(printf '%-29s%s' 'AllowUsers' "root ${ary_user[*]}")|" "${var_target}/etc/ssh/sshd_config"
fi fi
if [[ -n "${VAR_SSH_CA}" ]]; then if [[ -n "${VAR_SSH_CA}" ]]; then
var_ca="${VAR_SSH_CA##*/}" var_ca="${VAR_SSH_CA##*/}"
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}${VAR_SSH_CA}" "${TARGET}/etc/ssh/" install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}${VAR_SSH_CA}" "${var_target}/etc/ssh/"
sed -i -E "s|^\s*TrustedUserCAKeys\s+.*$|$(printf '%-29s%s' 'TrustedUserCAKeys' "/etc/ssh/${var_ca}")|" "${TARGET}/etc/ssh/sshd_config" sed -i -E "s|^\s*TrustedUserCAKeys\s+.*$|$(printf '%-29s%s' 'TrustedUserCAKeys' "/etc/ssh/${var_ca}")|" "${var_target}/etc/ssh/sshd_config"
fi fi
### Preparing the test environment in chroot. ### Preparing the test environment in chroot.
chroot_exec "${TARGET}" install -d -o root -g root -m 0755 /run/sshd chroot_exec "${var_target}" install -d -o root -g root -m 0755 /run/sshd
### Syntax test (hard). ### Syntax test (hard).
if ! chroot_script "${TARGET}" "sshd -t -f /etc/ssh/sshd_config"; then if ! chroot_script "${var_target}" "sshd -t -f /etc/ssh/sshd_config"; then
do_log "emergency" "file_only" "4420() [sshd -t -f /etc/ssh/sshd_config] failed." do_log "emergency" "file_only" "4420() [sshd -t -f /etc/ssh/sshd_config] failed."
return "${ERR_CONF_VALIDATION}" return "${ERR_CONF_VALIDATION}"
fi fi
### Effective configuration (soft, purely informative). ### Effective configuration (soft, purely informative).
if ! chroot_script "${TARGET}" "sshd -T -f /etc/ssh/sshd_config >| /root/.ciss/cdi/log/sshd_config.log"; then if ! chroot_script "${var_target}" "sshd -T -f /etc/ssh/sshd_config >| /root/.ciss/cdi/log/sshd_config.log"; then
do_log "warn" "file_only" "4420() [sshd -T -f /etc/ssh/sshd_config] failed. Likely env. Continuing." do_log "warn" "file_only" "4420() [sshd -T -f /etc/ssh/sshd_config] failed. Likely env. Continuing."
fi fi
chroot_script "${TARGET}" "ssh-keygen -r ${VAR_FINAL_FQDN}. >| /root/.ciss/cdi/log/SSHFP.log" chroot_script "${var_target}" "ssh-keygen -r ${VAR_FINAL_FQDN}. >| /root/.ciss/cdi/log/SSHFP.log"
if [[ "${VAR_DROPBEAR}" == "true" ]]; then if [[ "${VAR_DROPBEAR}" == "true" ]]; then
printf "### Dropbear SSHFP RR: \n" >> "${TARGET}/root/.ciss/cdi/log/SSHFP.log" printf "### Dropbear SSHFP RR: \n" >> "${var_target}/root/.ciss/cdi/log/SSHFP.log"
for var_pub in "${TARGET}"/etc/dropbear/initramfs/dropbear*.pub; do for var_pub in "${var_target}"/etc/dropbear/initramfs/dropbear*.pub; do
chroot_script "${TARGET}" "ssh-keygen -E sha256 -r ${VAR_FINAL_FQDN}. -f ${var_pub#/target} >> /root/.ciss/cdi/log/SSHFP.log" chroot_script "${var_target}" "ssh-keygen -E sha256 -r ${VAR_FINAL_FQDN}. -f ${var_pub#/target} >> /root/.ciss/cdi/log/SSHFP.log"
done done
@@ -122,9 +193,9 @@ installation_ssh() {
# environment variables: TMOUT # # environment variables: TMOUT #
# TMOUT=14400 ensures that users are automatically logged out after 4 hours of inactivity.# # TMOUT=14400 ensures that users are automatically logged out after 4 hours of inactivity.#
########################################################################################### ###########################################################################################
insert_header "${TARGET}/etc/profile.d/idle-users.sh" insert_header "${var_target}/etc/profile.d/idle-users.sh"
insert_comments "${TARGET}/etc/profile.d/idle-users.sh" insert_comments "${var_target}/etc/profile.d/idle-users.sh"
cat << EOF >> "${TARGET}/etc/profile.d/idle-users.sh" cat << EOF >> "${var_target}/etc/profile.d/idle-users.sh"
case $- in case $- in
*i*) *i*)
TMOUT=14400 TMOUT=14400
@@ -136,6 +207,9 @@ esac
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f installation_ssh
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Entropy collection improvements '/usr/lib/modules-load.d/30_security-misc.conf'. # Entropy collection improvements '/usr/lib/modules-load.d/30_security-misc.conf'.
@@ -47,8 +47,11 @@ EOF
do_log "info" "file_only" "4400() Installed: '/usr/lib/modules-load.d/30_security-misc.conf'." do_log "info" "file_only" "4400() Installed: '/usr/lib/modules-load.d/30_security-misc.conf'."
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f kernel_modules
####################################### #######################################
# Blacklist some kind of potential hazardous modules via '/etc/modprobe.d/0000_ciss_debian_installer.conf'. # Blacklist some kind of potential hazardous modules via '/etc/modprobe.d/0000_ciss_debian_installer.conf'.
@@ -68,6 +71,9 @@ kernel_modprobe() {
do_log "info" "file_only" "4400() Installed: '/etc/modprobe.d/0000_ciss_debian_installer.conf'." do_log "info" "file_only" "4400() Installed: '/etc/modprobe.d/0000_ciss_debian_installer.conf'."
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f kernel_modprobe
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,10 +10,10 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Install Kernel Hardening-Presets '/etc/sysctl.d/99_local.hardened'. # Install Kernel Hardening-Presets '/etc/sysctl.d/9999_ciss_debian_installer.hardened'.
# Globals: # Globals:
# TARGET # TARGET
# VAR_SETUP_PATH # VAR_SETUP_PATH
@@ -23,13 +23,16 @@ guard_sourcing
# 0: on success # 0: on success
####################################### #######################################
kernel_sysctl() { kernel_sysctl() {
install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/sysctl.d/99_local.hardened" \ install -D -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/sysctl.d/9999_ciss_debian_installer.hardened" \
"${TARGET}/etc/sysctl.d/99_local.hardened" "${TARGET}/etc/sysctl.d/9999_ciss_debian_installer.hardened"
insert_comments "${TARGET}/etc/sysctl.d/99_local.hardened" insert_comments "${TARGET}/etc/sysctl.d/9999_ciss_debian_installer.hardened"
do_log "info" "file_only" "4410() Installed: '/etc/sysctl.d/99_local.hardened'." do_log "info" "file_only" "4410() Installed: '/etc/sysctl.d/9999_ciss_debian_installer.hardened'."
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f kernel_sysctl
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,18 +10,21 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening 'fail2ban'. # Hardening 'fail2ban'.
# Globals: # Globals:
# ARY_ALLOW_IPV4 # ARY_ALLOW_IPV4
# ARY_ALLOW_IPV6 # ARY_ALLOW_IPV6
# RECOVERY
# TARGET # TARGET
# VAR_FINAL_FQDN # VAR_FINAL_FQDN
# VAR_FINAL_IPV4 # VAR_FINAL_IPV4
# VAR_FINAL_IPV6 # VAR_FINAL_IPV6
# VAR_LINK_IPV6
# VAR_PROVIDER # VAR_PROVIDER
# VAR_RUN_RECOVERY
# VAR_SSH_PORT # VAR_SSH_PORT
# Arguments: # Arguments:
# None # None
@@ -31,68 +34,121 @@ guard_sourcing
hardening_fail2ban() { hardening_fail2ban() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4420_hardening_fail2ban.log" declare -r var_logfile="/root/.ciss/cdi/log/4420_hardening_fail2ban.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc/fail2ban/jail.d" chroot_logger "${var_target}${var_logfile}"
cp "${TARGET}/etc/fail2ban/fail2ban.conf" "${TARGET}/root/.ciss/cdi/backup/etc/fail2ban/fail2ban.conf.bak"
mv "${TARGET}/etc/fail2ban/jail.d/defaults-debian.conf" "${TARGET}/root/.ciss/cdi/backup/etc/fail2ban/jail.d/defaults-debian.conf.bak" mkdir -p "${var_target}/root/.ciss/cdi/backup/etc/fail2ban/jail.d"
cp "${var_target}/etc/fail2ban/fail2ban.conf" "${var_target}/root/.ciss/cdi/backup/etc/fail2ban/fail2ban.conf.bak"
mv "${var_target}/etc/fail2ban/jail.d/defaults-debian.conf" "${var_target}/root/.ciss/cdi/backup/etc/fail2ban/jail.d/defaults-debian.conf.bak"
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024305 # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024305
insert_header "${TARGET}/etc/fail2ban/fail2ban.local" insert_header "${var_target}/etc/fail2ban/fail2ban.local"
insert_comments "${TARGET}/etc/fail2ban/fail2ban.local" insert_comments "${var_target}/etc/fail2ban/fail2ban.local"
cat << 'EOF' >> "${TARGET}/etc/fail2ban/fail2ban.local" cat << 'EOF' >> "${var_target}/etc/fail2ban/fail2ban.local"
[DEFAULT] [DEFAULT]
allowipv6 = auto allowipv6 = auto
EOF EOF
insert_header "${TARGET}/etc/fail2ban/jail.d/centurion-default.conf" insert_header "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
insert_comments "${TARGET}/etc/fail2ban/jail.d/centurion-default.conf" insert_comments "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
if [[ "${#ARY_ALLOW_IPV4[@]}" -gt 0 ]]; then if [[ "${#ARY_ALLOW_IPV4[@]}" -gt 0 ]]; then
### fail2ban ufw aggressive mode, one attempt for jumphost configuration. ### fail2ban ufw aggressive mode, one attempt for jumphost configuration.
cat << EOF >> "${TARGET}/etc/fail2ban/jail.d/centurion-default.conf" cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
[DEFAULT] [DEFAULT]
usedns = yes banaction = nftables-multiport
ignoreip = 127.0.0.0/8 ::1 banaction_allports = nftables-allports
dbpurgeage = 384d
# 127.0.0.1/8 - IPv4 loopback range (local host)
# ::1/128 - IPv6 loopback
# fe80::/10 - IPv6 link-local (on-link only; NDP/RA/DAD)
# ff00::/8 - IPv6 multicast (not an unicast host)
# ::/128 - IPv6 unspecified (all zeros; never a real peer)
ignoreip = 127.0.0.1/8 ::1/128 fe80::/10 ff00::/8 ::/128
# ${VAR_FINAL_FQDN} # ${VAR_FINAL_FQDN}
${VAR_FINAL_IPV4} ${VAR_FINAL_IPV4}
EOF
if [[ "${VAR_LINK_IPV6}" == "true" ]]; then
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
${VAR_FINAL_IPV6}/64 ${VAR_FINAL_IPV6}/64
EOF
fi
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
# Jumphost # Jumphost
${ARY_ALLOW_IPV4[*]} ${ARY_ALLOW_IPV4[*]}
EOF
if [[ "${VAR_LINK_IPV6}" == "true" ]]; then
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
${ARY_ALLOW_IPV6[*]} ${ARY_ALLOW_IPV6[*]}
maxretry = 8 EOF
findtime = 12h fi
bantime = 12h
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
usedns = yes
[recidive]
enabled = true
banaction = nftables[type=custom, family=inet, table=f2b-table, chain=f2b-chain, blocktype=drop]
bantime = 8d
bantime.increment = true
bantime.factor = 1
bantime.maxtime = 128d
bantime.multipliers = 1 2 4 8 16
bantime.overalljails = true
bantime.rndtime = 877s
filter = recidive
findtime = 16d
logpath = /var/log/fail2ban/fail2ban.log*
maxretry = 3
[sshd] [sshd]
enabled = true enabled = true
backend = systemd backend = systemd
filter = sshd bantime = 1h
mode = normal bantime.increment = true
port = ${VAR_SSH_PORT} bantime.factor = 1
protocol = tcp bantime.maxtime = 16d
logpath = /var/log/auth.log bantime.multipliers = 1 2 4 8 16 32 64 128 256 384
maxretry = 3 bantime.overalljails = true
findtime = 1d bantime.rndtime = 877s
bantime = 1d filter = sshd
findtime = 16m
mode = aggressive
port = ${VAR_SSH_PORT}
protocol = tcp
maxretry = 4
# #
# ufw aggressive approach: # CISS aggressive approach:
# Any valid client communicating with our server should be going directly to the service ports opened in ufw (ssh, 80, ...). # Any valid client communicating with our server should be going directly to the service ports opened in ufw (ssh, 80, ...).
# Any client touching other ports is treated malicious and therefore should be blocked access to ALL ports after 1 attempt. # Any client touching other ports is treated as malicious and therefore should be blocked access to ALL ports after 1 attempt.
# #
[ufw] [ufw]
enabled = true enabled = true
filter = ufw.aggressive banaction = nftables[type=custom, family=inet, table=f2b-table, chain=f2b-chain, blocktype=drop]
action = iptables-allports bantime = 1h
logpath = /var/log/ufw.log bantime.increment = true
maxretry = 1 bantime.factor = 1
findtime = 1d bantime.maxtime = 16d
bantime = 1d bantime.multipliers = 1 2 4 8 16 32 64 128 256 384
protocol = tcp,udp bantime.overalljails = true
bantime.rndtime = 877s
filter = ciss-ufw
findtime = 16m
logpath = /var/log/ufw.log
maxretry = 1
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
@@ -100,44 +156,83 @@ EOF
else else
### fail2ban ufw aggressive mode, 32 attempts for NO jumphost configuration. ### fail2ban ufw aggressive mode, 32 attempts for NO jumphost configuration.
cat << EOF >> "${TARGET}/etc/fail2ban/jail.d/centurion-default.conf" cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
[DEFAULT] [DEFAULT]
usedns = yes banaction = nftables-multiport
ignoreip = 127.0.0.0/8 ::1 banaction_allports = nftables-allports
dbpurgeage = 384d
# 127.0.0.1/8 - IPv4 loopback range (local host)
# ::1/128 - IPv6 loopback
# fe80::/10 - IPv6 link-local (on-link only; NDP/RA/DAD)
# ff00::/8 - IPv6 multicast (not an unicast host)
# ::/128 - IPv6 unspecified (all zeros; never a real peer)
ignoreip = 127.0.0.1/8 ::1/128 fe80::/10 ff00::/8 ::/128
# ${VAR_FINAL_FQDN} # ${VAR_FINAL_FQDN}
${VAR_FINAL_IPV4} ${VAR_FINAL_IPV4}
EOF
if [[ "${VAR_LINK_IPV6}" == "true" ]]; then
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
${VAR_FINAL_IPV6}/64 ${VAR_FINAL_IPV6}/64
maxretry = 8 EOF
findtime = 12h fi
bantime = 12h
cat << EOF >> "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
usedns = yes
[recidive]
enabled = true
banaction = nftables[type=custom, family=inet, table=f2b-table, chain=f2b-chain, blocktype=drop]
bantime = 8d
bantime.increment = true
bantime.factor = 1
bantime.maxtime = 128d
bantime.multipliers = 1 2 4 8 16
bantime.overalljails = true
bantime.rndtime = 877s
filter = recidive
findtime = 16d
logpath = /var/log/fail2ban/fail2ban.log*
maxretry = 3
[sshd] [sshd]
enabled = true enabled = true
backend = systemd backend = systemd
filter = sshd bantime = 1h
mode = normal bantime.increment = true
port = ${VAR_SSH_PORT} bantime.factor = 1
protocol = tcp bantime.maxtime = 16d
logpath = /var/log/auth.log bantime.multipliers = 1 2 4 8 16 32 64 128 256 384
maxretry = 3 bantime.overalljails = true
findtime = 1d bantime.rndtime = 877s
bantime = 1d filter = sshd
findtime = 16m
mode = normal
port = ${VAR_SSH_PORT}
protocol = tcp
maxretry = 4
# #
# ufw aggressive approach: # CISS aggressive approach:
# Any valid client communicating with our server should be going directly to the service ports opened in ufw (ssh, 80, ...). # Any valid client communicating with our server should be going directly to the service ports opened in ufw (ssh, 80, ...).
# Any client touching other ports is treated malicious and therefore should be blocked access to ALL ports after 32 attempts. # Any client touching other ports is treated as malicious and therefore should be blocked access to ALL ports after 3 attempts.
# #
[ufw] [ufw]
enabled = true enabled = true
filter = ufw.aggressive banaction = nftables[type=custom, family=inet, table=f2b-table, chain=f2b-chain, blocktype=drop]
action = iptables-allports bantime = 1h
logpath = /var/log/ufw.log bantime.increment = true
maxretry = 32 bantime.factor = 1
findtime = 1d bantime.maxtime = 16d
bantime = 1d bantime.multipliers = 1 2 4 8 16 32 64 128 256 384
protocol = tcp,udp bantime.overalljails = true
bantime.rndtime = 877s
filter = ciss-ufw
findtime = 16m
logpath = /var/log/ufw.log
maxretry = 3
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
@@ -146,15 +241,20 @@ EOF
### Provider Hetzner needs special ignoreip rules. ### Provider Hetzner needs special ignoreip rules.
if [[ "${VAR_PROVIDER}" == "hetzner" ]]; then if [[ "${VAR_PROVIDER}" == "hetzner" ]]; then
sed -i '0,/^maxretry/{s/^maxretry/# Hetzner Intern\n 172.31.1.1\/16\n&/}' "${TARGET}/etc/fail2ban/jail.d/centurion-default.conf"
sed -i '0,/^maxretry/{s/^maxretry/# Hetzner Intern\n 172.31.1.1\/16\n&/}' "${var_target}/etc/fail2ban/jail.d/ciss-default.conf"
fi fi
insert_header "${TARGET}/etc/fail2ban/filter.d/ufw.aggressive.conf" insert_header "${var_target}/etc/fail2ban/filter.d/ciss-ufw.conf"
insert_comments "${TARGET}/etc/fail2ban/filter.d/ufw.aggressive.conf" insert_comments "${var_target}/etc/fail2ban/filter.d/ciss-ufw.conf"
cat << EOF >> "${TARGET}/etc/fail2ban/filter.d/ufw.aggressive.conf" cat << EOF >> "${var_target}/etc/fail2ban/filter.d/ciss-ufw.conf"
[Definition] [Definition]
failregex = ^.*UFW BLOCK.* SRC=<HOST> .*DPT=\d+ .* # Match UFW BLOCK/REJECT with a source IP and *any* port field (SPT or DPT), protocol may be missing.
ignoreregex = failregex = ^.*UFW (?:BLOCK|REJECT).*?\bSRC=<HOST>\b.*?(?:\bDPT=\d+\b|\bSPT=\d+\b).*$
ignoreregex =
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
# Hardening of fail2ban systemd: https://wiki.archlinux.org/title/fail2ban#Service_hardening # Hardening of fail2ban systemd: https://wiki.archlinux.org/title/fail2ban#Service_hardening
@@ -162,12 +262,12 @@ EOF
# file. "CAP_NET_ADMIN" and "CAP_NET_RAW" allow fail2ban to operate on any firewall that has a command-line shell interface. # file. "CAP_NET_ADMIN" and "CAP_NET_RAW" allow fail2ban to operate on any firewall that has a command-line shell interface.
# By using 'ProtectSystem=strict' the filesystem hierarchy will only be read-only; 'ReadWritePaths' allows Fail2ban to have # By using 'ProtectSystem=strict' the filesystem hierarchy will only be read-only; 'ReadWritePaths' allows Fail2ban to have
# write access on required paths. # write access on required paths.
mkdir -p "${TARGET}/etc/systemd/system/fail2ban.service.d" mkdir -p "${var_target}/etc/systemd/system/fail2ban.service.d"
mkdir -p "${TARGET}/var/log/fail2ban" mkdir -p "${var_target}/var/log/fail2ban"
insert_header "${TARGET}/etc/systemd/system/fail2ban.service.d/override.conf" insert_header "${var_target}/etc/systemd/system/fail2ban.service.d/override.conf"
insert_comments "${TARGET}/etc/systemd/system/fail2ban.service.d/override.conf" insert_comments "${var_target}/etc/systemd/system/fail2ban.service.d/override.conf"
cat << EOF >> "${TARGET}/etc/systemd/system/fail2ban.service.d/override.conf" cat << EOF >> "${var_target}/etc/systemd/system/fail2ban.service.d/override.conf"
[Service] [Service]
PrivateDevices=yes PrivateDevices=yes
PrivateTmp=yes PrivateTmp=yes
@@ -183,32 +283,63 @@ ProtectClock=true
ProtectHostname=true ProtectHostname=true
EOF EOF
cat << 'EOF' >> "${TARGET}/etc/fail2ban/fail2ban.local" cat << 'EOF' >> "${var_target}/etc/fail2ban/fail2ban.local"
[Definition] [Definition]
logtarget = /var/log/fail2ban/fail2ban.log logtarget = /var/log/fail2ban/fail2ban.log
[Database]
# Keep entries for at least 384 days to cover recidive findtime.
dbpurgeage = 384d
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
### Logrotate must be updated too. ### Logrotate must be updated too.
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc/logrotate.d" mkdir -p "${var_target}/root/.ciss/cdi/backup/etc/logrotate.d"
cp "${TARGET}/etc/logrotate.d/fail2ban" "${TARGET}/root/.ciss/cdi/backup/etc/logrotate.d/fail2ban.bak" cp "${var_target}/etc/logrotate.d/fail2ban" "${var_target}/root/.ciss/cdi/backup/etc/logrotate.d/fail2ban.bak"
sed -i 's/\/var\/log\/fail2ban.log/\/var\/log\/fail2ban\/fail2ban.log/1' "${TARGET}/etc/logrotate.d/fail2ban" cat << EOF >| "${var_target}/etc/logrotate.d/fail2ban"
touch "${TARGET}/var/log/fail2ban/fail2ban.log" /var/log/fail2ban/fail2ban.log {
chmod 640 "${TARGET}/var/log/fail2ban/fail2ban.log" daily
rotate 384
maxage 384
notifempty
dateext
dateyesterday
compress
compresscmd /usr/bin/zstd
compressext .zst
compressoptions -20
uncompresscmd /usr/bin/unzstd
delaycompress
shred
missingok
postrotate
fail2ban-client flushlogs 1>/dev/null
endscript
# If fail2ban runs as non-root it still needs to have write access
# to logfiles.
# create 640 fail2ban adm
create 640 root adm
}
EOF
touch "${var_target}/var/log/fail2ban/fail2ban.log"
chmod 0640 "${var_target}/var/log/fail2ban/fail2ban.log"
if [[ ! -f "${TARGET}/var/log/ufw.log" ]]; then if [[ ! -f "${var_target}/var/log/ufw.log" ]]; then
install -d -m 0755 "${TARGET}/var/log" install -d -m 0755 "${var_target}/var/log"
: >| "${TARGET}/var/log/ufw.log" : >| "${var_target}/var/log/ufw.log"
chmod 0640 "${TARGET}/var/log/ufw.log" chmod 0640 "${var_target}/var/log/ufw.log"
fi fi
### Merge / Dump-Parse via 'fail2ban-client -d'. All '*.conf', '*.local', and 'jail.*'-files are read, inherited, and merged. ### Merge / Dump-Parse via 'fail2ban-client -d'. All '*.conf', '*.local', and 'jail.*'-files are read, inherited, and merged.
### Syntax, path, and key errors result in a non-zero exit. ### Syntax, path, and key errors result in a non-zero exit.
chroot_script "${TARGET}" " chroot_script "${var_target}" "
fail2ban-client -d >> ${var_logfile} && echo "OK: config parsed" >> ${var_logfile} || echo "ERROR: config invalid" >> ${var_logfile} fail2ban-client -d >> ${var_logfile} && echo "OK: config parsed" >> ${var_logfile} || echo "ERROR: config invalid" >> ${var_logfile}
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_fail2ban
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,29 +10,66 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening files and directories. # Hardening files and directories.
# Globals: # Globals:
# None # RECOVERY
# TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
hardening_files() { hardening_files() {
chmod 0700 "${TARGET}/etc/cron.d" "${TARGET}/etc/cron.daily" "${TARGET}/etc/cron.hourly" "${TARGET}/etc/cron.monthly" \ declare var_bin="" var_binary=""
"${TARGET}/etc/cron.weekly" declare var_target="${TARGET}"
chmod 0700 "${TARGET}/etc/sudoers.d"
chmod 0700 "${TARGET}/etc/crontab"
rm -f "${TARGET}/etc/issue" "${TARGET}/etc/issue.net" ### Check for TARGET / RECOVERY.
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/issue" "${TARGET}/etc/issue" [[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/issue.net" "${TARGET}/etc/issue.net"
install -d -m 0700 -o root -g root "${TARGET}/root/.ansible" chmod 0700 "${var_target}/etc/cron.d" "${var_target}/etc/cron.daily" "${var_target}/etc/cron.hourly" "${var_target}/etc/cron.monthly" \
"${var_target}/etc/cron.weekly"
chmod 0700 "${var_target}/etc/sudoers.d"
chmod 0700 "${var_target}/etc/crontab"
guard_dir && return 0 [[ -f "${var_target}/etc/cron.deny" ]] && rm "${var_target}/etc/cron.deny"
### /etc/issue ---------------------------------------------------------------------------------------------------------------
rm -f "${var_target}/etc/issue" "${var_target}/etc/issue.net"
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/issue" "${var_target}/etc/issue"
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/issue.net" "${var_target}/etc/issue.net"
### /root/.ansible -----------------------------------------------------------------------------------------------------------
install -d -m 0700 -o root -g root "${var_target}/root/.ansible"
### /usr/bin/compiler --------------------------------------------------------------------------------------------------------
for var_bin in as gcc g++ cc clang; do
var_binary=$(readlink -f "${var_target}/usr/bin/${var_bin}") || {
do_log "info" "file_only" "4430() Binary: '${var_bin}' not found, skipping."
continue
}
chmod 0700 "${var_binary}" || {
do_log "info" "file_only" "4430() Binary chmod 0700: '${var_bin}' failed, skipping."
}
done
### /etc/update-motd.d/10-uname ----------------------------------------------------------------------------------------------
mkdir -p "${var_target}/root/.ciss/cdi/backup/etc/update-motd.d"
cp -af "${var_target}/etc/update-motd.d/10-uname" "${var_target}/root/.ciss/cdi/backup/etc/update-motd.d/10-uname"
cat << 'EOF' >| "${var_target}/etc/update-motd.d/10-uname"
#!/bin/sh
uname -snrm
EOF
chmod 0755 /etc/update-motd.d/10-uname
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_files
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,21 +10,29 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening haveged. # Hardening haveged.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
hardening_haveged() { hardening_haveged() {
insert_header "${TARGET}/etc/default/haveged" ### Declare Arrays, HashMaps, and Variables.
insert_comments "${TARGET}/etc/default/haveged" declare var_target="${TARGET}"
cat << EOF >> "${TARGET}/etc/default/haveged"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
insert_header "${var_target}/etc/default/haveged"
insert_comments "${var_target}/etc/default/haveged"
cat << EOF >> "${var_target}/etc/default/haveged"
# Configuration file for haveged # Configuration file for haveged
# Minimal, sane defaults for server/headless systems. # Minimal, sane defaults for server/headless systems.
# -w <bits> : target entropy level in bits; 1024 ensures fast pool fill on boot # -w <bits> : target entropy level in bits; 1024 ensures fast pool fill on boot
@@ -36,6 +44,9 @@ DAEMON_ARGS="-w 2048 -v 1"
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
EOF EOF
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_haveged
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,31 +10,36 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Updating 'machine-id' to 'whonix id'. # Hardening hardening_jitterentropy.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_SETUP_PATH # VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
setup_machineid() { hardening_jitterentropy() {
if [[ -f "${TARGET}/var/lib/dbus/machine-id" ]]; then declare var_target="${TARGET}"
rm -f "${TARGET}/var/lib/dbus/machine-id"
fi
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/etc/machine-id" "${TARGET}/var/lib/dbus/machine-id"
if [[ -f "${TARGET}/etc/machine-id" ]]; then ### Check for TARGET / RECOVERY.
rm -f "${TARGET}/etc/machine-id" [[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
fi
install -m 0644 -o root -g root "${VAR_SETUP_PATH}/includes/etc/machine-id" "${TARGET}/etc/machine-id"
do_log "info" "file_only" "Machine ID updated: 'machine-id' to 'whonix id'." mkdir -p "${var_target}/etc/systemd/system/jitterentropy-rngd.service.d"
return 0 cat << EOF >> "${var_target}/etc/systemd/system/jitterentropy-rngd.service.d/override.conf"
[Service]
ExecStart=
ExecStart=/usr/sbin/jitterentropy-rngd --osr=2
EOF
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_jitterentropy
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,95 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
#######################################
# Hardening '/etc/logrotate'.
# Globals:
# RECOVERY
# TARGET
# VAR_RUN_RECOVERY
# Arguments:
# None
# Returns:
# 0: on success
#######################################
hardening_logrotate() {
### Declare Arrays, HashMaps, and Variables.
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
rm -f "${var_target}/etc/logrotate.conf"
insert_header "${var_target}/etc/logrotate.conf"
insert_comments "${var_target}/etc/logrotate.conf"
cat << EOF >> "${var_target}/etc/logrotate.conf"
# See "man logrotate" for details. Global options do not affect preceding include directives.
# Rotate log files daily
daily
# Keep 384 daily worth of backlogs.
rotate 384
# Hard cap: delete rotated logs older than 384 days.
maxage 384
# Do not rotate the log if it is empty (this overrides the ifempty option).
notifempty
# Create new (empty) log files after rotating old ones.
create
# Use date as a suffix of the rotated file.
dateext
# Use yesterday's instead of today's date to create the dateext extension, so that the rotated log file has a date in its name
# that is the same as the timestamps within it.
dateyesterday
# Enable compression
compress
# Use zstd instead of gzip.
compresscmd /usr/bin/zstd
# File extension for compressed logs.
compressext .zst
# Set zstd level 3 (default).
compressoptions -20
# How to decompress for 'logrotate -d' or similar.
uncompresscmd /usr/bin/unzstd
# Keep the most recent rotation uncompressed for one cycle.
delaycompress
# Delete log files using shred -u instead of unlink().
shred
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may also be configured here.
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_logrotate
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# NOTE: # NOTE:
@@ -43,22 +43,27 @@ guard_sourcing
# '/etc/pam.d/common-session' # '/etc/pam.d/common-session'
# '/etc/pam.d/common-session-noninteractive' # '/etc/pam.d/common-session-noninteractive'
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_ARCHITECTURE # VAR_RUN_RECOVERY
# VAR_CODENAME
# VAR_VERSION
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
hardening_memory() { hardening_memory() {
mkdir -p "${TARGET}/etc/systemd/coredump.conf.d" ### Declare Arrays, HashMaps, and Variables.
mkdir -p "${TARGET}/etc/systemd/system.conf.d" declare var_target="${TARGET}"
insert_header "${TARGET}/etc/security/limits.d/99-ciss-core.conf" ### Check for TARGET / RECOVERY.
insert_comments "${TARGET}/etc/security/limits.d/99-ciss-core.conf" [[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
cat << 'EOF' >> "${TARGET}/etc/security/limits.d/99-ciss-core.conf"
mkdir -p "${var_target}/etc/systemd/coredump.conf.d"
mkdir -p "${var_target}/etc/systemd/system.conf.d"
insert_header "${var_target}/etc/security/limits.d/99-ciss-core.conf"
insert_comments "${var_target}/etc/security/limits.d/99-ciss-core.conf"
cat << 'EOF' >> "${var_target}/etc/security/limits.d/99-ciss-core.conf"
# Enforce: no core dumps for all logins by default. # Enforce: no core dumps for all logins by default.
# Format: <domain> <type> <item> <value> # Format: <domain> <type> <item> <value>
* hard core 0 * hard core 0
@@ -70,9 +75,9 @@ root soft core 0
EOF EOF
insert_header "${TARGET}/etc/systemd/coredump.conf.d/disable.conf" insert_header "${var_target}/etc/systemd/coredump.conf.d/disable.conf"
insert_comments "${TARGET}/etc/systemd/coredump.conf.d/disable.conf" insert_comments "${var_target}/etc/systemd/coredump.conf.d/disable.conf"
cat << 'EOF' >> "${TARGET}/etc/systemd/coredump.conf.d/disable.conf" cat << 'EOF' >> "${var_target}/etc/systemd/coredump.conf.d/disable.conf"
### Do not store core images anywhere, keep the at most minimal metadata. ### Do not store core images anywhere, keep the at most minimal metadata.
[Coredump] [Coredump]
@@ -85,30 +90,41 @@ JournalSizeMax=0
EOF EOF
[[ -f "${TARGET}/etc/systemd/system.conf.d/10-coredump-debian.conf" ]] && \ [[ -f "${var_target}/etc/systemd/system.conf.d/10-coredump-debian.conf" ]] && \
mv "${TARGET}/etc/systemd/system.conf.d/10-coredump-debian.conf" "${TARGET}/etc/systemd/system.conf.d/10-coredump-debian.conf.bak" mv "${var_target}/etc/systemd/system.conf.d/10-coredump-debian.conf" "${var_target}/etc/systemd/system.conf.d/10-coredump-debian.conf.bak"
insert_header "${TARGET}/etc/systemd/system.conf.d/99-ciss-core.conf" insert_header "${var_target}/etc/systemd/system.conf.d/99-ciss-core.conf"
insert_comments "${TARGET}/etc/systemd/system.conf.d/99-ciss-core.conf" insert_comments "${var_target}/etc/systemd/system.conf.d/99-ciss-core.conf"
cat << 'EOF' >> "${TARGET}/etc/systemd/system.conf.d/99-ciss-core.conf" cat << 'EOF' >> "${var_target}/etc/systemd/system.conf.d/99-ciss-core.conf"
[Manager] [Manager]
DefaultLimitCORE=0 DefaultLimitCORE=0
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=conf
EOF EOF
guard_pam_limits ### Unified in 4520()
# - write_pam_login()
# - write_pam_sshd()
# - write_pam_su()
# - write_pam_sudo()
# - write_pam_sudo-i()
# guard_pam_limits
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_memory
####################################### #######################################
# Ensure 'pam_limits.so' is activated in: # Ensure 'pam_limits.so' is activated in:
# '/etc/pam.d/common-session' # '/etc/pam.d/common-session'
# '/etc/pam.d/common-session-noninteractive' # '/etc/pam.d/common-session-noninteractive'
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -116,8 +132,13 @@ EOF
####################################### #######################################
guard_pam_limits() { guard_pam_limits() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare var_file_0="${TARGET}/etc/pam.d/common-session" declare var_target="${TARGET}"
declare var_file_1="${TARGET}/etc/pam.d/common-session-noninteractive"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
declare var_file_0="${var_target}/etc/pam.d/common-session"
declare var_file_1="${var_target}/etc/pam.d/common-session-noninteractive"
declare var_line='session required pam_limits.so' var_file="" declare var_line='session required pam_limits.so' var_file=""
declare -i var_changed=0 declare -i var_changed=0
@@ -156,6 +177,9 @@ guard_pam_limits() {
(( var_changed )) && do_log "info" "file_only" "4460() Activated pam_limits.so: (common-session[*])" (( var_changed )) && do_log "info" "file_only" "4460() Activated pam_limits.so: (common-session[*])"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f guard_pam_limits
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening OpenSSL library defaults (system-wide), TLSv1.2-, TLSv1.3-, AES-256-only. # Hardening OpenSSL library defaults (system-wide), TLSv1.2-, TLSv1.3-, AES-256-only.
@@ -30,6 +30,9 @@ hardening_openssl() {
insert_comments "${TARGET}/etc/ssl/openssl.cnf" insert_comments "${TARGET}/etc/ssl/openssl.cnf"
cat "${VAR_SETUP_PATH}/includes/target/etc/ssl/openssl.cnf" >> "${TARGET}/etc/ssl/openssl.cnf" cat "${VAR_SETUP_PATH}/includes/target/etc/ssl/openssl.cnf" >> "${TARGET}/etc/ssl/openssl.cnf"
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_openssl
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,15 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening 'ufw'. # Hardening 'ufw'.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_FINAL_NIC
# VAR_RUN_RECOVERY
# VAR_SSH_PORT # VAR_SSH_PORT
# VAR_UFW_OUT # VAR_UFW_OUT
# Arguments: # Arguments:
@@ -26,15 +29,22 @@ guard_sourcing
hardening_ufw() { hardening_ufw() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4470_hardening_ufw.log" declare -r var_logfile="/root/.ciss/cdi/log/4470_hardening_ufw.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
if [[ ! -f "${TARGET}/var/log/ufw.log" ]]; then declare -r var_rules="${var_target}/etc/ufw/before6.rules"
touch "${TARGET}/var/log/ufw.log"
chmod 0640 "${TARGET}/var/log/ufw.log"
chroot_logger "${var_target}${var_logfile}"
if [[ ! -f "${var_target}/var/log/ufw.log" ]]; then
touch "${var_target}/var/log/ufw.log"
chmod 0640 "${var_target}/var/log/ufw.log"
fi fi
chroot_script "${TARGET}" " chroot_script "${var_target}" "
ufw --force reset ufw --force reset
ufw logging medium ufw logging medium
ufw default deny incoming ufw default deny incoming
@@ -47,7 +57,7 @@ hardening_ufw() {
### Ensure that a standard set of the most commonly used ports are open if a default-'deny'-outbound policy is selected. ### Ensure that a standard set of the most commonly used ports are open if a default-'deny'-outbound policy is selected.
if [[ "${VAR_UFW_OUT}" = "deny" ]]; then if [[ "${VAR_UFW_OUT}" = "deny" ]]; then
chroot_script "${TARGET}" " chroot_script "${var_target}" "
ufw allow out 21/tcp comment 'Outgoing FTP' ufw allow out 21/tcp comment 'Outgoing FTP'
ufw allow out 22/tcp comment 'Outgoing SSH' ufw allow out 22/tcp comment 'Outgoing SSH'
ufw allow out 25/tcp comment 'Outgoing SMTP' ufw allow out 25/tcp comment 'Outgoing SMTP'
@@ -70,16 +80,31 @@ hardening_ufw() {
fi fi
### Allowing ICMP IPv4 outgoing per default. ### Allowing ICMP IPv4 outgoing per default.
sed -i "/# ok icmp code for FORWARD/i \# ok icmp codes for OUTPUT" "${TARGET}/etc/ufw/before.rules" sed -i "/# ok icmp code for FORWARD/i \# ok icmp codes for OUTPUT" "${var_target}/etc/ufw/before.rules"
sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type destination-unreachable -j ACCEPT" "${TARGET}/etc/ufw/before.rules" sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type destination-unreachable -j ACCEPT" "${var_target}/etc/ufw/before.rules"
sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type time-exceeded -j ACCEPT" "${TARGET}/etc/ufw/before.rules" sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type time-exceeded -j ACCEPT" "${var_target}/etc/ufw/before.rules"
sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type parameter-problem -j ACCEPT" "${TARGET}/etc/ufw/before.rules" sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type parameter-problem -j ACCEPT" "${var_target}/etc/ufw/before.rules"
sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type echo-request -j ACCEPT" "${TARGET}/etc/ufw/before.rules" sed -i "/# ok icmp code for FORWARD/i \-A ufw-before-output -p icmp --icmp-type echo-request -j ACCEPT" "${var_target}/etc/ufw/before.rules"
chroot_script "${TARGET}" "echo 'y' | ufw enable 2>&1" ### Remove previous custom blocks (idempotent).
sed -i "/^# BEGIN custom MLD rules/,/^# END custom MLD rules/d" "${var_rules}"
sed -i "/^# BEGIN custom MLD OUTPUT rules/,/^# END custom MLD OUTPUT rules/d" "${var_rules}"
chroot_script "${TARGET}" "ufw status verbose >> ${var_logfile}" ### Inbound MLD (INPUT chain), insert before the existing echo-request rule.
### Allows MLDv1 (130/131/132) and MLDv2 (143) to link-local multicast (ff02::/16)
sed -i "/-A ufw6-before-input .*--icmpv6-type echo-request -j ACCEPT/i # BEGIN custom MLD rules\n-A ufw6-before-input -i ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 130 -d ff02::/16 -j ACCEPT\n-A ufw6-before-input -i ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 131 -d ff02::/16 -j ACCEPT\n-A ufw6-before-input -i ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 132 -d ff02::/16 -j ACCEPT\n-A ufw6-before-input -i ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 143 -d ff02::/16 -j ACCEPT\n# END custom MLD rules" "${var_rules}"
guard_dir && return 0 ### Outbound MLD (OUTPUT chain), insert before echo-request.
### Useful if local daemons join multicast groups, and you want clean logs.
sed -i "/-A ufw6-before-output .*--icmpv6-type echo-request -j ACCEPT/i # BEGIN custom MLD OUTPUT rules\n-A ufw6-before-output -o ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 131 -d ff02::/16 -j ACCEPT\n-A ufw6-before-output -o ${VAR_FINAL_NIC} -p icmpv6 --icmpv6-type 143 -d ff02::/16 -j ACCEPT\n# END custom MLD OUTPUT rules" "${var_rules}"
chroot_script "${var_target}" "echo 'y' | ufw enable 2>&1"
chroot_script "${var_target}" "ufw status verbose >> ${var_logfile}"
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_ufw
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,7 +10,7 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening 'usb-guard'. # Hardening 'usb-guard'.
@@ -30,27 +30,34 @@ hardening_usb() {
### Preparing USBGuard: see https://www.privacy-handbuch.de/handbuch_91a.htm ### Preparing USBGuard: see https://www.privacy-handbuch.de/handbuch_91a.htm
chroot_script "${TARGET}" " chroot_script "${TARGET}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests usbguard 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests usbguard 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
touch /tmp/rules.conf touch /tmp/rules.conf
usbguard generate-policy >| /tmp/rules.conf usbguard generate-policy >| /tmp/rules.conf
if [[ -f /etc/usbguard/rules.conf && -s /etc/usbguard/rules.conf ]]; then if [[ -f /etc/usbguard/rules.conf && -s /etc/usbguard/rules.conf ]]; then
mkdir -p /root/.ciss/cdi/backup/etc/usbguard mkdir -p /root/.ciss/cdi/backup/etc/usbguard
mv /etc/usbguard/rules.conf /root/.ciss/cdi/backup/etc/usbguard/usbguard_rules.conf mv /etc/usbguard/rules.conf /root/.ciss/cdi/backup/etc/usbguard/usbguard_rules.conf
mv /tmp/rules.conf /etc/usbguard/rules.conf mv /tmp/rules.conf /etc/usbguard/rules.conf
chmod 0600 /etc/usbguard/rules.conf chmod 0600 /etc/usbguard/rules.conf
else else
rm -f /etc/usbguard/rules.conf rm -f /etc/usbguard/rules.conf
mv /tmp/rules.conf /etc/usbguard/rules.conf mv /tmp/rules.conf /etc/usbguard/rules.conf
chmod 0600 /etc/usbguard/rules.conf chmod 0600 /etc/usbguard/rules.conf
fi fi
#cp -a /etc/usbguard/usbguard-daemon.conf /root/.ciss/cdi/backup/etc/usbguard/usbguard-daemon.conf #cp -a /etc/usbguard/usbguard-daemon.conf /root/.ciss/cdi/backup/etc/usbguard/usbguard-daemon.conf
#sed -i 's/PresentDevicePolicy=apply-policy/PresentDevicePolicy=allow/' /etc/usbguard/usbguard-daemon.conf #sed -i 's/PresentDevicePolicy=apply-policy/PresentDevicePolicy=allow/' /etc/usbguard/usbguard-daemon.conf
" "
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_usb
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,10 +10,10 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Basic '/etc/crypttab' checks inside chroot. # Installing anti-rootkit and antivirus packages.
# Globals: # Globals:
# TARGET # TARGET
# Arguments: # Arguments:
@@ -21,12 +21,21 @@ guard_sourcing
# Returns: # Returns:
# 0: on success # 0: on success
####################################### #######################################
check_crypttab() { hardening_virus() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
#declare -r var_logfile="/root/.ciss/cdi/log/4215_check_crypttab.log" declare -r var_logfile="/root/.ciss/cdi/log/4490_hardening_virus.log"
#chroot_logger "${TARGET}${var_logfile}" chroot_logger "${TARGET}${var_logfile}"
guard_dir && return 0 chroot_script "${TARGET}" "
export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests rkhunter 2>&1 | tee -a ${var_logfile}
"
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f hardening_virus
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,13 +10,15 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Prepare '/etc/skel'-Directory. # Account generation preparation.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_SETUP_PATH # VAR_RUN_RECOVERY
# VAR_USER_ROOT_SPECIFIC
# Arguments: # Arguments:
# None # None
# Returns: # Returns:
@@ -24,39 +26,37 @@ guard_sourcing
####################################### #######################################
accounts_preparation() { accounts_preparation() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -r var_logfile="/root/.ciss/cdi/log/4130_installation_toolset.log" declare -r var_logfile="/root/.ciss/cdi/log/4500_accounts_preparation.sh.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_script "${TARGET}" " chroot_logger "${var_target}${var_logfile}"
chroot_script "${var_target}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests bash-completion fzf 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests bash-completion fzf 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
mkdir -p "${TARGET}/etc/skel/.ciss" mkdir -p "${var_target}/etc/skel/.ciss"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.bashrc" "${TARGET}/etc/skel/.bashrc" case "${VAR_USER_ROOT_SPECIFIC}" in
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.zshrc" "${TARGET}/etc/skel/.zshrc"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/theme_eza_ciss.yml" "${TARGET}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/.ciss/alias" "${TARGET}/etc/skel/.ciss/alias"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/.ciss/clean_logout.sh" "${TARGET}/etc/skel/.ciss/clean_logout.sh"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/.ciss/f2bchk.sh" "${TARGET}/etc/skel/.ciss/f2bchk.sh"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/.ciss/scan_libwrap" "${TARGET}/etc/skel/.ciss/scan_libwrap"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/root/.ciss/shortcuts" "${TARGET}/etc/skel/.ciss/shortcuts"
insert_comments "${TARGET}/etc/skel/.bashrc" "ciss" ) accounts_preparation_ciss ;;
insert_comments "${TARGET}/etc/skel/.zshrc"
insert_comments "${TARGET}/etc/skel/.ciss/alias"
insert_comments "${TARGET}/etc/skel/.ciss/clean_logout.sh"
insert_comments "${TARGET}/etc/skel/.ciss/f2bchk.sh"
insert_comments "${TARGET}/etc/skel/.ciss/scan_libwrap"
insert_comments "${TARGET}/etc/skel/.ciss/shortcuts"
### In order to be able to copy/paste from vim, one needs to create a '.vimrc' in every home directory with the following content: "physnet") accounts_preparation_physnet ;;
echo 'set clipboard=unnamed' >| "${TARGET}/etc/skel/.vimrc"
chmod 0600 "${TARGET}/etc/skel/.vimrc"
guard_dir && return 0 "none" ) do_log "info" "file_only" "4500() Account preparation [none] selected." ;;
* ) do_log "warn" "file_only" "4500() Account preparation nothing selected. Keeping defaults." ;;
esac
guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f accounts_preparation
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,66 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
#######################################
# Account preparation CISS specific.
# Globals:
# RECOVERY
# TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH
# Arguments:
# None
# Returns:
# 0: on success
#######################################
accounts_preparation_ciss() {
### Declare Arrays, HashMaps, and Variables.
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -d -m 0755 -- "${var_target}/etc/skel/.cache"
install -d -m 0755 -- "${var_target}/etc/skel/.config"
install -d -m 0755 -- "${var_target}/etc/skel/.local/share"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state/bash"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state/less"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss.bashrc" "${var_target}/etc/skel/.bashrc"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss.zshrc" "${var_target}/etc/skel/.zshrc"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.zshenv" "${var_target}/etc/skel/.zshenv"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/theme_eza_ciss.yml" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/alias" "${var_target}/etc/skel/.ciss/"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/check_chrony.sh" "${var_target}/etc/skel/.ciss/"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/clean_logout.sh" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/f2bchk" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/scan_libwrap" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/shortcuts" "${var_target}/etc/skel/.ciss/"
insert_comments "${var_target}/etc/skel/.bashrc"
insert_comments "${var_target}/etc/skel/.zshrc"
insert_comments "${var_target}/etc/skel/.ciss/alias"
insert_comments "${var_target}/etc/skel/.ciss/check_chrony.sh"
insert_comments "${var_target}/etc/skel/.ciss/clean_logout.sh"
insert_comments "${var_target}/etc/skel/.ciss/f2bchk"
insert_comments "${var_target}/etc/skel/.ciss/scan_libwrap"
insert_comments "${var_target}/etc/skel/.ciss/shortcuts"
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f accounts_preparation_ciss
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -0,0 +1,65 @@
#!/bin/bash
# SPDX-Version: 3.0
# SPDX-CreationInfo: 2025-06-17; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-ExternalRef: GIT https://git.coresecret.dev/msw/CISS.debian.installer.git
# SPDX-FileContributor: WEIDNER, Marc S.; Centurion Intelligence Consulting Agency
# SPDX-FileCopyrightText: 2024-2025; WEIDNER, Marc S.; <msw@coresecret.dev>
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: EUPL-1.2 OR LicenseRef-CCLA-1.0
# SPDX-LicenseComment: This file is part of the CISS.debian.installer.secure framework.
# SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu
guard_sourcing || return "${ERR_GUARD_SOURCE}"
#######################################
# Account preparation PHYSNET specific.
# Globals:
# RECOVERY
# TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH
# Arguments:
# None
# Returns:
# 0: on success
#######################################
accounts_preparation_physnet() {
### Declare Arrays, HashMaps, and Variables.
declare var_target="${TARGET}"
### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
install -d -m 0755 -- "${var_target}/etc/skel/.cache"
install -d -m 0755 -- "${var_target}/etc/skel/.config"
install -d -m 0755 -- "${var_target}/etc/skel/.local/share"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state/bash"
install -d -m 0755 -- "${var_target}/etc/skel/.local/state/less"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.physnet.bashrc" "${var_target}/etc/skel/.bashrc"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.physnet.zshrc" "${var_target}/etc/skel/.zshrc"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/theme_eza_ciss.yml" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/alias" "${var_target}/etc/skel/.ciss/"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/check_chrony.sh" "${var_target}/etc/skel/.ciss/"
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/clean_logout.sh" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/f2bchk" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/scan_libwrap" "${var_target}/etc/skel/.ciss/"
install -m 0600 -o root -g root "${VAR_SETUP_PATH}/includes/target/etc/skel/.ciss/shortcuts" "${var_target}/etc/skel/.ciss/"
insert_comments "${var_target}/etc/skel/.bashrc"
insert_comments "${var_target}/etc/skel/.zshrc"
insert_comments "${var_target}/etc/skel/.ciss/alias"
insert_comments "${var_target}/etc/skel/.ciss/check_chrony.sh"
insert_comments "${var_target}/etc/skel/.ciss/clean_logout.sh"
insert_comments "${var_target}/etc/skel/.ciss/f2bchk"
insert_comments "${var_target}/etc/skel/.ciss/scan_libwrap"
insert_comments "${var_target}/etc/skel/.ciss/shortcuts"
guard_dir; return 0
}
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f accounts_preparation_physnet
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

View File

@@ -10,12 +10,14 @@
# SPDX-PackageName: CISS.debian.installer # SPDX-PackageName: CISS.debian.installer
# SPDX-Security-Contact: security@coresecret.eu # SPDX-Security-Contact: security@coresecret.eu
guard_sourcing guard_sourcing || return "${ERR_GUARD_SOURCE}"
####################################### #######################################
# Hardening accounts: Google TOTP, Wordlists, masking ttys, expiration of accounts. # Hardening accounts: Google TOTP, Wordlists, masking ttys, expiration of accounts.
# Globals: # Globals:
# RECOVERY
# TARGET # TARGET
# VAR_RUN_RECOVERY
# VAR_SETUP_PATH # VAR_SETUP_PATH
# Arguments: # Arguments:
# None # None
@@ -26,25 +28,30 @@ accounts_hardening() {
### Declare Arrays, HashMaps, and Variables. ### Declare Arrays, HashMaps, and Variables.
declare -a ary_security_pkgs=() declare -a ary_security_pkgs=()
declare -r var_logfile="/root/.ciss/cdi/log/4510_accounts_hardening.log" declare -r var_logfile="/root/.ciss/cdi/log/4510_accounts_hardening.log"
declare var_target="${TARGET}"
chroot_logger "${TARGET}${var_logfile}" ### Check for TARGET / RECOVERY.
[[ "${VAR_RUN_RECOVERY}" == "true" ]] && var_target="${RECOVERY}"
chroot_logger "${var_target}${var_logfile}"
### Installing Google TOTP, Wordlists. ### Installing Google TOTP, Wordlists.
ary_security_pkgs=( "libpam-google-authenticator" "wamerican" "wbritish" "wfrench" "wngerman" ) ary_security_pkgs=( "libpam-google-authenticator" "wamerican" "wbritish" "wfrench" "wngerman" )
chroot_script "${TARGET}" " chroot_script "${var_target}" "
export INITRD=No export INITRD=No
[[ -r /root/ciss_xdg_tmp.sh ]] && . /root/ciss_xdg_tmp.sh
apt-get install -y --no-install-recommends --no-install-suggests ${ary_security_pkgs[*]} 2>&1 | tee -a ${var_logfile} apt-get install -y --no-install-recommends --no-install-suggests ${ary_security_pkgs[*]} 2>&1 | tee -a ${var_logfile}
echo ExitCode: \$? >> ${var_logfile}
" "
### Preparing 2fa hardening. ### Preparing 2fa hardening.
install -d -m 0755 -o root -g root "${TARGET}/etc/ciss" install -d -m 0755 -o root -g root "${var_target}/etc/ciss"
touch "${TARGET}/etc/ciss/2fa.users" insert_header "${var_target}/etc/ciss/2fa.map"
chmod 0640 "${TARGET}/etc/ciss/2fa.users" insert_comments "${var_target}/etc/ciss/2fa.map"
chmod 0644 "${var_target}/etc/ciss/2fa.map"
### Keep 'tty1' active, disable the rest. ### Keep 'tty1' active, disable the rest.
# shellcheck disable=SC2016 # shellcheck disable=SC2016
chroot_script "${TARGET}" ' chroot_script "${var_target}" '
systemctl unmask getty@tty1.service systemctl unmask getty@tty1.service
systemctl enable getty@tty1.service systemctl enable getty@tty1.service
for t in tty2 tty3 tty4 tty5 tty6; do for t in tty2 tty3 tty4 tty5 tty6; do
@@ -53,7 +60,7 @@ accounts_hardening() {
systemctl mask serial-getty@.service systemctl mask serial-getty@.service
' '
chroot_script "${TARGET}" " chroot_script "${var_target}" "
if [[ ! -f /etc/securetty ]]; then if [[ ! -f /etc/securetty ]]; then
touch /etc/securetty touch /etc/securetty
chmod 0600 /etc/securetty chmod 0600 /etc/securetty
@@ -62,42 +69,49 @@ accounts_hardening() {
" "
### Hardening file permissions. ### Hardening file permissions.
chown root:root "${TARGET}/etc/passwd" "${TARGET}/etc/group" chown root:root "${var_target}/etc/passwd" "${var_target}/etc/group"
chown root:shadow "${TARGET}/etc/shadow" "${TARGET}/etc/gshadow" chown root:shadow "${var_target}/etc/shadow" "${var_target}/etc/gshadow"
chmod 0644 "${TARGET}/etc/passwd" "${TARGET}/etc/group" chmod 0644 "${var_target}/etc/passwd" "${var_target}/etc/group"
chmod 0640 "${TARGET}/etc/shadow" "${TARGET}/etc/gshadow" chmod 0640 "${var_target}/etc/shadow" "${var_target}/etc/gshadow"
chmod 0600 "${TARGET}/etc/security/access.conf" chmod 0600 "${var_target}/etc/security/access.conf"
### Hardening '/etc/login.defs'. ### Hardening '/etc/login.defs'.
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc" mkdir -p "${var_target}/root/.ciss/cdi/backup/etc"
mv "${TARGET}/etc/login.defs" "${TARGET}/root/.ciss/cdi/backup/etc/login.defs.bak" mv "${var_target}/etc/login.defs" "${var_target}/root/.ciss/cdi/backup/etc/login.defs.bak"
insert_header "${TARGET}/etc/login.defs" insert_header "${var_target}/etc/login.defs"
insert_comments "${TARGET}/etc/login.defs" insert_comments "${var_target}/etc/login.defs"
cat "${VAR_SETUP_PATH}/includes/target/etc/login.defs" >> "${TARGET}/etc/login.defs" cat "${VAR_SETUP_PATH}/includes/target/etc/login.defs" >> "${var_target}/etc/login.defs"
### Hardening '/etc/security/pwquality.conf'. ### Hardening '/etc/security/pwquality.conf'.
mkdir -p "${TARGET}/root/.ciss/cdi/backup/etc/security" mkdir -p "${var_target}/root/.ciss/cdi/backup/etc/security"
mv "${TARGET}/etc/security/pwquality.conf" "${TARGET}/root/.ciss/cdi/backup/etc/security/pwquality.conf.bak" mv "${var_target}/etc/security/pwquality.conf" "${var_target}/root/.ciss/cdi/backup/etc/security/pwquality.conf.bak"
insert_header "${TARGET}/etc/security/pwquality.conf" insert_header "${var_target}/etc/security/pwquality.conf"
insert_comments "${TARGET}/etc/security/pwquality.conf" insert_comments "${var_target}/etc/security/pwquality.conf"
cat "${VAR_SETUP_PATH}/includes/target/etc/security/pwquality.cnf" >> "${TARGET}/etc/security/pwquality.conf" cat "${VAR_SETUP_PATH}/includes/target/etc/security/pwquality.cnf" >> "${var_target}/etc/security/pwquality.conf"
### Hardening '/etc/security/access.conf'. ### Hardening '/etc/security/access.conf'.
mv "${TARGET}/etc/security/access.conf" "${TARGET}/root/.ciss/cdi/backup/etc/security/access.conf.bak" mv "${var_target}/etc/security/access.conf" "${var_target}/root/.ciss/cdi/backup/etc/security/access.conf.bak"
insert_header "${TARGET}/etc/security/access.conf" insert_header "${var_target}/etc/security/access.conf"
insert_comments "${TARGET}/etc/security/access.conf" insert_comments "${var_target}/etc/security/access.conf"
cat "${VAR_SETUP_PATH}/includes/target/etc/security/access.cnf" >> "${TARGET}/etc/security/access.conf" cat "${VAR_SETUP_PATH}/includes/target/etc/security/access.cnf" >> "${var_target}/etc/security/access.conf"
### Hardening password expiration; defaults to 16,384 days. ### Hardening password expiration; defaults to 16,384 days.
install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/chroot/hooks/4510_password_expiration.hooks.sh" \ install -m 0700 -o root -g root "${VAR_SETUP_PATH}/includes/chroot/hooks/4510_password_expiration.hooks.sh" \
"${TARGET}/root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh" "${var_target}/root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh"
if ! chroot_script "${var_target}" "/root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh" "emergency"; then
do_log "warn" "file_only" "4510() Command: [chroot_script ${var_target} /root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh emergency] failed."
if ! chroot_script "${TARGET}" "/root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh" "emergency"; then
do_log "warn" "file_only" "4510() Command: [chroot_script ${TARGET} /root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh emergency] failed."
else else
do_log "debug" "file_only" "4510() Command: [chroot_script ${TARGET} /root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh emergency] successful."
do_log "debug" "file_only" "4510() Command: [chroot_script ${var_target} /root/.ciss/cdi/hooks/4510_password_expiration.hooks.sh emergency] successful."
fi fi
guard_dir && return 0 guard_dir; return 0
} }
### Prevents accidental 'unset -f'.
# shellcheck disable=SC2034
readonly -f accounts_hardening
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh # vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh

Some files were not shown because too many files have changed in this diff Show More