LDAP를 사용한 SSH 키 인증


59

한마디로 :

LDAP를 통해 SSH 키 인증을 수행하는 방법을 원합니다.

문제:

디렉토리 서비스에 LDAP (slapd)를 사용하고 있으며 최근에는 인스턴스 구축을 위해 자체 AMI를 사용하기로 옮겼습니다. AMI의 비트가 중요한 이유는,이다 이상적으로 , 우리는 인스턴스가 실행되는 즉시 키 인증을 통해 SSH로 로그인을 추가하는 스크립트를 킥오프 우리의 다소 느린 구성 관리 도구 기다릴 필요가 없습니다 수 있도록하고 싶습니다 인스턴스의 올바른 키.

이상적인 시나리오는 사용자를 LDAP에 추가 할 때 키도 추가하고 즉시 로그인 할 수 있다는 것입니다.

암호 기반 로그인은 덜 안전하고 번거롭기 때문에 키 인증은 필수 입니다.

이 질문 을 읽었 으며 OpenSSH에 OpenSSH-lpk라는 패치가 있음을 시사하지만 더 이상 OpenSSH 서버> = 6.2에서는 필요하지 않습니다.

파일 시스템과 함께 (또는 대신) 명령에서 authorized_keys를 가져올 수 있도록 sshd_config (5) 옵션 AuthorizedKeysCommand를 추가했습니다. 이 명령은 AuthorizedKeysCommandUser sshd_config (5) 옵션으로 지정된 계정으로 실행됩니다.

이를 구현하도록 OpenSSH 및 LDAP를 구성하려면 어떻게해야합니까?

답변:


64

OpenSSH-LPK 스키마를 포함하도록 LDAP 업데이트

먼저 sshPublicKey사용자 속성 을 추가하기 위해 스키마로 LDAP를 업데이트해야 합니다.

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )

사용자의 공개 키에 대해 LDAP를 쿼리하는 스크립트를 작성하십시오.

스크립트는 해당 사용자의 공개 키를 출력해야합니다. 예 :

ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

sshd_config이전 단계의 스크립트를 가리 키도록 업데이트

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

보너스 : sshd_config이 질문에 표시된대로 내부 RFC1918 네트워크에서 비밀번호 인증을 허용하도록 업데이트하십시오 .

내부 네트워크에서 SSH 서버로의 비밀번호 인증 만 허용

유용한 링크:

편집 : nobody제안 된 TRS-80으로 사용자 추가


6
AuthorizedKeysCommandUser nobody루트 대신 제안하지만 환상적 입니다.
TRS-80

일반 ldapsearch 명령이 데이터를 반환하더라도 출력을 sed black magic 명령으로 파이핑하면 출력이 없기 때문에 내 ldapsearch 또는 sed에 다른 것이 있어야합니다. sed를 사용하는 대신 출력을 정리하는 스크립트를 작성해야합니다.
Chris L

1
내 이전 의견을 무시하십시오. 내 문제는 sshPublicKey 속성에 후행 줄 바꿈이 있었기 때문에 ldapsearch가 전체를 base64로 인코딩합니다. 나는 sed 명령을 다음과 같이 단순화했다 :ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p'
Chris L

1
@Chris는 실제로 덜 흑 마법이지만, sed는 여전히 한 번 쓰기, 단방향 해싱 함수입니다.)
Froyke

1
OpenSSH를 내 버전에 (5.3p1-122.el6는)이 AuthorizedKeysCommandRunAs아니라AuthorizedKeysCommandUser
mveroone

5

ldapsearch를 실행할 때 오류가 발생하는 사람 :

sed: 1: "/^ /{H;d};": extra characters at the end of d command

내가 (FreeBSD에서), 수정은 첫 번째 sed 명령을 다음과 같이 변경하는 것입니다.

/^ /{H;d;};

( 'd'뒤에 세미콜론 추가).


4

내 "메소드"를 공유하고 싶었고 클라이언트 측은 데비안 / 우분투 전용이지만 서버 측은 기본적으로 위와 동일하지만 조금 더 "HowTo :"

서버 :

공개 키 속성 사용 :

크레딧 :

https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

cat << EOL >~/openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
EOL

이제 이것을 사용하여 ldif를 추가하십시오 :

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif

phpLDAPadmin에서 SSH 공개 키를 사용하여 사용자 추가

먼저“일반 : 사용자 계정”템플릿으로 사용자를 만듭니다. 그런 다음 "objectClass"속성 섹션으로 이동하여 "add value"를 클릭하고 "ldapPublicKey"속성을 선택하십시오. 제출 한 후 사용자 편집 페이지로 돌아가서 상단의 "새 속성 추가"를 클릭하고 "sshPublicKey"를 선택하고 공개 키를 텍스트 영역에 붙여 넣은 다음 "개체 업데이트"를 클릭하십시오.

sshPublicKey 속성이 표시되지 않음-OpenLDAP PHPLDAP SSH 키 인증

우분투 클라이언트 :

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart

테스트 키 생성 :

ssh-keygen -t rsa

3

이것은 완전한 답변이 아니며 c4urself의 답변에 추가 된 입니다. 나는 이것을 논평으로 추가했을 것이지만, 나는 논평할만한 평판이 충분하지 않으므로 공감하지 마십시오!

이것은 AuthorizedKeysCommand(c4urself의 버전을 기반으로) 내가 사용하는 스크립트 입니다. 값이 base64 인코딩으로 반환되는지 여부에 관계없이 작동합니다. 이는 여러 개의 인증 된 키를 LDAP에 저장하려는 경우 특히 유용합니다. authorized_keys 파일과 유사하게 키를 개행 문자로 분리하면됩니다.

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey')
attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.