getch 0.1.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +75 -35
  4. data/assets/network-stack.conf +63 -0
  5. data/assets/system.conf +38 -0
  6. data/bin/getch +14 -4
  7. data/lib/clean.rb +149 -0
  8. data/lib/cmdline.rb +128 -0
  9. data/lib/cryptsetup.rb +132 -0
  10. data/lib/devs.rb +199 -0
  11. data/lib/dracut/encrypt.rb +36 -0
  12. data/lib/dracut/hybrid.rb +15 -0
  13. data/lib/dracut/lvm.rb +14 -0
  14. data/lib/dracut/minimal.rb +11 -0
  15. data/lib/dracut/root.rb +45 -0
  16. data/lib/dracut/zfs.rb +35 -0
  17. data/lib/dracut.rb +11 -0
  18. data/lib/fstab/encrypt.rb +44 -0
  19. data/lib/fstab/hybrid.rb +34 -0
  20. data/lib/fstab/lvm.rb +25 -0
  21. data/lib/fstab/minimal.rb +6 -0
  22. data/lib/fstab/root.rb +93 -0
  23. data/lib/fstab/zfs.rb +23 -0
  24. data/lib/fstab.rb +11 -0
  25. data/lib/getch/assembly.rb +150 -0
  26. data/lib/getch/command.rb +94 -124
  27. data/lib/getch/config/account.rb +39 -0
  28. data/lib/getch/config/dhcp.rb +104 -0
  29. data/lib/getch/config/grub.rb +42 -0
  30. data/lib/getch/config/iwd.rb +60 -0
  31. data/lib/getch/config/keymap.rb +78 -0
  32. data/lib/getch/config/locale.rb +96 -0
  33. data/lib/getch/config/portage.rb +90 -0
  34. data/lib/getch/config/pre_network.rb +37 -0
  35. data/lib/getch/config/timezone.rb +52 -0
  36. data/lib/getch/config/void.rb +11 -0
  37. data/lib/getch/config.rb +19 -53
  38. data/lib/getch/device.rb +67 -0
  39. data/lib/getch/filesystem/ext4/encrypt/config.rb +11 -68
  40. data/lib/getch/filesystem/ext4/encrypt/deps.rb +17 -25
  41. data/lib/getch/filesystem/ext4/encrypt/device.rb +13 -5
  42. data/lib/getch/filesystem/ext4/encrypt/format.rb +8 -15
  43. data/lib/getch/filesystem/ext4/encrypt/mount.rb +9 -13
  44. data/lib/getch/filesystem/ext4/encrypt/partition.rb +10 -82
  45. data/lib/getch/filesystem/ext4/encrypt/void.rb +63 -0
  46. data/lib/getch/filesystem/ext4/encrypt.rb +4 -0
  47. data/lib/getch/filesystem/ext4/hybrid/config.rb +27 -0
  48. data/lib/getch/filesystem/ext4/hybrid/deps.rb +55 -0
  49. data/lib/getch/filesystem/ext4/hybrid/device.rb +24 -0
  50. data/lib/getch/filesystem/ext4/hybrid/format.rb +23 -0
  51. data/lib/getch/filesystem/ext4/hybrid/mount.rb +21 -0
  52. data/lib/getch/filesystem/ext4/hybrid/partition.rb +27 -0
  53. data/lib/getch/filesystem/ext4/hybrid/void.rb +62 -0
  54. data/lib/getch/filesystem/ext4/hybrid.rb +19 -0
  55. data/lib/getch/filesystem/ext4/lvm/config.rb +25 -0
  56. data/lib/getch/filesystem/ext4/lvm/deps.rb +56 -0
  57. data/lib/getch/filesystem/ext4/lvm/device.rb +28 -0
  58. data/lib/getch/filesystem/ext4/lvm/format.rb +21 -0
  59. data/lib/getch/filesystem/ext4/lvm/mount.rb +21 -0
  60. data/lib/getch/filesystem/ext4/lvm/partition.rb +28 -0
  61. data/lib/getch/filesystem/{lvm.rb → ext4/lvm.rb} +8 -3
  62. data/lib/getch/filesystem/ext4/minimal/config.rb +25 -0
  63. data/lib/getch/filesystem/ext4/{device.rb → minimal/deps.rb} +4 -3
  64. data/lib/getch/filesystem/ext4/minimal/device.rb +22 -0
  65. data/lib/getch/filesystem/ext4/minimal/format.rb +23 -0
  66. data/lib/getch/filesystem/ext4/minimal/mount.rb +21 -0
  67. data/lib/getch/filesystem/ext4/minimal/partition.rb +28 -0
  68. data/lib/getch/filesystem/ext4/minimal.rb +19 -0
  69. data/lib/getch/filesystem/ext4.rb +9 -6
  70. data/lib/getch/filesystem/zfs/encrypt/config.rb +12 -57
  71. data/lib/getch/filesystem/zfs/encrypt/deps.rb +7 -86
  72. data/lib/getch/filesystem/zfs/encrypt/device.rb +9 -45
  73. data/lib/getch/filesystem/zfs/encrypt/format.rb +8 -90
  74. data/lib/getch/filesystem/zfs/encrypt/mount.rb +16 -34
  75. data/lib/getch/filesystem/zfs/encrypt/partition.rb +8 -50
  76. data/lib/getch/filesystem/zfs/encrypt.rb +4 -0
  77. data/lib/getch/filesystem/zfs/minimal/config.rb +37 -0
  78. data/lib/getch/filesystem/zfs/minimal/deps.rb +126 -0
  79. data/lib/getch/filesystem/zfs/minimal/device.rb +24 -0
  80. data/lib/getch/filesystem/zfs/minimal/format.rb +23 -0
  81. data/lib/getch/filesystem/zfs/minimal/mount.rb +23 -0
  82. data/lib/getch/filesystem/zfs/minimal/partition.rb +23 -0
  83. data/lib/getch/filesystem/zfs/minimal.rb +19 -0
  84. data/lib/getch/filesystem/zfs.rb +3 -6
  85. data/lib/getch/filesystem.rb +2 -6
  86. data/lib/getch/gentoo/bootloader.rb +47 -0
  87. data/lib/getch/gentoo/finalize.rb +25 -0
  88. data/lib/getch/gentoo/post_config.rb +75 -0
  89. data/lib/getch/gentoo/pre_config.rb +37 -0
  90. data/lib/getch/gentoo/services.rb +18 -0
  91. data/lib/getch/gentoo/sources.rb +82 -52
  92. data/lib/getch/gentoo/tarball.rb +91 -0
  93. data/lib/getch/gentoo/terraform.rb +34 -0
  94. data/lib/getch/gentoo/update.rb +54 -0
  95. data/lib/getch/gentoo/use.rb +11 -12
  96. data/lib/getch/gentoo/use_flag.rb +74 -52
  97. data/lib/getch/gentoo.rb +11 -63
  98. data/lib/getch/guard.rb +71 -0
  99. data/lib/getch/helpers.rb +128 -48
  100. data/lib/getch/log.rb +91 -26
  101. data/lib/getch/options.rb +79 -40
  102. data/lib/getch/states.rb +37 -10
  103. data/lib/getch/tree.rb +56 -0
  104. data/lib/getch/version.rb +1 -1
  105. data/lib/getch/void/bootloader.rb +18 -0
  106. data/lib/getch/void/finalize.rb +31 -0
  107. data/lib/getch/void/post_config.rb +19 -0
  108. data/lib/getch/void/pre_config.rb +18 -0
  109. data/lib/getch/void/services.rb +18 -0
  110. data/lib/getch/void/tarball.rb +89 -0
  111. data/lib/getch/void/terraform.rb +28 -0
  112. data/lib/getch/void/update.rb +33 -0
  113. data/lib/getch/void.rb +15 -0
  114. data/lib/getch.rb +104 -92
  115. data/lib/luks.rb +239 -0
  116. data/lib/lvm2.rb +112 -0
  117. data/lib/mkfs/zfs.rb +167 -0
  118. data/lib/mkfs.rb +140 -0
  119. data/lib/mountfs.rb +154 -0
  120. data/lib/nito.rb +131 -0
  121. data/lib/sgdisk.rb +160 -0
  122. data.tar.gz.sig +0 -0
  123. metadata +96 -45
  124. metadata.gz.sig +0 -0
  125. data/.gitignore +0 -2
  126. data/CHANGELOG.md +0 -90
  127. data/Rakefile +0 -21
  128. data/bin/setup.sh +0 -90
  129. data/getch.gemspec +0 -25
  130. data/lib/getch/filesystem/clean.rb +0 -51
  131. data/lib/getch/filesystem/device.rb +0 -61
  132. data/lib/getch/filesystem/ext4/config.rb +0 -58
  133. data/lib/getch/filesystem/ext4/deps.rb +0 -22
  134. data/lib/getch/filesystem/ext4/format.rb +0 -28
  135. data/lib/getch/filesystem/ext4/mount.rb +0 -23
  136. data/lib/getch/filesystem/ext4/partition.rb +0 -52
  137. data/lib/getch/filesystem/lvm/config.rb +0 -59
  138. data/lib/getch/filesystem/lvm/deps.rb +0 -42
  139. data/lib/getch/filesystem/lvm/device.rb +0 -43
  140. data/lib/getch/filesystem/lvm/encrypt/config.rb +0 -71
  141. data/lib/getch/filesystem/lvm/encrypt/deps.rb +0 -46
  142. data/lib/getch/filesystem/lvm/encrypt/device.rb +0 -46
  143. data/lib/getch/filesystem/lvm/encrypt/format.rb +0 -32
  144. data/lib/getch/filesystem/lvm/encrypt/mount.rb +0 -25
  145. data/lib/getch/filesystem/lvm/encrypt/partition.rb +0 -80
  146. data/lib/getch/filesystem/lvm/encrypt.rb +0 -15
  147. data/lib/getch/filesystem/lvm/format.rb +0 -29
  148. data/lib/getch/filesystem/lvm/mount.rb +0 -23
  149. data/lib/getch/filesystem/lvm/partition.rb +0 -69
  150. data/lib/getch/filesystem/mount.rb +0 -56
  151. data/lib/getch/filesystem/partition.rb +0 -77
  152. data/lib/getch/filesystem/zfs/config.rb +0 -57
  153. data/lib/getch/filesystem/zfs/deps.rb +0 -95
  154. data/lib/getch/filesystem/zfs/device.rb +0 -58
  155. data/lib/getch/filesystem/zfs/format.rb +0 -114
  156. data/lib/getch/filesystem/zfs/mount.rb +0 -48
  157. data/lib/getch/filesystem/zfs/partition.rb +0 -64
  158. data/lib/getch/gentoo/boot.rb +0 -109
  159. data/lib/getch/gentoo/chroot.rb +0 -77
  160. data/lib/getch/gentoo/config.rb +0 -129
  161. data/lib/getch/gentoo/stage.rb +0 -74
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c141cfefd0484364edafbbf424bc6e3d1fe98d26d5a2fa96411ae88efaae501a
4
- data.tar.gz: 117fb8c04c3525ac5c5be3da0683eac0b68de537f674955fe6d363091233ab0b
3
+ metadata.gz: c43bba03495a77a22b582c84f7e044383bc432fb8c8ca676d093673e836362af
4
+ data.tar.gz: 762dd43c65c336df63176b7945d75600153503c3ccdf7d899228cd18443bbda7
5
5
  SHA512:
