저는 여러 대의 sysadmin 노트북과 여러 대의 서버를 가지고 있습니다. 저는 rotate_keys.sh
모든 sysadmin 랩톱에서 실행되는 스크립트(호출됨)를 통해 서버의 SSH 키를 관리/회전하고 있습니다 .
나는 다음과 같은 규칙을 만들었습니다. 서버당 특정 시스템 관리자의 랩탑에 대해 최대 1개의 (최신) SSH 키를 유지하십시오.
authorized_keys
SSH 키는 다음 형식의 파일 에 저장됩니다 .
key1 user@device1-hostname
key2 user@device2-hostname
key3 user@device3-hostname
update_keys.sh
각 서버에는 ssh를 통해 실행될 때 현재 연결된 시스템과 관련된 모든 키를 삭제하는 스크립트( 라고 함)가 있습니다 . 나는 주어진 클라이언트 호스트 이름을 포함하는 모든 줄을 제거하여 이 작업을 시도했습니다.
sed -i "/$client_hostname/d" authorized_keys
서버에서는 $SSH_CONNECTION
환경 변수(Ssh 세션 시작 시 설정)에서 IP 주소의 역방향 DNS 조회를 수행하여 클라이언트의 호스트 이름을 얻습니다.
client_ip=$(echo $SSH_CONNECTION | awk '{print $1}')
client_hostname=$(nslookup $client_ip \
| tail -2 \
| head -1 \
| awk '{print $4}')
그러면 호스트 이름이 다음 형식으로 반환됩니다.
device-hostname.router-hostname.
더 나은 용어가 없기 때문에 "완전한 호스트 이름"을 제공합니다.
그러나 호스트 이름에는 authorized_keys
이러한 장치가 연결된 라우터(서브넷)의 호스트 이름이 생략되어 있습니다. 그들은 단지 다음과 같이 나타납니다:
device-hostname
따라서 다음 삭제 명령을 실행하면 일치하는 항목이 없습니다.
sed -i "/$client_hostname/d" authorized_keys
ssh 데몬이 "정규화된" 호스트 이름을 기록하도록 강제하는 방법이 있습니까? 아니면 연결된 라우터의 호스트 이름을 제외하고 장치 이름만 알려줄 수 있는 DNS 조회 도구가 있습니까?
ssh 데몬(서버)에서 역방향 DNS를 비활성화하는 대신 위의 두 가지 방법 중 하나를 사용하는 것이 좋습니다. 이렇게 하려면 내 sysadmin 노트북에 고정 IP가 필요하기 때문입니다.
답변1
다음 awk 명령을 시도해 보십시오:
nslookup $client_ip | awk '/name =/ { split($4,add,".") } END { print add[1]}'
그러면 nslookup 명령이 실행되고 name=이 있는 모든 줄을 찾은 다음 네 번째 공백으로 구분된 공백 필드가 분할됩니다. 결과를 배열 add에 넣습니다. 그런 다음 발견된 마지막 항목의 호스트 이름을 표시하기 위해 배열의 첫 번째 요소를 인쇄합니다.