Czy Touch ID dla Mac Touch Bar może uwierzytelniać użytkowników sudo i uprawnienia administratora?

53
  • Czy Touch ID dla paska dotykowego MacBook Pro obsługuje podwyższanie uprawnień administratora w systemie macOS?

  • W jakiś inny sposób, czy Touch ID może dać dostęp sudo w Terminalu?

Zastanawiam się nad tym, ponieważ rozważam uzyskanie YubiKey, który może wprowadzać ciąg znaków do pól hasła, ale Touch ID dla komputerów Mac może sprawić, że nie będzie to konieczne.

Winterflags
źródło
2
sprawdź to: github.com/mattrajca/sudo-touchid
pathikrit
@pathikrit - zamknij, ale wygląda na to, że moduł PAM byłby znacznie lepszym rozwiązaniem niż rozwidlone sudo. Nie widziałem jeszcze żadnych, które zostały napisane; Mogę spróbować swoich sił w nim
Brad Dwyer

Odpowiedzi:

14
  1. TouchID obsługuje podnoszenie uprawnień, ale na razie wydaje się, że jest obsługiwany tylko we własnych aplikacjach Apple. Domyślam się, że aplikacje innych firm będą musiały zostać zaktualizowane, aby je obsługiwać, niestety. Nadal często wpisuję hasło.

  2. Zobacz @ odpowiedź conorgriffin jest na instrukcje, aby włączyć TouchID dla sudo.

swrobel
źródło
1
Czy ktoś to zrobił? Wygląda dość przerażająco :)
Nic Cottrell
@NicCottrell tak, działa dobrze na moim końcu
swrobel
77

Aby TouchID na komputerze Mac uwierzytelniał Cię w celu sudouzyskania dostępu zamiast hasła, wykonaj następujące czynności.

  • otwórz Terminal
  • przełącz się na użytkownika root za pomocą sudo su -
  • edytuj /etc/pam.d/sudoplik za pomocą edytora wiersza poleceń, takiego jak vimlubnano
  • Zawartość tego pliku powinna wyglądać następująco

    # sudo: auth account password session
    auth       required       pam_opendirectory.so
    account    required       pam_permit.so
    password   required       pam_deny.so
    session    required       pam_permit.so
    
  • musisz dodać dodatkowy authwiersz na górze, aby teraz wyglądał tak:

    # sudo: auth account password session
    auth       sufficient     pam_tid.so
    auth       required       pam_opendirectory.so
    account    required       pam_permit.so
    password   required       pam_deny.so
    session    required       pam_permit.so
    
  • zapisz plik ( Uwaga: ten plik jest zwykle tylko do odczytu, więc zapisanie zmian może wymagać wymuszenia zapisania, np. vimbędzie wymagać użycia wq!podczas zapisywania)
  • wyjdź z konta użytkownika root lub rozpocznij nową sesję terminalową
  • spróbuj użyć, sudoa pojawi się monit o uwierzytelnienie za pomocą TouchID, jak pokazano poniżej Monit TouchID
  • jeśli klikniesz „Anuluj”, możesz po prostu wpisać swoje hasło w oknie terminala, jeśli klikniesz „Użyj hasła”, możesz wpisać swoje hasło w oknie dialogowym.
  • jeśli włączysz SSH do swojego urządzenia, po prostu użyje hasła, ponieważ nie możesz wysłać odcisków palców TouchID przez SSH

Uwaga: patrz odpowiedź użytkownika Pierz poniżej, jeśli korzystasz z iTerm, ponieważ musisz zmienić ustawienie, aby włączyć tę funkcję.

conorgriffin
źródło
4
Wydaje się działać! Czy ma to jakieś konsekwencje dla bezpieczeństwa?
Znarkus,
1
To powinna być zaakceptowana odpowiedź - jasne jest, co się dzieje, jak to się robi i nie ma potrzeby instalowania oprogramowania innych firm.
Jeppe Mariager-Lam
Czy istnieje sposób na zastąpienie wszystkich monitów o hasło TouchID? Czy to w terminalu, w Preferencjach systemowych, w pęku kluczy lub w instalacjach pakietów?
Max Coplan,
@MaxCoplan prawdopodobnie warto zadać jako osobne pytanie
conorgriffin,
1
Działało to dopiero po tym, jak zrobiłem apple.stackexchange.com/a/355880/158188 (ale zrobiłem to pierwszy)
aubreypwd
29

Jeśli korzystasz z iTerm2 (v3.2.8 +), być może zauważyłeś, że Touch ID nie działa z sudo w terminalu, pomimo dokonania pam_tid.somodyfikacji jak wyżej i działa w poprzednich wersjach. Jest to związane z zaawansowaną funkcją, która wydaje się teraz domyślnie włączona - należy ją tutaj wyłączyć: iTerm2-> Preferencje> Zaawansowane> (Przejdź do nagłówka sesji)> Zezwalaj sesjom na wylogowanie i ponowne zalogowanie .

Alternatywnie możesz użyć tego pam_reattachmodułu, aby jednocześnie zachować funkcję sesji i TouchID sudo.

Preferencje iTerm