6
- metadata.gz: fbf00fb976d8e4a1ea8a4e3abf64de42f9804b4b33b125548021f733d27e2458d6c6ec2e9712f3f92806b66253550c600c217f3ece4bf3310f5b39c5cb58aebf
7
- data.tar.gz: ed7af46af82c816f17296ba01301aece81d6655d4fc31c166fce5a013be8c20e5b89b8965c3d855913628c3566a47bd8b2ed123263c7dedaef5b3e3fdd0a6b4e
6
+ metadata.gz: 1f5a90d17518469533bfdcafd14b3e3ad155717c722182fca194bfd81fced2dc37ff0093af2da778cf53cadb5c4e23ae3fa7fe16d7809155f21f1e127c5bbc89
7
+ data.tar.gz: c533dbe161df1f6b72c3d690218547e926b219ff6bb19240f46bb040ccb2e86318cc5259b69b7692416c412e109fb5eb22fd424f9bca5d6dc1ae0ff70adc4cd0
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -1,34 +1,60 @@
1
1
  # Getch
2
- A CLI tool to install Gentoo.
2
+
3
+ <div align="center">
4
+ <br/>
5
+
6
+ [![Gem Version](https://badge.fury.io/rb/getch.svg)](https://badge.fury.io/rb/getch)
7
+ ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/szorfein/getch/Rubocop/develop)
8
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-rubocop-brightgreen.svg)](https://github.com/rubocop/rubocop)
9
+ ![GitHub](https://img.shields.io/github/license/szorfein/getch)
10
+
11
+ </div>
12
+
13
+ A CLI tool to install Gentoo or Void Linux with default:
14
+ + DNS over HTTPS (with [Quad9](https://www.quad9.net/)).
15
+ + Vim | Nano installed.
16
+ + Iptables installed (not configured).
17
+ + Sudo installed (not configured).
18
+ + [iwd](https://iwd.wiki.kernel.org/) installed if wifi is detected.
19
+ + No GUI installed.
20
+
21
+ Hardened System:
22
+ + sysctl.conf with TCP/IP stack hardening and more [Arch](https://wiki.archlinux.org/title/Sysctl)
23
+ + Kernel parameters enforced (dmesg restricted, kexec disabled, etc)
24
+ + Kernel source (Gentoo) patched with [bask](https://github.com/szorfein/bask).
25
+ + Musl optionnal
3
26
 
4
27
  ## Description
5
- Actually, Getch support only the [AMD64 handbook](https://wiki.gentoo.org/wiki/Handbook:AMD64) and only with the last `stage3-amd64-systemd`.
28
+ Actually, Getch support only the `x86_64` architecture with the following archives:
29
+ + **Gentoo**: `stage3-amd64-systemd` or `stage3-amd64-musl` [Gentoo](https://www.gentoo.org/downloads/).
30
+ + **Void**: `rootfs tarball glibc` or `rootfs tarball musl` [Void](https://voidlinux.org/download/).
6
31
 
7
- BIOS system will use `Grub2` and `systemd-boot` for UEFI. Filesystem supported by Getch are for now:
32
+ Filesystem supported (with or without encryption)
8
33
  + Ext4
9
- + LVM
34
+ + Lvm
10
35
  + ZFS
11
36
 
12
- Encryption is also supported.
37
+ Boot Manager:
38
+ + **Gentoo**: `BIOS` and `musl` will use `Grub2` and `systemd-boot` for `UEFI`.
39
+ + **Void**: use only Grub2.
13
40
 
14
41
  The ISO images i was able to test and that works:
15
42
  + [Archlinux](https://www.archlinux.org/download/)
16
43
  + [Archaeidae](https://github.com/szorfein/archaeidae): Custom Archiso that includes ZFS support.
17
44
 
45
+ You can also use your current `linux` host, just pay attention to the disk that will be used.
46
+
47
+ ## Dependencies
48
+ Getch is build without external libs, so it only require `ruby >= 2.5`.
49
+
18
50
  ## Install
19
51
  Getch is cryptographically signed, so add my public key (if you haven’t already) as a trusted certificate.
20
52
  With `gem` installed:
21
53
 
22
54
  $ gem cert --add <(curl -Ls https://raw.githubusercontent.com/szorfein/getch/master/certs/szorfein.pem)
23
-
24
55
  $ gem install getch -P HighSecurity
25
56
 
26
- When you boot from an `iso`, you can install `ruby`, `getch` and correct your `PATH=` directly with the `bin/setup.sh`:
27
-
28
- # sh <(curl -L https://raw.githubusercontent.com/szorfein/getch/master/bin/setup.sh)
29
- # source ~/.zshrc # or ~/.bashrc
30
-
31
- If you want to try the master branch:
57
+ If you want to try from the source:
32
58
 
33
59
  # git clone https://github.com/szorfein/getch
34
60
  # cd getch
@@ -46,51 +72,65 @@ For a french user:
46
72
 
47
73
  # getch --zoneinfo "Europe/Paris" --language fr_FR --keymap fr
48
74
 
49
- Install Gentoo on LVM:
75
+ Install Gentoo on LVM and use a different root disk `/dev/sdc`
50
76
 
51
- # getch --format lvm --disk sda
77
+ # getch --format ext4 --lvm --disk sdc
52
78
 
53
79
  Encrypt your disk with LVM with a french keymap
54
80
 
55
- # getch --format lvm --encrypt --keymap fr
81
+ # getch --format ext4 --lvm --encrypt --keymap fr
56
82
 
57
- Encrypt with ext4 and create a home directory /home/ninja
83
+ Encrypt with ext4 and create a new user `ninja`:
58
84
 
59
85
  # getch --format ext4 --encrypt --username ninja
60
86
 
61
- With ZFS:
87
+ With ZFS, if used with `--encrypt`, it use the native ZFS encryption:
62
88
 
63
89
  # getch --format zfs
64
90
 
91
+ With `Void Linux` and `Musl` enable:
92
+
93
+ # getch --os void --encrypt -k fr --musl
94
+
65
95
  ## Troubleshooting
66
96
 
67
- #### LVM
68
- Unless your old LVM volume group is also named `vg0`, `getch` may fail to partition your disk. You have to clean up your device before proceed with `vgremove` and `pvremove`. An short example how doing this with a volume group named `vg0`:
97
+ #### Old VG for LVM
98
+ If a old volume group exist, `getch` may fail to partition your disk. You have to clean up your device before proceed with `vgremove` and `pvremove`. An short example how doing this with a volume group named `vg0`:
69
99
 
70
100
  # vgdisplay | grep vg0
71
101
  # vgremove -f vg0
72
102
  # pvremove -f /dev/sdb
73
103
 
74
- #### Encryption enable on BIOS with ext4
75
- To decrypt your disk on BIOS system, you have to enter your password two times. One time for Grub and another time for the initramfs (Genkernel). [post](https://wiki.archlinux.org/index.php/GRUB#Encrypted_/boot).
76
- Also with GRUB, only a `us` keymap is working.
104
+ #### Encryption with GRUB
105
+ To decrypt your disk on GRUB, only the `us` keymap is working for now.
106
+
107
+ #### ZFS with Grub
108
+ By default, if you use ZFS with `musl` or `voidlinux` the `/boot` partition is not mounted automatically, so before an update, mout the partition.
109
+
110
+ # zpool status
111
+ # zfs mount bpool/BOOT/void
112
+ # ls /boot
113
+
114
+ #### ZFS with and without encryption
115
+ First time on ZFS after 5min
77
116
 
78
- #### With ZFS
79
- When Gentoo boot, the pool may fail to start, it's happen when the pool has not been `export` to the ISO. So just reboot on your ISO:
117
+ ```txt
118
+ dracut Warning: /dev/disk/by-uuid/<DISK> does not exist
119
+ ```
80
120
 
81
- You need the partuuid, pool are create with the first 5 characters, just replace `sdX` by your real device:
121
+ Dracut try to mount inexistent device. Just wait for enter in the shell and remove the disk uuid from `/lib/dracut/hooks/initqueue/finished/`
82
122
 
83
- # ls -l /dev/disk/by-partuuid/ | grep sdX4
84
- -> 150ed969...
85
- # zpool import -N -R /mnt rpool-150ed
123
+ # ls /lib/dracut/hooks/initqueue/finished/*
124
+ # rm /lib/dracut/hooks/initqueue/finished/dev*
125
+ # exit
86
126
 
87
- And export them correctly:
127
+ Dracut should finally start `mount-zfs.sh` and ask for a password if encrypted. After you first login, mount the `/boot` partition and recompile the initramfs and your good.
88
128
 
89
- # zpool export -a
129
+ + For Gentoo: `emerge --config sys-kernel/gentoo-kernel-bin`
130
+ + For Voidlinux: `xbps-reconfigure -fa`
90
131
 
91
- It's all.
132
+ If it doesn't work, try to start script manually (always in the shell):
92
133
 
93
- ## Issues
94
- If need more support for your hardware (network, sound card, ...), you can submit a [new issue](https://github.com/szorfein/getch/issues/new) and post the output of the following command:
95
- + lspci
96
- + lsmod
134
+ # . /lib/dracut/hooks/mount/98-mount-zsh.sh
135
+ # . /lib/dracut/hooks/mount/99-mount-root.sh
136
+ # exit
@@ -0,0 +1,63 @@
1
+ # https://wiki.archlinux.org/title/Sysctl#TCP/IP_stack_hardening
2
+ # https://github.com/trimstray/the-practical-linux-hardening-guide/wiki/Network-stack
3
+
4
+ # TCP SYN cookie protection
5
+ net.ipv4.tcp_syncookies = 1
6
+
7
+ # TCP rfc1337
8
+ net.ipv4.tcp_rfc1337 = 1
9
+
10
+ # Reverse path filtering
11
+ net.ipv4.conf.default.rp_filter = 1
12
+ net.ipv4.conf.all.rp_filter = 1
13
+
14
+ # Log martian packets
15
+ net.ipv4.conf.default.log_martians = 1
16
+ net.ipv4.conf.all.log_martians = 1
17
+
18
+ # Disable ICMP redirects
19
+ net.ipv6.conf.all.accept_redirects = 0
20
+ net.ipv6.conf.default.accept_redirects = 0
21
+
22
+ # Disable IP source routing
23
+ net.ipv4.conf.default.accept_source_route = 0
24
+ net.ipv4.conf.all.accept_source_route = 0
25
+
26
+ # Ignore ICMP echo requests
27
+ net.ipv4.icmp_echo_ignore_all = 1
28
+ net.ipv6.icmp.echo_ignore_all = 1
29
+
30
+ # Ignoring broadcasts request
31
+ net.ipv4.icmp_echo_ignore_broadcasts = 1
32
+
33
+ # An illicit router advertisement message could result in a man-in-the-middle attack.
34
+ net.ipv6.conf.default.accept_ra = 0
35
+ net.ipv6.conf.all.accept_ra = 0
36
+
37
+ # Ignore bogus ICMP error responses
38
+ net.ipv4.icmp_ignore_bogus_error_responses = 1
39
+
40
+ # ICMP redirects
41
+ net.ipv4.conf.default.accept_redirects = 0
42
+ net.ipv4.conf.all.accept_redirects = 0
43
+
44
+ # Accepting secure redirects
45
+ net.ipv4.conf.default.secure_redirects = 0
46
+ net.ipv4.conf.all.secure_redirects = 0
47
+
48
+ # IP forwarding
49
+ net.ipv4.ip_forward = 0
50
+
51
+ # Sending ICMP redirects
52
+ net.ipv4.conf.default.send_redirects = 0
53
+ net.ipv4.conf.all.send_redirects = 0
54
+
55
+ # Keep sockets in FIN-WAIT-2 state
56
+ net.ipv4.tcp_fin_timeout = 30
57
+
58
+ # Keepalive packets to keep an connection alive
59
+ net.ipv4.tcp_keepalive_time = 180
60
+ net.ipv4.tcp_keepalive_intvl = 10
61
+ net.ipv4.tcp_keepalive_probes = 3
62
+
63
+
@@ -0,0 +1,38 @@
1
+ # Disable SysReq
2
+ kernel.sysrq = 0
3
+
4
+ # No core dump of executable setuid
5
+ fs.suid_dumpable = 0
6
+
7
+ # Prohibit unreferencing links to files
8
+ fs.protected_symlinks = 1
9
+ fs.protected_hardlinks = 1
10
+
11
+ # Activate ASLR
12
+ kernel.randomize_va_space = 2
13
+
14
+ # Prohibit mapping of memory in low addresses (0)
15
+ vm.mmap_min_addr = 65536
16
+
17
+ # Larger choice space for PID values
18
+ kernel.pid_max = 65536
19
+
20
+ # Obfuscation of addresses memory kernel
21
+ kernel.kptr_restrict = 1
22
+
23
+ # Access restriction to the dmesg buffer
24
+ kernel.dmesg_restrict = 1
25
+
26
+ # Restricts the use of the perf system
27
+ kernel.perf_event_paranoid = 2
28
+ kernel.perf_event_max_sample_rate = 1
29
+ kernel.perf_cpu_time_max_percent = 1
30
+
31
+ # Avoid non-ancestor ptrace access to running processes and their credentials.
32
+ kernel.yama.ptrace_scope = 1
33
+
34
+ # Disable User Namespaces
35
+ user.max_user_namespaces = 0
36
+
37
+ # Turn off unprivileged eBPF access.
38
+ kernel.unprivileged_bpf_disabled = 1
data/bin/getch CHANGED
@@ -2,8 +2,18 @@
2
2
 
3
3
  require 'getch'
4
4
 
5
- def main(argv)
6
- Getch::main(argv)
7
- end
5
+ getch = Getch::Main.new(
6
+ cli: Getch::Options.new(ARGV)
7
+ )
8
8
 
9
- main(ARGV)
9
+ getch.resume
10
+
11
+ getch.prepare_disk
12
+
13
+ getch.install_system
14
+
15
+ getch.terraform
16
+
17
+ getch.bootloader
18
+
19
+ getch.finalize
data/lib/clean.rb ADDED
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nito'
4
+ require_relative 'getch/command'
5
+ require_relative 'getch/log'
6
+
7
+ class Clean
8
+ include NiTo
9
+
10
+ def initialize(args)
11
+ @root = args[:disk] ||= nil
12
+ @boot = args[:boot_disk] ||= nil
13
+ @home = args[:home_disk] ||= nil
14
+ @cache = args[:cache_disk] ||= nil
15
+ @vg = args[:vg_name] ||= nil
16
+ @luks = args[:luks_name] ||= nil
17
+ @zfs = args[:zfs_name] ||= 'pool'
18
+ @log = Getch::Log.new
19
+ @mountpoint = args[:mountpoint] ||= '/mnt/getch'
20
+ end
21
+
22
+ def x
23
+ umount_all
24
+ swap_off
25
+ disable_lvs
26
+ cryptsetup_close
27
+ old_zfs
28
+ old_lvm
29
+ zap_all @root, @boot, @home, @cache
30
+ wipe_all @root, @boot, @home, @cache
31
+ dd
32
+ end
33
+
34
+ protected
35
+
36
+ def umount_all
37
+ paths = []
38
+ File.open('/proc/mounts').each do |l|
39
+ tmp = l.split(' ') if l =~ /#{@mountpoint}/
40
+ tmp && paths << tmp[1]
41
+ end
42
+ paths.each { |p| umount_r p }
43
+ umount '/tmp/boot'
44
+ end
45
+
46
+ def swap_off
47
+ swapoff @root
48
+ File.exist?("/dev/#{@vg}/swap") && swapoff_dm("#{@vg}-swap")
49
+ end
50
+
51
+ def disable_lvs
52
+ lvchange_n 'home'
53
+ lvchange_n 'swap'
54
+ lvchange_n 'root'
55
+ end
56
+
57
+ def cryptsetup_close
58
+ close "boot-#{@luks}"
59
+ close "root-#{@luks}"
60
+ close "home-#{@luks}"
61
+ end
62
+
63
+ def old_zfs
64
+ return unless File.exist? '/usr/bin/zpool'
65
+
66
+ destroy_zpool "b#{@zfs}"
67
+ destroy_zpool "r#{@zfs}"
68
+ cmd "rm -rf #{@mountpoint}/*" if Dir.exist? @mountpoint
69
+ end
70
+
71
+ def destroy_zpool(name)
72
+ if system("zpool list | grep #{name}")
73
+ cmd "zpool destroy -f #{name}"
74
+ end
75
+ end
76
+
77
+ def old_lvm
78
+ lvm = `lvs | grep #{@vg}`
79
+ lvm.match?(/#{@vg}/) || return
80
+
81
+ vgremove
82
+ pvremove @root, @home, @cache
83
+ end
84
+
85
+ def zap_all(*devs)
86
+ devs.each { |d| zap(d) }
87
+ end
88
+
89
+ def wipe_all(*devs)
90
+ devs.each { |d| wipe(d) }
91
+ end
92
+
93
+ def dd
94
+ cmd "dd if=/dev/zero of=/dev/#{@root} bs=1M count=100"
95
+ end
96
+
97
+ private
98
+
99
+ def wipe(dev)
100
+ dev || return
101
+
102
+ cmd "wipefs --all /dev/#{dev}"
103
+ end
104
+
105
+ def umount_r(dir)
106
+ dir || return
107
+
108
+ cmd 'umount', '-R', dir if mount? dir
109
+ end
110
+
111
+ def zap(dev)
112
+ dev || return
113
+
114
+ cmd 'sgdisk', '-Z', "/dev/#{dev}"
115
+ end
116
+
117
+ def lvchange_n(name)
118
+ return unless File.exist? "/dev/#{@vg}/#{name}"
119
+
120
+ cmd 'lvchange', '-an', "/dev/#{@vg}/#{name}"
121
+ end
122
+
123
+ def close(name)
124
+ return unless File.exist? "/dev/mapper/#{name}"
125
+
126
+ cmd 'cryptsetup', 'close', name
127
+ end
128
+
129
+ def vgremove
130
+ cmd 'vgremove', '-y', @vg
131
+ end
132
+
133
+ def pvremove(*devs)
134
+ devs.each { |d| pvdel(d) }
135
+ end
136
+
137
+ def pvdel(dev)
138
+ dev || return
139
+
140
+ disk = dev[/[a-z]*/]
141
+ disk.match?(/[a-z]{3}/) || @log.fatal("pvdel - No disk #{dev} - #{disk}")
142
+
143
+ cmd 'pvremove', '-f', "/dev/#{disk}*"
144
+ end
145
+
146
+ def cmd(*args)
147
+ Getch::Command.new(args)
148
+ end
149
+ end
data/lib/cmdline.rb ADDED
@@ -0,0 +1,128 @@
1
+ module CmdLine
2
+ def echo(path, content, mode = 0700)
3
+ f = File.new path, 'w'
4
+ f.write "#{content}\n"
5
+ f.chmod mode
6
+ f.close
7
+ end
8
+
9
+ class Kernel
10
+ include CmdLine
11
+
12
+ # man kernel-install
13
+ # use /etc/kernel/cmdline by default
14
+ def initialize(arg)
15
+ @dir = arg[:workdir]
16
+ @file = "#{@dir}/cmdline"
17
+ @line = ''
18
+ end
19
+
20
+ def main
21
+ puts ' > Generate cmdline for Kernel...'
22
+ cpu_mitigations
23
+ distrust_cpu
24
+ kernel_hardening
25
+ quiet
26
+
27
+ puts " >> Writing cmdline to #{@file}..."
28
+ echo @file, "#{@line}\n", 0644
29
+ end
30
+
31
+ private
32
+
33
+ def cpu_mitigations
34
+ @line << 'mds=full,nosmt'
35
+ @line << ' l1tf=full,force'
36
+ @line << ' kvm.nx_huge_pages=force'
37
+ end
38
+
39
+ def distrust_cpu
40
+ @line << ' random.trust_cpu=off'
41
+ end
42
+
43
+ def kernel_hardening
44
+ @line << ' slab_nomerge'
45
+ @line << ' slub_debug=FZ'
46
+ @line << ' init_on_alloc=1 init_on_free=1'
47
+ @line << ' mce=0'
48
+ @line << ' pti=on'
49
+ @line << ' vsyscall=none'
50
+ @line << ' page_alloc.shuffle=1'
51
+ @line << ' debugfs=off'
52
+ end
53
+
54
+ def quiet
55
+ @line << ' quiet loglevel=0'
56
+ end
57
+ end
58
+
59
+ class Grub
60
+ include CmdLine
61
+
62
+ def initialize(arg)
63
+ @conf = arg[:workdir]
64
+ @default_alias = 'GRUB_CMDLINE_LINUX_DEFAULT'
65
+ @cmd_alias = 'GRUB_CMDLINE_LINUX'
66
+ end
67
+
68
+ def main
69
+ puts ' > Generate cmdline for Grub...'
70
+ cpu_mitigations
71
+ distrust_cpu
72
+ kernel_hardening
73
+ quiet
74
+ end
75
+
76
+ private
77
+
78
+ def cpu_mitigations
79
+ lines = []
80
+ lines << add_linux('mds=full,nosmt')
81
+ lines << add_linux('l1tf=full,force')
82
+ lines << add_linux('kvm.nx_huge_pages=force')
83
+
84
+ puts " >> Writing to #{@conf}/40_cpu_mitigations.cfg"
85
+ echo "#{@conf}/40_cpu_mitigations.cfg", lines.join("\n"), 0755
86
+ end
87
+
88
+ def distrust_cpu
89
+ lines = []
90
+ lines << add_linux('random.trust_cpu=off')
91
+
92
+ puts " >> Writing to #{@conf}/40_distrust_cpu.cfg"
93
+ echo "#{@conf}/40_distrust_cpu.cfg", lines.join("\n"), 0755
94
+ end
95
+
96
+ def kernel_hardening
97
+ lines = []
98
+ lines << add_linux('slab_nomerge')
99
+ lines << add_linux('slub_debug=FZ')
100
+ lines << add_linux('init_on_alloc=1 init_on_free=1')
101
+ lines << add_linux('mce=0')
102
+ lines << add_linux('pti=on')
103
+ lines << add_linux('vsyscall=none')
104
+ lines << add_linux('page_alloc.shuffle=1')
105
+ lines << add_linux('debugfs=off')
106
+
107
+ puts " >> Writing to #{@conf}/40_kernel_hardening.cfg"
108
+ echo "#{@conf}/40_kernel_hardening.cfg", lines.join("\n"), 0755
109
+ end
110
+
111
+ def quiet
112
+ lines = []
113
+ lines << "#{@default_alias}=\"$(echo \"$#{@default_alias}\" | LANG=C str_replace \"quiet\" \"\")\""
114
+ lines << add_linux_default('quiet loglevel=0')
115
+
116
+ puts " >> Writing to #{@conf}/41_quiet.cfg"
117
+ echo "#{@conf}/41_quiet.cfg", lines.join("\n"), 0755
118
+ end
119
+
120
+ def add_linux(arg)
121
+ "#{@cmd_alias}=\"$#{@cmd_alias} #{arg}\""
122
+ end
123
+
124
+ def add_linux_default(arg)
125
+ "#{@default_alias}=\"$#{@default_alias} #{arg}\""
126
+ end
127
+ end
128
+ end