[Tech]EOSIO keosd 지갑 다루기

Junhan Kim
NodeONE
Published in
10 min readAug 19, 2021

안녕하세요. 이번 포스팅에서는 키를 관리하는 컴포넌트인 keosd 에 대하여 간략히 정리해 보려 합니다. keosd 는 키를 관리하는 eosio 의 기본 서비스 데몬이며, 개인 키를 저장하고 디지털 메시지를 서명하는 데 사용합니다. keosd는 eosio 소프트웨어를 구성하는 컴포넌트의 하나이며 eosio 를 설치할 때 같이 설치됩니다.

기본적으로 keosd 는 EOSIO 개발자들 만이 사용한다는 전제로 만들어졌습니다. 일반 사용자들은 Anchor wallet 이나 Scatter 와 같은 지갑 전용 프로그램을 사용하는 것이 좋습니다.

keosd 시작하기

keosd 는 지갑과 관련된 cleos 명령을 실행하면 자동으로 시작됩니다. 지갑 관련 파일들은 디폴트로 다음 경로에 저장됩니다.

~/eosio-wallet

만약 수동으로 keosd 를 시작하려면 다음과 같이 입력합니다.

$ keosd

keosd 명령을 수행했을 때 다음과 같은 메시지가 나타날 수도 있습니다.

"3120000 wallet_exception: Wallet exception Failed to lock access to wallet directory; is another keosd running?"

이는 이미 다른 keosd 프로세스가 실행중이기 때문에 나타나는 메시지 입니다. 만약 keosd 를 다시 시작하고 싶다면 실행중인 keosd 프로세스를 종료하고 다시 keosd 명령을 실행하면 됩니다.

keosd 종료

keosd 를 종료하려면 다음 명령을 실행합니다.

$ cleos wallet stop

keosd 를 종료하는 다른 방법으로,

  1. pkill keosd 명령을 실행합니다.
  2. ps 나 pidof 명령으로 keosd 프로세스를 찾은 다음 SIGTERM 신호를 전달하면 됩니다. 예를 들어 keosd 의 pid 가 415 일 경우 kill -15 415 명령을 실행합니다. (SIGTERM 은 리눅스 kill 명령의 디폴트 시그널이므로 그냥 kill 415 라고만 실행해도 됩니다.)

그 외 명령어에 대한 상세한 내용은 — help 옵션으로 확인할 수 있습니다.

$ keosd --help

keosd 지갑 설정

지갑과 관련된 설정은 keosd 의 config.ini 파일에 저장됩니다. keosd 는 기본적으로 디폴트 디렉토리(~/eosio-wallet)에 있는 설정 파일을 읽어들이지만, keosd 를 시작할 때 --config-dir 옵션을 사용하면 특정 경로에 있는 설정 파일을 읽어들일 수도 있습니다.

또한 --data-dir 를 사용하여 특정 디렉토리를 데이터 파일들을 저장하는 디렉토리로 지정할 수 있습니다.

지갑 자동 잠금

keosd 는 디폴트로 15분 동안 활동이 없는 경우 지갑을 잠급니다. 잠금 해제 시간 길이는 config.ini 안에 있는 unlock-timeout 옵션에 원하는 시간을 초 단위로 지정해 주면 됩니다. 예를 들어 지갑 잠김해제 시간 길이를 하루로 설정하고 싶다면 86400 을 입력하면 됩니다. 개발시에 매우 유용한 옵션이지만 만약 운영 환경에 있는 노드라면 보안을 위해 잠금 해제 시간이 너무 길지 않도록 조절해야 합니다.

지갑 데이터 삭제

노드를 운영하다보면 패스워드를 잊어버려서 열 수 없는 지갑이나 더 이상 필요없는 지갑이 생길 수도 있습니다. 이런 경우, wallet 을 중지하고 keosd 의 데이터 디렉토리에서 .wallet 확장자를 가지는 지갑 파일을 삭제하면 지갑을 삭제할 수 있습니다.