Pierz
źródło
1
Ale jeśli chcesz zachować funkcję przywracania sesji, możesz wypróbować to repozytorium za pomocą niestandardowego modułu pam.
Leo
Musiałem zrobić ten krok, ale pracowałem zaraz po tym, jak upewniłem się, że Nozostał ustawiony w otoczeniu. Możesz także wyszukać „dotyk”, a pojawi się opcja.
aubreypwd
Właśnie przetestowane: Podczas używania pam_reattachnie trzeba ani zmieniać ustawienia, ani restartować iTerm - wszystko działa od razu! (Nie testowałem, czy sesje rzeczywiście przetrwały, ponieważ nie mam pojęcia, jak to zrobić, ale nie potrzebowałem zmieniać ustawienia).
Blaisorblade
Znak dotykowy ID ukrywa pełnoekranowe okno skrótów klawiszowych. Czy jest w pobliżu praca?
HappyFace,
Uratowałeś mi życie ...
Andrew Ravus
3

Możesz użyć odcisku palca, aby uzyskać dostęp do sudo w terminalu lub iTerm, po prostu dodaj auth sufficient pam_tid.sodo pierwszego wiersza /etc/pam.d/sudopliku.

0TshEL_n1ck
źródło
4
Dla innych może być interesujące, że obecna wersja iTerm v3.2.8 nie pozwala na to, gdy ustawiona jest inna domyślna opcja. Musisz przejść do Preferencje -> Zaawansowane i dezaktywować Allow sessions to survive logging out and back in: gitlab.com/gnachman/iterm2/issues/7608#note_153123852
kossmoboleat
3

Stworzyłem prosty skrypt, który umożliwia sudo korzystanie z modułu TouchID PAM dokładnie tak, jak wyjaśnia conorgriffin. Robi to w jednym skrypcie, który można skopiować i wkleić do terminala w całości lub użyć skrótu „ curlpotok bash”:

curl -sL https://gist.githubusercontent.com/RichardBronosky/31660eb4b0f0ba5e673b9bc3c9148a70/raw/touchid_sudo.sh | bash

Kompletny skrypt :

#!/bin/bash

# curl -sL https://gist.githubusercontent.com/RichardBronosky/31660eb4b0f0ba5e673b9bc3c9148a70/raw/touchid_sudo.sh | bash
# This script is ready to copy-paste in whole, or just the line above (without the leading #)

# Use TouchID for sudo on modern MacBook Pro machines
# This script adds a single line to the top of the PAM configuration for sudo
# See: https://apple.stackexchange.com/q/259093/41827 for more info.

touchid_sudo(){
  sudo bash -eu <<'EOF'
  file=/etc/pam.d/sudo
  # A backup file will be created with the pattern /etc/pam.d/.sudo.1
  # (where 1 is the number of backups, so that rerunning this doesn't make you lose your original)
  bak=$(dirname $file)/.$(basename $file).$(echo $(ls $(dirname $file)/{,.}$(basename $file)* | wc -l))
  cp $file $bak
  awk -v is_done='pam_tid' -v rule='auth       sufficient     pam_tid.so' '
  {
    # $1 is the first field
    # !~ means "does not match pattern"
    if($1 !~ /^#.*/){
      line_number_not_counting_comments++
    }
    # $0 is the whole line
    if(line_number_not_counting_comments==1 && $0 !~ is_done){
      print rule
    }
    print
  }' > $file < $bak
EOF
}

touchid_sudo

Ten skrypt pokazuje kilka fajnych wzorców, które uwielbiam uczyć ludzi, którzy dopiero zaczynają bash lub DevOps.

  1. Utwórz plik kopii zapasowej, który jest numerowany, a nie tylko .bakna końcu. (Wygląda srogo, ale ten wzór działa z tym, co jest w $fileśrodku i nadaje się do ponownego użycia.
  2. Aby było to bezpieczne curl ... | bash, zawiń wszystko w funkcję i wywołaj ją w ostatnim wierszu. W ten sposób, jeśli pobieranie zostanie przerwane, nic nie zostanie (częściowo) zrobione.
  3. Zadzwoń do sudo bash -euskryptu, abyś nie kazał użytkownikowi tego zrobić. ( -euskrót od errexit i rzeczownik i powinieneś ich używać!)
  4. Pojedynczy cytat bash heredoc, 'EOF'aby zapobiec przedwczesnemu rozszerzeniu powłoki.
  5. Zwiększanie awkczytelności wbudowania .
Bruno Bronosky
źródło
0

Utworzyłem następujące zadania ansible, aby włączyć identyfikator dotykowy dla poleceń sudo, jeśli Twój komputer to obsługuje:

- name: detect touch id support
  shell: pgrep ControlStrip
  ignore_errors: true
  register: touch_id_result

- name: enable touch id for sudo commands
  lineinfile:
    path: /etc/pam.d/sudo
    line: 'auth       sufficient     pam_tid.so'
    insertbefore: '^auth       sufficient     pam_smartcard.so$'
  become: yes
  when: touch_id_result.rc == 0 and touch_id_result.stdout != ''
Andy
źródło