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. 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
  2. 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. 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. 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. 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"
    fi
  6. 6. Zobacz różnice względem poprzedniej wersji

    Porównaj skrypt z ostatnio zatwierdzoną wersją, na przykład przez diff -u, i przeczytaj zmiany.

  7. 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. 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. 9. Rozprowadź na flotę

    Dopiero teraz rozprowadź te same zatwierdzone bajty na pozostałe maszyny własnym narzędziem.