예를 들어 지갑 데이터 디렉토리에 default 지갑과 hello.wallet 파일이 있고, hello 라는 이름의 지갑을 삭제하고 싶다면 다음과 같이 실행하면 됩니다.

# 지갑 중지
~/eosio-wallet$ cleos wallet stop
~/eosio-wallet$ ls
config.ini default.wallet hello.wallet
# 지갑 파일 삭제
~/eosio-wallet$ rm hello.wallet
# 지갑 열기(default 외 지갑은 -n 옵션으로 이름 지정)
~/eosio-wallet$ cleos wallet open
"/usr/opt/eosio/2.1.0/bin/keosd" launched
Opened: default
# 지갑 목록 확인
~/eosio-wallet$ cleos wallet list
wallets:
{
"default"*
}

keosd 플러그인과 옵션

keosd 에 플러그인을 더하여 기능을 추가할 수 있습니다. keosd 플러그인은 컴파일 타임에 빌드되기 때문에 매우 빠른 성능을 보여줍니다.

옵션을 지정할 수 있는 keosd 플러그인은 다음과 같습니다.

이러한 플러그인과 그 옵션을 keosd 의 config.ini 파일에 다음과 같이 추가하여 유비키 설정이나 원격 접속 등 여러가지 상세한 기능 설정을 할 수 있습니다. 다만 위에서 소개한 내용 외에 단순히 로컬에서 스마트 계약을 개발 할 때 꼭 필요한 옵션은 없기 때문에 참고로만 확인하셔도 될 것 같습니다.

eosio::http_plugin 에 대한 설정 옵션들:--unix-socket-path arg (=keosd.sock)  HTTP RPC 유닉스 소켓을 만들기 위한 파일 이름.(data-dir 로 부터의 상대경로). 기능을 사용하지 않으려면 공백으로 설정한다.--http-server-address arg             http 연결을 위한 로컬 IP 및 포트. 기능을 사용하지 않으려면 공백으로 설정한다.--https-server-address arg            https 연결을 위한 로컬 IP 및 포트. 기능을 사용하지 않으려면 공백으로 설정한다.--https-certificate-chain-file arg    https 연결시에 제출해야 할 인증서 체인 파일 이름. PEM 타입이어여 하며, https 연결에 필요하다.--https-private-key-file arg          https 연결시에 제출해야 할 개인 키 파일 이름. PEM 타입이어여 하며, https 연결에 필요하다.--https-ecdh-curve arg (=secp384r1)   사용할 https ECDH curve 를 설정한다. (secp384r1 또는 prime256v1)--access-control-allow-origin arg     각 요청에 대하여 반환할 Access-Control-Allow-Origin 을 지정--access-control-allow-headers arg    각 요청에 대하여 반환할 Access-Control-Allow-Header 을 지정--access-control-max-age arg          각 요청에 대하여 반환할 Access-Control-Max-Age 을 지정--access-control-allow-credentials    각 요청에 대하여 Access-Control-Allow-Credentials: true를 반환할지 여부를 지정.--max-body-size arg (=1048576)        들어오는 RPC 요청에 대하여 허용 가능한 최대 body 크기를 byte 단위로 지정--http-max-bytes-in-flight-mb arg (=500) http 요청을 처리하기 위하에 사용할 http_plugin 의 최대 크기를 메가바이트 단위로 지정. 초과할 경우 503 에러를 반환.--verbose-http-errors                 HTTP 응답에 에러 로그를 붙여 보냄--http-validate-host arg (=1)         false 로 설정하면 모든 Host 헤더를 유효한 것으로 판단.--http-alias arg                      추가적으로 받아들일 수 있는 Host 헤더의 값. 여러 개를 지정할 수 있다. http/s_server_address 가 디폴트 값이다. --http-threads arg (=2)               http 스레드 풀의 worker 스레드 수.
eosio::wallet_plugin 에 대한 설정 옵션들:
--wallet-dir arg (=".") 지갑 파일 경로. data 디렉토리의 상대 경로 또는 절대 경로
--unlock-timeout arg (=900) 지갑의 잠금 해제가 지속되는 시간(초 단위). 디폴트 900초(15분). 지갑과 관련된 어떠한 활동도 없다면 이 시간이 경과 한 후 지갑이 잠긴다.--yubihsm-url URL yubihsm-connector 에 연결하기 위한 디폴트 URL <http://localhost:12345> 를 덮어씌운다.--yubihsm-authkey key_num 주어진 Authkey 를 사용하여 YubiHSM support 를 사용할 수 있게 한다.어플리케이션 설정 옵션들:
--plugin arg 사용할 플러그인들을 지정. 여러 개 지정 가능.
어플리케이션 커맨드라인 옵션들:
-h [ --help ] 도움말을 출력하고 빠져나감.
-v [ --version ] 버전 정보를 출력.
--print-default-config 디폴트 설정 템플릿을 출력.
-d [ --data-dir ] arg 프로그램 런타임 데이터를 가지고 있는 디렉토리.
--config-dir arg config.ini 등 설정 파일을 가지고 있는 디렉토리.
-c [ --config ] arg (=config.ini) config-dir 에 있는 설정 파일 이름
-l [ --logconf ] arg (=logging.json) 라이브러리 사용자의 로깅 설정 파일 이름/경로.

