현재 authorized_keys ssh 키의 주석을 어떻게 얻을 수 있습니까?


6

편집 : 내가 정말로 알아야 할 것은 authorized_keys에서 ssh 키가 현재 로그온 한 사용자를 식별하는 데 사용되었습니다.

"man sshd"에 따르면 :

Protocol 2 public key consist of options, keytype, base64-encoded key, comment.

ssh-keygen을 사용할 때 주석은 대개 사용자의 로컬 ID입니다. 원격 컴퓨터에있을 때이 값에 액세스 할 수 있습니까? (종류는 SSH_CLIENT 셸 변수와 비슷합니다)

(내가 어떤 종류의 원격 신원을 설명한다고 가정하면 쉘 스크립트에서 이것을 기록하고 싶다! 이것은 우분투에있다)


거의 4 년 후에이 문제에 대한 해결책을 찾을 수 있었는지 궁금합니다. 나는 사람들이 ROOT로 연결을했을 때도 사용자 / 이메일을 식별하기 위해 이것과 아주 가까운 것을 찾고있다. ssh 클라이언트 컴퓨터에서 현재 서버로 전달되는 ENV 변수로이 정보를 제공한다면 신뢰를하기까지는 아직 갈 것입니다.
sorin

답변:


3

나는 개인적으로 아니 이 솔루션을 권장하지만 토론을 위해 게시하고 있습니다.

당신이 기꺼이한다면 :

  1. SSHd의 로깅 수준 변경
  2. 스크립트에 대한 액세스 권한 부여 / var / log / secure (또는 동등한 로그 파일)

sshd_config에서 "LogLevel DEBUG"를 설정하여 ssh 키가 인증에 사용될 때마다 다음 항목을 얻을 수 있습니다.

Aug 13 11:51:13 myhost sshd[20195]: debug1: matching key found: file /home/myuser/.ssh/authorized_keys, line 3
Aug 13 11:51:13 myhost sshd[20195]: Found matching DSA key: 00:aa:bb:cc:dd:ee:00:c0:0b:fa:ce:00:00:ab:cd:ef

로그를 구문 분석하고 관련 정보를 검색하는 스크립트를 작성하는 것은 간단합니다. 당신은 아마 "sshd [$ PPID]"에 대해 grep을 써서 스크립트가 줄을 줄이게 될 것입니다.

로그 레벨을 DEBUG로 변경하면 로그의 크기가 상당히 커지고 사용자의 개인 정보를 침해 할 수 있습니다. "man sshd_config"에서 :

DEBUG 수준의 로깅이 위반됩니다.   사용자의 개인 정보 보호 및   권장 사항.

나는이 솔루션을 좀 덜 무시 무시하게 만들 수있는 다양한 단계가 있다고 확신한다. (예를 들어, sshd 디버깅 정보를 다른 파일에 로깅하고 그 파일과 스크립트에 대한 액세스를 제어한다.)하지만 끝날 때에는 여전히 만들 것이다. 너는 싫증이 나다.


1
"man sshd"에 따르면 각 ssh 키의 옵션 필드에 "명령"을 추가 할 수 있어야하며이 명령은 키가 인증에 사용될 때 실행됩니다. 이걸 사용하여 뭔가를 해킹 할 수 있다고 생각합니다. 나는 덜 유쾌한 해결책을 원했다.
krosenvold

1
나는 환경 옵션이 더 단순하다고 생각한다.
krosenvold

1

이렇게하면 스크립트에서 로그인을 추적하려는 경우 SSHd 기계.

1 단계 : 쉘 변수 ' SSH_CLIENT '는 두 부분의 정보를 제공합니다.

  • 원격 IP 주소 ( 192.168.1.2 아래 줄에)
  • 클라이언트가 연결된 원격 TCP 포트 56120 이하)
    SSH_CLIENT='192.168.1.2 56120 22'  
                ----------- -----  
                 Source IP   Port

2 단계 : 이제 소스 IP (192.168.1.2)에 대한 로그인 (거꾸로)을 수행하고 UserID.

SSHd-Server$ ssh you@192.168.1.2 exec "netstat -et  | grep 56120"  
 tcp  0  0 hostname:56120 localhost:ssh ESTABLISHED user1  9937126
                    -----                           ----- 

너는있어. 식별 된 user1@192.168.1.2.


그러나이 솔루션을 사용하려면 sshd 시스템이 모든 클라이언트 시스템에 로그온 할 수 있어야합니다.
krosenvold

