Python 키링 라이브러리는 Python에서 시스템 키링 서비스에 액세스하는 쉬운 방법을 제공합니다. 안전한 비밀번호 저장이 필요한 모든 애플리케이션에 사용할 수 있습니다.
다음과 같은 권장 키링 백엔드가 지원됩니다.
타사 백엔드를 통해 다른 키링 구현을 사용할 수 있습니다.
Linux에서 KWallet 백엔드는 dbus-python에 의존하는데, pip를 사용할 때 항상 올바르게 설치되지는 않습니다(컴파일 필요). 최상의 결과를 얻으려면 dbus-python을 시스템 패키지로 설치하십시오.
macOS 키체인은 macOS 11(Big Sur)을 지원하며 이후 버전에는 "universal2" 바이너리가 포함된 Python 3.8.7 이상이 필요합니다. 자세한 내용은 #525를 참조하세요.
키링의 기본 사용법은 매우 간단합니다. keyring.set_password
및 keyring.get_password
호출하면 됩니다.
>>> 키링 가져오기 >>> keyring.set_password("시스템", "사용자 이름", "비밀번호") >>> keyring.get_password("시스템", "사용자 이름") '비밀번호'
Keyring은 패키지와 함께 설치되는 keyring
명령을 제공합니다. 대부분의 환경에서 키링을 설치한 후에는 암호 설정, 가져오기 및 삭제에 명령을 사용할 수 있습니다. 자세한 사용법 정보를 보려면 다음과 같이 인수 없이 또는 --help
사용하여 호출하십시오.
$ 키링 --help $ 키링 세트 시스템 사용자 이름 '시스템'의 '사용자 이름' 비밀번호: $ keyring 시스템 사용자 이름 가져오기 비밀번호
명령줄 기능은 다음과 같이 Python에서 호출하는 데 적합한 실행 가능한 패키지로도 제공됩니다.
$ python -m 키링 --help $ python -m 키링 설정 시스템 사용자 이름 '시스템'의 '사용자 이름' 비밀번호: $ python -m keyring 시스템 사용자 이름 가져오기 비밀번호
패키지 관리자(apt, pacman, nix, homebrew 등)를 통해 설치된 경우 이러한 셸 완성이 이미 패키지와 함께 배포되었을 수 있습니다(조치가 필요하지 않음).
completion
추가 기능이 설치된 경우 키링은 탭 완성 기능을 제공합니다.
$ pip install '키링[완성]'
그런 다음 다음과 같은 셸 완성을 생성합니다.
$ keyring --print-completion bash | sudo 티 /usr/share/bash-completion/completions/keyring $ keyring --print-completion zsh | sudo 티 /usr/share/zsh/site-functions/_keyring $ 키링 --인쇄 완료 tcsh | sudo 티 /etc/profile.d/keyring.csh
참고 : /usr/share의 경로는 주로 GNU/Linux용입니다. 다른 OS의 경우 다음을 고려하세요.
셸 완성 기능을 설치한 후 셸의 권장 지침에 따라 이를 활성화하세요. 예:
. /usr/share/bash-completion/bash_completion
~/.bashrc
의 . /usr/share/bash-completion/bash_completion
.autoload -Uz compinit && compinit
~/.zshrc
에 나타나는지 확인한 다음 grep -w keyring ~/.zcompdump
사용하여 키링이 나타나는지 확인하여 올바르게 설치되었음을 나타냅니다. Python Keyring lib에는 여러 백엔드에 대한 구현이 포함되어 있습니다. 라이브러리는 현재 환경에 가장 적합한 백엔드를 자동으로 선택하려고 시도합니다. 사용자는 구성 파일에서 또는 set_keyring()
함수를 호출하여 선호하는 키링을 지정할 수도 있습니다.
구성은 플랫폼별 위치에 있는 "keyringrc.cfg"라는 파일에 저장됩니다. 구성 파일이 저장되는 위치를 확인하려면 keyring diagnose
실행하세요.
키링 백엔드를 지정하려면 default-keyring 옵션을 해당 백엔드에 대한 클래스의 전체 경로(예: keyring.backends.macOS.Keyring
로 설정하세요.
keyring-path가 표시된 경우 keyring은 백엔드를 로드하기 전에 Python 모듈 검색 경로에 해당 경로를 추가합니다.
예를 들어, 다음 구성은 ./demo
디렉터리의 simplekeyring
모듈에서 SimpleKeyring
을 로드하는 데 사용될 수 있습니다(구현되지 않음).
[백엔드] default-keyring=simplekeyring.SimpleKeyring 키링 경로=데모
가장 일반적이고 안전한 사용 사례를 위해 핵심 키링 패키지에서 제공하는 백엔드 외에도 다른 사용 사례에 사용할 수 있는 추가 키링 백엔드 구현이 있습니다. 사용하려면 간단히 설치하세요.
keyring<24
필요). 백엔드의 인터페이스는 keyring.backend.KeyringBackend
에 의해 정의됩니다. 모든 백엔드는 해당 기본 클래스에서 파생되어야 하며 priority
속성과 세 가지 함수( get_password()
, set_password()
및 delete_password()
를 정의해야 합니다. 원하는 경우 get_credential()
함수를 정의할 수 있습니다.
이 클래스의 인터페이스에 대한 자세한 내용은 backend
모듈을 참조하세요.
Keyring은 진입점을 사용하여 타사 패키지가 Keyring 자체를 수정하지 않고도 백엔드를 구현할 수 있도록 합니다. 새로운 백엔드 생성에 관심이 있는 사람들은 keyrings.alt 패키지에서 모델링한 방식으로 keyrings
네임스페이스에 새로운 타사 패키지를 생성하는 것이 좋습니다. 필수 진입점을 만드는 방법에 대한 힌트는 해당 프로젝트의 setup.cfg
파일을 참조하세요. 필수적인 것으로 판명된 백엔드는 핵심 라이브러리에 포함하는 것이 고려될 수 있지만, 이러한 타사 패키지를 쉽게 설치할 수 있다는 것은 확장 기능을 쉽게 사용할 수 있음을 의미합니다.
Keyring에 대한 확장을 생성하려면 해당 확장이 사용 가능한 확장으로 언급되도록 끌어오기 요청을 제출하세요.
Keyring을 사용하면 API set_keyring()
호출하여 백엔드를 프로그래밍 방식으로 구성할 수도 있습니다. 표시된 백엔드는 이후에 비밀번호를 저장하고 검색하는 데 사용됩니다.
set_keyring
호출하려면 다음을 수행하십시오.
# KeyringBackend를 확장하는 새로운 키링 클래스를 정의합니다. keyring.backend 가져오기 클래스 테스트키링(keyring.backend.KeyringBackend): """항상 동일한 비밀번호를 출력하는 테스트 키링 """ 우선순위 = 1 def set_password(self, 서비스 이름, 사용자 이름, 비밀번호): 통과하다 def get_password(self, 서비스 이름, 사용자 이름): "TestKeyring의 비밀번호"를 반환합니다. def delete_password(본인, 서비스 이름, 사용자 이름): 통과하다 # 키링 lib에 대한 키링을 설정합니다. keyring.set_keyring(테스트키링()) # 키링 lib를 호출합니다 노력하다: keyring.set_password("demo-service", "tarek", "passexample") print("비밀번호가 성공적으로 저장되었습니다.") keyring.errors.PasswordSetError 제외: print("비밀번호 저장 실패") print("password", keyring.get_password("demo-service", "tarek"))
대부분의 경우 키링을 제거할 필요가 없습니다. 특히 Windows 및 macOS에서 키링의 동작은 일반적으로 퇴화됩니다. 즉, 호출자에게 빈 값을 반환하여 호출자가 다른 동작으로 대체할 수 있게 됩니다.
어떤 경우에는 키링의 기본 동작이 바람직하지 않으며 키링 동작을 모두 비활성화하는 것이 좋습니다. 키링을 비활성화하는 메커니즘은 여러 가지가 있습니다.
PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
설정하면 Null
(퇴화) 백엔드가 사용됩니다. 이 접근 방식은 해당 변수가 설정된 Keyring의 모든 사용에 영향을 미칩니다.keyring --disable
또는 python -m keyring --disable
실행하여 사용자에 대한 Null 키링을 영구적으로 구성합니다. 이 접근 방식은 해당 사용자의 모든 키링 사용에 영향을 미칩니다. 키링은 환경 변수를 통해 키링의 동작을 변경하는 메커니즘을 제공합니다. 각 백엔드는 호출 시 KEYRING_PROPERTY_{NAME}
으로 시작하는 모든 환경 변수를 찾고 키링의 각 {NAME.lower()}
에 대한 속성을 설정하는 KeyringBackend.set_properties_from_env
를 구현합니다. 이 메소드는 기본/구성된 키링을 초기화하는 동안 호출됩니다.
이 메커니즘은 다음을 포함하여 다양한 키링에 유용한 값을 설정하는 데 사용될 수 있습니다.
다음은 Ubuntu 16.04의 가상 환경에 키링을 설치하기 위한 전체 내용입니다. 구성 파일이 사용되지 않았습니다.
$ sudo apt install python3-venv libdbus-glib-1-dev $ CD /tmp $ pyvenv py3 $ 소스 py3/bin/활성화 $ pip 설치 -U pip $ pip install secretstorage dbus-python $ pip 설치 키링 $ 파이썬 >>> 키링 가져오기 >>> keyring.get_keyring() <0x7f9b9c971ba8의 keyring.backends.SecretService.Keyring 개체> >>> keyring.set_password("시스템", "사용자 이름", "비밀번호") >>> keyring.get_password("시스템", "사용자 이름") '비밀번호'
X11 서버를 사용할 수 없는 Linux 시스템에서 SecretService 백엔드를 사용할 수 있습니다(D-Bus만 필요함). 이 경우:
그놈 키링 데몬을 설치합니다.
D-Bus 세션을 시작합니다. 예를 들어 dbus-run-session -- sh
실행하고 해당 셸 내에서 다음 명령을 실행합니다.
--unlock
옵션을 사용하여 gnome-keyring-daemon
실행합니다. 해당 옵션에 대한 설명은 다음과 같습니다.
stdin에서 비밀번호를 읽고 이를 사용하여 로그인 키링을 잠금 해제하거나 로그인 키링이 존재하지 않는 경우 비밀번호를 생성하십시오.
해당 명령이 시작되면 stdin에 비밀번호를 입력하고 Ctrl+D(데이터 끝)를 누릅니다. 그 후 데몬은 백그라운드로 분기됩니다(차단하려면 --foreground
옵션 사용).
이제 Keyring의 SecretService 백엔드를 사용할 수 있습니다. 데몬과 동일한 D-Bus 세션에서 애플리케이션을 실행하는 것을 잊지 마세요.
Docker 컨테이너에서도 SecretService 백엔드와 함께 키링을 사용할 수 있습니다. 필요한 종속성을 설치하고 --privileged 플래그를 추가하여 시스템 키링 잠금을 해제하려고 할 때 허용되지 않는 작업 오류를 방지하기만 하면 됩니다.
다음은 Ubuntu 18:04 컨테이너에 키링을 설치하기 위한 전체 기록입니다.
docker run -it -d --privileged ubuntu:18.04 $ 적절한 업데이트 받기 $ apt install -y gnome-keyring python3-venv python3-dev $ python3 -m venv venv $ source venv/bin/activate # 시스템 오염을 방지하기 위해 가상 환경을 소싱합니다. $ pip3 설치 --업그레이드 pip $ pip3 설치 키링 $ dbus-run-session -- sh # 그러면 새로운 D-bus 쉘로 이동하게 됩니다. $ echo 'somecredstorepass' | gnome-keyring-daemon --unlock # 시스템 키링 잠금 해제 $ 파이썬 >>> 키링 가져오기 >>> keyring.get_keyring() <0x7f9b9c971ba8의 keyring.backends.SecretService.Keyring 개체> >>> keyring.set_password("시스템", "사용자 이름", "비밀번호") >>> keyring.get_password("시스템", "사용자 이름") '비밀번호'
Keyring lib에는 몇 가지 기능이 있습니다:
get_keyring()
: 현재 로드된 키링 구현을 반환합니다.get_password(service, username)
: 활성 키링에 저장된 비밀번호를 반환합니다. 비밀번호가 존재하지 않으면 None을 반환합니다.get_credential(service, username)
: 활성 키링에 저장된 자격 증명 개체를 반환합니다. 이 객체에는 최소한 지정된 서비스에 대한 username
및 password
속성이 포함되어 있으며, 여기서 반환된 username
인수와 다를 수 있습니다.set_password(service, username, password)
: 키링에 비밀번호를 저장합니다.delete_password(service, username)
: 키링에 저장된 비밀번호를 삭제합니다. 비밀번호가 존재하지 않으면 예외가 발생합니다. 모든 경우에 매개변수( service
, username
, password
)는 유니코드 텍스트여야 합니다.
키링 lib는 다음 예외를 발생시킵니다.
keyring.errors.KeyringError
: 키링 lib의 모든 예외에 대한 기본 오류 클래스입니다.keyring.errors.InitError
: 키링을 초기화할 수 없을 때 발생합니다.keyring.errors.PasswordSetError
: 키링에 비밀번호를 설정할 수 없을 때 발생합니다.keyring.errors.PasswordDeleteError
: 키링에서 비밀번호를 삭제할 수 없을 때 발생합니다. Python Keyring lib는 개방형 커뮤니티 프로젝트이며 기여자를 열렬히 환영합니다.
각 내장 백엔드에는 이 라이브러리를 사용하기 전에 이해해야 할 보안 고려 사항이 있을 수 있습니다. keyring
활용하는 도구나 라이브러리 작성자는 이러한 사항을 고려하는 것이 좋습니다.
알려진 보안 문제 목록과 마찬가지로 이 목록도 완전한 것은 아닙니다. 필요에 따라 추가 문제가 추가될 수 있습니다.
keyring
으로 생성된 비밀에 액세스할 수 있습니다. 특정 암호에 액세스할 때마다 암호를 묻는 메시지가 표시되도록 하려면 Keychain Access
애플리케이션을 사용하여 자격 증명을 찾은 다음 Access Control
설정의 허용된 애플리케이션 목록에서 Python
제거하세요.이 프로젝트는 자동화된 릴리스와 지속적인 통합을 활용합니다. 간단한 작업 흐름은 커밋에 태그를 지정하고 Github에 푸시하는 것입니다. CI 테스트를 통과하면 자동으로 PyPI에 배포됩니다.
출시 시 고려해야 할 기타 사항:
테스트는 Github Actions에서 지속적으로 실행됩니다.
테스트를 로컬에서 실행하려면 tox를 설치하고 호출합니다.
이 프로젝트는 이 게시물에 있는 Tarek Ziade의 아이디어를 기반으로 했습니다. Kang Zhang은 처음에 Google Summer of Code 프로젝트로 이를 수행했으며 Tarek은 이 프로젝트에서 Kang을 멘토링했습니다.
Tidelift 구독의 일부로 제공됩니다.
이 프로젝트와 수천 개의 다른 패키지의 관리자는 Tidelift와 협력하여 귀하가 사용하는 모든 오픈 소스를 포괄하는 하나의 기업 구독을 제공하고 있습니다.
자세히 알아보세요.