Weryfikacja skryptu
Skrypt agenta secvalis.sh jest podpisany kluczem wydań. Podpis sprawdzasz sam, wyłącznie kluczami przypiętymi poniżej, bez zaufania do naszego serwera.
Weryfikacja odbywa się na stacji administratora, nie na hoście, a panel jej nie wykonuje.
Na stacji administratora potrzebny jest OpenSSH 8.2 lub nowszy, na przykład Ubuntu 20.04, Debian 11, RHEL 9 albo macOS. RHEL 8 ma OpenSSH 8.0, który nie zna ssh-keygen -Y verify, więc tam krok 3 kończy się błędem i weryfikację trzeba zrobić na innej stacji. Do weryfikacji nie jest potrzebny klucz sprzętowy.
1. Przypnij klucze (jednorazowo)
Zapisz plik allowed_signers i porównaj wypisane odciski z poniższymi, z odciskami na stronie zaufania, w repozytorium na GitHubie i we wpisie opublikowanym poza naszą infrastrukturą. Każdy musi być taki sam.
cat > allowed_signers <<'EOF' [email protected] namespaces="secvalis-agent" [email protected] AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIHREKjfRUhMIaatJDCnlw2f/6FJ8RhXNUxAzrC90lcmHAAAAFHNzaDpzZWN2YWxpcy1yZWxlYXNl [email protected] namespaces="secvalis-agent" [email protected] AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIOOtqVlq0uOns5h0z5zW7D/fvDKiFEfuJu53jN16xEsHAAAAEnNzaDpzZWN2YWxpcy1iYWt1cA== EOF awk '{print $3, $4}' allowed_signers | ssh-keygen -lf -
- Klucz codzienny:
SHA256:DQVo2XI/gJ6cBSV3AdiLgSrLnSJkcYWyJlJfZ9Qsim0 - Klucz zapasowy:
SHA256:nYvBQ9GeKOglNKXjn/nDpzQ1pH/cZgXL+Yx/ybM0sfU
- Klucz codzienny:
2. Pobierz skrypt i podpis z najnowszego tagu
Wersję ustalasz z tagów publicznego repozytorium (secvalis/secvalis), nie z panelu. Pliki pochodzą z tagu, który jest niezmienny.
rm -f secvalis.sh secvalis.sh.sig REVOKED VERSION=$(git ls-remote --tags --refs https://github.com/secvalis/secvalis.git 'v*' | sed 's|.*refs/tags/v||' | sort -V | tail -1) echo "$VERSION" curl -fsSLO https://raw.githubusercontent.com/secvalis/secvalis/v$VERSION/secvalis.sh curl -fsSLO https://raw.githubusercontent.com/secvalis/secvalis/v$VERSION/secvalis.sh.sig
3. Zweryfikuj podpis
Polecenie musi zakończyć się komunikatem Good "file" signature. Każdy inny wynik oznacza odrzucenie pliku.
ssh-keygen -Y verify -f allowed_signers -I [email protected] -n secvalis-agent -s secvalis.sh.sig < secvalis.sh
4. Sprawdź wersję
Wersja w zweryfikowanym pliku musi być równa tagowi z kroku 2 i nie może być starsza niż ostatnio przez Ciebie zatwierdzona. Starsza, prawidłowo podpisana wersja to próba cofnięcia, odrzuć ją. Ostatnio zatwierdzoną wersję wpisz do APPROVED (przy pierwszej weryfikacji zostaw puste). Dalej idziesz tylko po komunikacie OK.
APPROVED="" FILE_VERSION=$(sed -n 's/^readonly AGENT_VERSION="\([^"]*\)".*/\1/p' secvalis.sh) if [ -n "$FILE_VERSION" ] && [ "$FILE_VERSION" = "$VERSION" ] && [ "$(printf '%s\n' "$APPROVED" "$VERSION" | sort -V | tail -1)" = "$VERSION" ]; then echo "OK: $VERSION" else echo "STOP: file $FILE_VERSION, tag $VERSION, approved $APPROVED" fi
5. Sprawdź listę unieważnień
Plik REVOKED pobierz z gałęzi main, nie z tagu. Błąd pobrania lub odczytu zatrzymuje procedurę. Jeśli wersja jest na liście, odmów jej użycia. Dalej idziesz tylko po komunikacie OK.
if curl -fsS https://raw.githubusercontent.com/secvalis/secvalis/main/REVOKED -o REVOKED; then grep -q "^$VERSION " REVOKED case $? in 1) echo "OK: $VERSION not revoked" ;; 0) echo "STOP: $VERSION is revoked" ;; *) echo "STOP: cannot read REVOKED" ;; esac else echo "STOP: cannot fetch REVOKED" fi6. Zobacz różnice względem poprzedniej wersji
Porównaj skrypt z ostatnio zatwierdzoną wersją, na przykład przez diff -u, i przeczytaj zmiany.
7. Opcjonalnie porównaj z plikiem z panelu
Jeśli pobierasz skrypt z panelu, porównaj bajty przez cmp z plikiem zweryfikowanym wyżej. Różnica oznacza, że plik z panelu nie jest wydaniem.
8. Sprawdź na jednym pilocie
Przenieś zatwierdzone bajty na jeden host Linux i uruchom z --dry-run. Skrypt instaluje Trivy i skanuje, ale niczego nie wysyła.
./secvalis.sh <API_KEY> --dry-run
9. Rozprowadź na flotę
Dopiero teraz rozprowadź te same zatwierdzone bajty na pozostałe maszyny własnym narzędziem.