@ krosenvold, 꽤 사실. 나는 일반적으로 유닉스 환경을 가정하고있다. SSHd 소유자는 원본 컴퓨터에서 최소한 기본 로그인 액세스 권한을가집니다.
nik

나는 바란다. 그러나 내 고객이 이기종 로트 다.
krosenvold

1

편의를 위해 ssh-keygen 데비안의 맨 페이지 :

RSA1 키의 경우, 키 파일에 주석 필드가 있습니다.   사용자의 편의를 위해서만   돕기   열쇠. 주석은 키가 무엇인지 또는 무엇이 무엇인지를 알 수 있습니다.   유능한. 코멘트는에 초기화됩니다.   "user @ host"   키를 만들었지 만 -c 옵션을 사용하여 변경할 수 있습니다.

어떤 키가 로그인하는 데 사용되었는지 결정하기 위해 가장 가까운 곳은 다음과 같습니다. ssh-add맨 페이지에서 -L과 함께 :

-L 에이전트가 현재 나타내는 모든 ID의 공개 키 매개 변수를 나열합니다.

당신 양철통 ssh 디먼의 로깅 레벨을 DEBUG1로 증가 시키십시오.

LogLevel DEBUG1

로그에 로그인하는 데 사용 된 SSH 키의 RSA 지문이 로그에 표시됩니다.

Aug 13 08:52:56 ubuntu_test sshd[17115]: debug1: matching key found: file /home/username/.ssh/authorized_keys, line 1
Aug 13 08:52:56 ubuntu_test sshd[17115]: Found matching RSA key: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

키의 지문을 얻을 수 있습니다. ssh-keygen:

-l 지정된 공개 키 파일의 지문을 표시합니다. 개인용 RSA1 키도 지원됩니다. RSA의 경우   및 DSA 키 ssh-keygen은 일치하는 공개 키 파일을 찾고 지문을 인쇄합니다.   -v와 결합하면 키의 ASCII 아트 표현이 지문과 함께 제공됩니다.

인증 된 키 파일에서 각 행을 읽을 파일로 분할해야합니다. ssh-keygen -l. 다음은이를 수행 할 수있는 예제 Ruby 스크립트입니다.

#!/usr/bin/env ruby
File.open("/home/username/.ssh/authorized_keys").each do |l|
  file_name = l.split(" ")[2]
  key_file = File.new("#{file_name}.pub_key", "w")
  key_file.puts l
  key_file.close
  puts %x{ssh-keygen -l -f #{file_name}.pub_key}
end

그렇습니다. 편의를위한 것입니다. 그러나 나는 그것이 내게 잘 알려진 가치가되도록 강요 할 수있다. 사용자 인증에 사용 된 키를 알아야합니다.
krosenvold

1

의심되는 사용자의 공개 키를 가지고 있다면 다음 위치에서 서명을 검색 할 수 있습니다. auth.log. 에서 출력과 일치 (참고 -l 여기가 작다. -L ) :

ssh-keygen -l <enter>

이 명령은 공개 키의 경로를 요청하고 해당 키에 대한 서명을 출력합니다.


0

이후 나는 이것에 대한 완벽한 답변을 찾을 수없는 자신의 bash는 scritp 쓴 :

#!/bin/bash

cat /root/.ssh/authorized_keys | while read KEY; do
        echo "";
        name=$(echo "$KEY" | cut -d ' ' -f3-);
        file_name=$(echo "$name" | tr ' ' '_');
        echo $KEY > $file_name;
        fingerprint=$(ssh-keygen -l -f $file_name);
        rm -f $file_name;
        echo "$name login's";
        logins=$(grep `echo "$fingerprint" | awk '{print $2}'` /var/log/secure*);
        logins_count=$(echo "$logins" | wc -l);
        echo "Total Login's: $logins_count";
        if [ -n "$logins" ]; then
                login_pids=$(echo "$logins" | perl -p -e 's/.*\[(.*)\].*/$1/g');
                for f in `ps -e | grep 'sshd' | awk '{print $1}' | grep "$login_pids"`; do
                        [ -n "$f" ] && echo "Current sessions pid: $f";
                done;
        fi;
done;

#

편집 : 나는 그것이 누군가에게 편리하게 올지도 모를 희망을 수년 후에 썼다. https://github.com/sayajin101/SSH-Key-Login-Extended

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.