root ನೀಡದೆ OpenVPN ಗೆ CAP_NET_ADMIN ನೀಡುವುದು
ಸವಲತ್ತು ಇಲ್ಲದ ಬಳಕೆದಾರರಾಗಿ ಪ್ರಾರಂಭವಾಗುವ ಯುನಿಟ್ಗೆ ಇನ್ನೂ ಸರಿಯಾದ ಸಾಮರ್ಥ್ಯ ಸಮೂಹ ಬೇಕು. ಯುನಿಟ್, ಜೀವಂತ ಪ್ರಕ್ರಿಯೆ ಮತ್ತು exec ಮಿತಿಯನ್ನು ಈ ಕ್ರಮದಲ್ಲಿ ಪರಿಶೀಲಿಸಿ.
ಸೇವೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ, ಲಾಗ್ tun ಸಾಧನವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ ಎಂದು ದೂರುತ್ತದೆ, ಮತ್ತು ಮಾರ್ಗಗಳು ಎಂದಿಗೂ ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ. ನಿಮ್ಮ ಶೆಲ್ನಲ್ಲಿ capsh --print ಚಲಾಯಿಸಿ ಮತ್ತು cap_net_admin ಅಲ್ಲೇ ಇರುತ್ತದೆ, ಇದು ವೈಫಲ್ಯವನ್ನು ಅಸಾಧ್ಯವೆಂದು ತೋರಿಸುತ್ತದೆ. ನಿಮ್ಮ ಶೆಲ್ ಮತ್ತು ಯುನಿಟ್ ನಡುವೆ ವ್ಯತ್ಯಾಸವಾಗುವುದು ಸವಲತ್ತು ಸಂಕ್ರಮಣ, ಕರ್ನಲ್ನ ಸಾಮರ್ಥ್ಯ ನೀಡುವ ಸಿದ್ಧತೆ ಅಲ್ಲ. ಕೆಳಗಿನ ನಾಲ್ಕು ಪರಿಶೀಲನೆಗಳನ್ನು ಕ್ರಮವಾಗಿ ಮಾಡಿ ಮತ್ತು ವ್ಯತ್ಯಾಸವನ್ನು ವಿವರಿಸುವ ಮೊದಲನೆಯದರಲ್ಲಿ ನಿಲ್ಲಿಸಿ.
ಕಾಣೆಯಾದ ಸಾಮರ್ಥ್ಯವನ್ನು ಗುಪ್ತ ಸಾಧನದಿಂದ ಬೇರ್ಪಡಿಸಿ
ಲಾಗ್ ಸಾಲಿನಿಂದ ಎರಡು ವೈಫಲ್ಯಗಳು ಒಂದೇ ರೀತಿ ಕಾಣುತ್ತವೆ. CAP_NET_ADMIN ಇಲ್ಲದ ಪ್ರಕ್ರಿಯೆ ಸುರಂಗದ ಇಂಟರ್ಫೇಸ್ ರಚಿಸಲು ಅಥವಾ ಸಂರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಮತ್ತು ಅದರ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್ /dev/net/tun ಅನ್ನು ಮರೆಮಾಡುವ ಪ್ರಕ್ರಿಯೆ ಅದನ್ನು ಮೊದಲೇ ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ. ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಸೇರಿಸುವುದರಿಂದ ಎರಡನೆಯ ಸಂದರ್ಭ ಸರಿಯಾಗುವುದಿಲ್ಲ.
ಏನನ್ನಾದರೂ ಸಂಪಾದಿಸುವ ಮೊದಲು ಸಾಧನವು ಸೇವೆಯ ಹೆಸರಿನ ಜಾಗದೊಳಗೆ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. PrivateDevices=yes tun ನೋಡ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ತೆಗೆದುಹಾಕುವ ಸಾಮಾನ್ಯ ಗಟ್ಟಿಗೊಳಿಸುವ ಸಾಲು, ಮತ್ತು ನಿರ್ಬಂಧಕ ProtectSystem ಸಂರಚನಾ ಮಾರ್ಗವನ್ನು ಅನುಮತಿ ದೋಷದಂತೆ ಓದುವ ರೀತಿಯಲ್ಲಿ ಓದಲು-ಮಾತ್ರ ಮಾಡಬಹುದು. ಎರಡೂ ಸುರಂಗವನ್ನು ಉಲ್ಲೇಖಿಸುವ ಲಾಗ್ ಸಾಲುಗಳನ್ನು ಉಂಟುಮಾಡುತ್ತವೆ, ಆದ್ದರಿಂದ ದೋಷ ಸಾಮರ್ಥ್ಯಗಳ ಮೇಲೆ ಬೀಳುತ್ತದೆ. ಮೊದಲು ನೋಡ್ ಇದೆ ಮತ್ತು ತೆರೆಯಬಹುದು ಎಂದು ಖಚಿತಪಡಿಸಿ, ನಂತರ ಮುಂದುವರಿಯಿರಿ.
ನೀವು ಯಾವ ಸಾಮರ್ಥ್ಯ ಸಮೂಹವನ್ನು ನೋಡುತ್ತಿದ್ದೀರಿ ಎಂದು ತಿಳಿಯಿರಿ
Linux ಅನುಮತಿಸಲಾದ, ಪರಿಣಾಮಕಾರಿ, ಆನುವಂಶಿಕ, ಸೀಮಿತ ಮತ್ತು ಪರಿಸರ ಸಮೂಹಗಳನ್ನು ಇಟ್ಟುಕೊಳ್ಳುತ್ತದೆ, ಮತ್ತು ಪರಿಸರ ಸಮೂಹವೇ root ಅಲ್ಲದ ಬಳಕೆದಾರರ exec ನಂತರ ಉಳಿಯುವುದು. ಬೈನರಿಯಲ್ಲಿನ ಕಡತ ಸಾಮರ್ಥ್ಯಗಳು exec ಸಮಯದಲ್ಲಿ ಅನುಮತಿಸಲಾದ ಮತ್ತು ಪರಿಣಾಮಕಾರಿ ಹಕ್ಕುಗಳನ್ನು ನೀಡಬಹುದು, ಆದರೆ ಸರಪಳಿಯಲ್ಲಿ ಯಾವುದೂ ಆ ವರ್ಗಾವಣೆಯನ್ನು ತಡೆಯದಿರುವವರೆಗೆ ಮಾತ್ರ.
ಇಲ್ಲಿ sudo ಜನರನ್ನು ದಾರಿತಪ್ಪಿಸುತ್ತದೆ. sudo -u ಮೂಲಕ ಚಲಾಯಿಸಿದ ಆಜ್ಞೆ ಹೊಸ ಸವಲತ್ತು ಸಂಕ್ರಮಣವನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತದೆ ಮತ್ತು ಪರಿಸರ ಸಮೂಹ ಹೋಗುತ್ತದೆ, ಆದ್ದರಿಂದ root ಆಗಿ ಯಶಸ್ವಿಯಾಗುವ ಅದೇ ಪರಿಶೀಲನೆ ಅಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ. ಸೇವಾ ನಿರ್ವಾಹಕವು ಇನ್ನೊಂದು ಸಂಕ್ರಮಣ, ಮತ್ತು ಯುನಿಟ್ ಹೇಳದಿದ್ದರೆ ಅದು ಪರಿಸರದ ಏನನ್ನೂ ನೀಡುವುದಿಲ್ಲ.
ಸಾಮರ್ಥ್ಯವನ್ನು ಯುನಿಟ್ನಲ್ಲಿ ನೀಡಿ, ಸುತ್ತುವರಿಕೆಯಲ್ಲಿ ಅಲ್ಲ
ಸಾಧನ ರಚಿಸಿ ಮಾರ್ಗಗಳನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾದ ಸುರಂಗಕ್ಕೆ ಕನಿಷ್ಠ ಸೇವಾ ವಿಭಾಗ ಹೀಗೆ ಕಾಣುತ್ತದೆ.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities ಪ್ರಕ್ರಿಯೆ ಪ್ರಾರಂಭವಾಗುವ ಮೊದಲೇ ಹಕ್ಕನ್ನು ಪರಿಸರ ಸಮೂಹಕ್ಕೆ ಹಾಕುತ್ತದೆ, ಮತ್ತು CapabilityBoundingSet ಆ ಪಟ್ಟಿಯ ಹೊರಗೆ ಏನನ್ನೂ ಪ್ರಕ್ರಿಯೆ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳದಂತೆ ತಡೆಯುತ್ತದೆ. NoNewPrivileges=yes setuid ಅಥವಾ ಕಡತ ಸಾಮರ್ಥ್ಯಗಳ ಮೂಲಕ ಸವಲತ್ತು ಗಳಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ, ಆದರೆ ಯುನಿಟ್ ಸ್ಪಷ್ಟವಾಗಿ ನೀಡುವ ಸಾಮರ್ಥ್ಯ ಇನ್ನೂ ಅನ್ವಯಿಸುತ್ತದೆ. CAP_NET_BIND_SERVICE ಅನ್ನು ಸೇವೆ ಕೆಳಮಟ್ಟದ ಪೋರ್ಟ್ ಬಂಧಿಸಬೇಕಾದಾಗ ಮಾತ್ರ ಸೇರಿಸಿ, ಮತ್ತು ಫೋರಮ್ ಥ್ರೆಡ್ ಹಾಗೆ ಮಾಡಿದೆ ಎಂಬ ಕಾರಣಕ್ಕೆ ಮಾತ್ರ CAP_SYS_ADMIN ಅನ್ನು ಎಂದಿಗೂ ಸೇರಿಸಬೇಡಿ.
ಯುನಿಟ್ ಬೈನರಿಯನ್ನು sudo ಒಳಗೆ ಸುತ್ತಿದರೆ, ಸುತ್ತುವರಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ. systemd ಈಗಾಗಲೇ User= ಅನ್ನು ಅನ್ವಯಿಸುತ್ತದೆ, ಮತ್ತು ಆ ಹೆಚ್ಚುವರಿ ಪದರವೇ ಪರಿಸರ ಸಮೂಹ ಖಾಲಿ ಇರುವುದಕ್ಕೆ ಅತ್ಯಂತ ಸಂಭಾವ್ಯ ಕಾರಣ.
ಯುನಿಟ್ ಕಡತದ ವಿರುದ್ಧವಲ್ಲ, ಜೀವಂತ ಪ್ರಕ್ರಿಯೆಯ ವಿರುದ್ಧ ಪರಿಶೀಲಿಸಿ
ನಿರ್ವಾಹಕನು ವಾಸ್ತವವಾಗಿ ಏನನ್ನು ಅನ್ವಯಿಸಿದನು ಎಂಬುದನ್ನು ಓದಿ, ನಂತರ ಅದು ಸೃಷ್ಟಿಸಿದ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಓದಿ.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusಯುನಿಟ್ ಸಾಮರ್ಥ್ಯವನ್ನು ಪಟ್ಟಿ ಮಾಡಿದರೂ CapEff ನಲ್ಲಿ ಅದು ಇನ್ನೂ ಇಲ್ಲದಿದ್ದರೆ, ಯಾವುದೋ drop-in ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಮೀರುತ್ತಿದೆ ಅಥವಾ ExecStartPre ಹಂತ ಪರಿಸರವನ್ನು ಬದಲಿಸುತ್ತಿದೆ. ಮುಖ್ಯ ಕಡತವೇ ಅಧಿಕೃತ ಎಂದು ಊಹಿಸುವ ಮೊದಲು drop-in ಕೋಶಗಳಲ್ಲಿ ಯುನಿಟ್ ಹೆಸರನ್ನು ಹುಡುಕಿ, ಏಕೆಂದರೆ ನಂತರದ ಕಡತ ಮೌನವಾಗಿ ಗೆಲ್ಲುತ್ತದೆ. ಯುನಿಟ್ ಮತ್ತು ಪ್ರಕ್ರಿಯೆ ಎರಡೂ ಸಾಮರ್ಥ್ಯವನ್ನು ತೋರಿಸಿದರೂ ಸುರಂಗ ವಿಫಲವಾದರೆ, ಸೀಮಿತ ಸಮೂಹವನ್ನು ವಿಸ್ತರಿಸುವ ಬದಲು ಸಾಧನ ಮತ್ತು ಮಾರ್ಗ ಪರಿಶೀಲನೆಗಳಿಗೆ ಹಿಂತಿರುಗಿ. ಅದನ್ನು ವಿಸ್ತರಿಸುವುದು ನಿಜವಾದ ಕಾರಣವನ್ನು ಮರೆಮಾಡುತ್ತದೆ ಮತ್ತು ಸೇವೆಯನ್ನು ಮೊದಲಿಗಿಂತ ಹೆಚ್ಚು ಸವಲತ್ತಿನದಾಗಿ ಬಿಡುತ್ತದೆ.
ಪ್ರಾರಂಭದ ನಂತರ ಸವಲತ್ತುಗಳನ್ನು ಬಿಟ್ಟುಬಿಡುವುದನ್ನು ಆದ್ಯತೆ ಮಾಡಿ
OpenVPN ಸವಲತ್ತಿನೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗಿ ನಂತರ ತನ್ನ user ಮತ್ತು group ಆಯ್ಕೆಗಳ ಮೂಲಕ ಸವಲತ್ತಿಲ್ಲದ ಖಾತೆಗೆ ಇಳಿಯಬಹುದು, ಮತ್ತು persist-key ಹಾಗೂ persist-tun ಸುರಂಗವನ್ನು ನಂತರವೂ ಬಳಸಬಹುದಾಗಿ ಇಡುತ್ತವೆ. ಈ ವ್ಯವಸ್ಥೆ ಪ್ರಕ್ರಿಯೆ ಹಕ್ಕುಗಳನ್ನು ಹೊಂದಿರುವ ಕಿಟಕಿಯನ್ನು ಸಂಕುಚಿಸುತ್ತದೆ, ಮತ್ತು ಶಾಶ್ವತ ಸಾಮರ್ಥ್ಯಗಳೊಂದಿಗೆ ಇಡೀ ಡೀಮನ್ ಅನ್ನು ಸವಲತ್ತಿಲ್ಲದೆ ಪ್ರಾರಂಭಿಸುವುದಕ್ಕಿಂತ ಇದು ಹೆಚ್ಚಾಗಿ ಹೆಚ್ಚು ಸೂಕ್ತ.
ನೀವು ಯಾವ ಮಾದರಿ ಆರಿಸಿದರೂ, ಯುನಿಟ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಮರುಬೂಟ್ ನಂತರ ಪರಿಶೀಲನೆಗಳನ್ನು ಪುನರಾವರ್ತಿಸಿ, ಏಕೆಂದರೆ ಸಂವಾದಾತ್ಮಕ root ಶೆಲ್ನಿಂದ ಕೆಲಸ ಮಾಡಿ ಬೂಟ್ನಲ್ಲಿ ವಿಫಲವಾಗುವ ಸೇವೆ ಸಾಮಾನ್ಯವಾಗಿ ಸಾಮರ್ಥ್ಯ, ಸಾಧನ ಅಥವಾ ಕಡತ ಅನುಮತಿಯ ವ್ಯತ್ಯಾಸ. ಯುನಿಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಯ ಸಾಮರ್ಥ್ಯ ಔಟ್ಪುಟ್ನ ಪಕ್ಕದಲ್ಲಿ ದಾಖಲಿಸಿ, ಇದರಿಂದ ಮುಂದಿನ ಪರಿಶೀಲಕ ಪ್ಯಾಕೇಜ್ ನವೀಕರಣ ಅಥವಾ drop-in ಮಿತಿಯನ್ನು ಸರಿಸಿದೆಯೇ ಎಂದು ನೋಡಬಹುದು.