기타

  • keosd 키 암호화
    keosd는 키 쌍을 지갑 파일에 저장하기 전에 암호화 합니다. 암호화 알고리즘은 Secure Clave 또는 YubiHSM과 같은 지갑 구현 방식에 따라 달라집니다. UNIX 기반 OS의 표준 파일 시스템을 사용하는 경우 keosd는 CBC 모드에서 256비트 AES를 사용하여 키 쌍을 암호화합니다.
  • keosd의 Secure Enclave 기능 활성화
    keosd의 Secure Enclave 기능을 사용하려면 Apple 개발자 계정과 함께 제공된 인증서로 keosd 이진 파일에 서명해야 합니다. 콘솔 응용 프로그램에서 서명할 때는 AppStore 에 의해 일부 제약 조건이 적용될 수 있습니다. 그에 따라 서명된 이진 파일을 7일마다 다시 서명해야 할 수 있습니다.
  • keosd 잠금/잠금 해제는 작동 방식과 보안에 미치는 영향
    사용자의 관점에서, 지갑이 생성되면 지갑은 잠금 해제 상태로 유지됩니다. keosd가 시작되는 방식에 따라 프로세스가 다시 시작될 때까지 잠금 해제 상태를 유지할 수 있습니다. 시간 초과 또는 프로세스 재시작으로 지갑이 잠긴 경우, 잠금을 해제하려면 패스워드를 입력해야 합니다.
    keosd에는 개인 키 저장/검색 및 디지털 메시지 서명을 하기 위한 지갑 잠금/잠금 해제 외에 인증/권한 메커니즘은 없습니다.
  • keosd 서비스에 접근 하는 방법과 보안에 미치는 영향
    도메인 소켓을 사용하여 keosd에 액세스하는 경우, 파일 시스템의 소켓 파일에 쓸 수 있는 액세스 권한을 가진 모든 UNIX 사용자/그룹이 잠금 해제된 지갑의 아무 키나 사용하여 트랜잭션을 제출하면 keosd에서 서명된 트랜잭션을 받을 수 있습니다.
  • 로컬 호스트에 바인딩된 TCP 소켓의 경우 소유자 또는 사용 권한에 관계없이 모든 로컬 프로세스가 위에서 언급한 것과 동일한 작업을 수행할 수 있습니다. 여기에는 로컬 브라우저에서 실행되는 웹 페이지의 JavaScript 코드 조각이 포함됩니다. 다만, 일부 브라우저에는 보안 문제가 있을 수 있습니다.
  • LAN/WAN 주소에 TCP 소켓을 바인딩하는 경우 원격지에서 keosd를 실행하는 시스템에 패킷을 보내 로컬에서 하는 것과 동일한 작업을 수행할 수 있습니다. 이는 HTTPS를 통해 통신이 암호화 되는 경우라도 큰 보안 위협이 될 수 있습니다.

Reference

Keosd | EOSIO Developer Docs

--

--