
This chef cookbook은 보안 ssh-client 및 ssh-server 구성을 제공합니다.
이 쿡북은 보안이 강화된 ssh-client 및 ssh-server 구성을 제공합니다. 이 쿡북은 사용자 및/또는 ssh 키 관리 기능을 제공하지 않으므로, 해당 기능은 다른 쿡북을 사용하시기 바랍니다.
아래에서 속성 문서와 기본값을 확인할 수 있습니다.
참고: 이 쿡북의 일부 속성 기본값은 레시피 내에서 설정됩니다. 이러한 속성을 재정의하려면 더 높은 속성 우선순위 수준을 사용해야 합니다. 이러한 속성은 아래 목록에서 #override attribute#로 표시됩니다. 해당 속성 재정의 예시:
override['ssh-hardening']['ssh']['server']['listen_to'] = node['ipaddress']
['ssh-hardening']['network']['ipv6']['enable'] - false. IPv6가 필요한 경우 true로 설정['ssh-hardening']['ssh']['ports'] - 22. ssh-server가 수신하고 ssh-client가 연결해야 하는 포트['ssh-hardening']['ssh'][{'client', 'server'}]['kex'] - nil. 서버 버전에 따라 최적의 키 교환(KEX)을 계산하려면 nil, 그렇지 않으면 Kex 값 문자열 지정['ssh-hardening']['ssh'][{'client', 'server'}]['mac'] - nil. 서버 버전에 따라 최적의 메시지 인증 코드(MAC)를 계산하려면 nil, 그렇지 않으면 Mac 값 문자열 지정['ssh-hardening']['ssh'][{'client', 'server'}]['cipher'] - nil. 서버 버전에 따라 최적의 암호화 방식을 계산하려면 , 그렇지 않으면 Cipher 값 문자열 지정run_list에 레시피를 추가합니다:
"recipe[ssh-hardening]"
이렇게 하면 ssh-server와 ssh-client가 설치됩니다. 다음 중 하나만 선택할 수도 있습니다:
"recipe[ssh-hardening::server]"
"recipe[ssh-hardening::client]"
속성 구성:
"ssh-hardening": {
"ssh" : {
"server" : {
"listen_to" : "10.2.3.4"
}
}
}
listen_to의 기본값은 0.0.0.0입니다. 이 값을 변경하는 것을 적극 권장합니다.
SFTP 구성을 활성화하려면 run_list에 다음 레시피 중 하나를 추가합니다:
"recipe[ssh-hardening]"
또는
"recipe[ssh-hardening::server]"
속성 구성:
"ssh-hardening": {
"ssh" : {
"server": {
"sftp" : {
"enable" : true,
"chroot" : "/home/sftp/%u",
"group" : "sftusers"
}
}
}
}
이렇게 하면 SFTP 서버가 활성화되고 sftpusers 그룹의 모든 사용자가 /home/sftp/%u 디렉토리로 chroot됩니다.
클라이언트 또는 서버 구성 파일에 추가 구성 옵션을 추가할 수 있습니다. 이는 정적으로 설정된 값을 재정의하거나 속성으로는 사용할 수 없는 구성 옵션을 추가하는 데 사용할 수 있습니다.
구문은 다음과 같습니다:
# => 추가 서버 구성
default['ssh-hardening']['ssh']['server']['extras'].tap do |extra|
extra['#Some Comment'] = 'Heres the Comment'
extra['AuthenticationMethods'] = 'publickey,keyboard-interactive'
end
# => 추가 클라이언트 구성
default['ssh-hardening']['ssh']['client']['extras'].tap do |extra|
extra['PermitLocalCommand'] = 'no'
extra['Tunnel'] = 'no'
end
Match 블록은 sshd_config의 끝에 배치해야 합니다. 이는 match_blocks 속성 트리를 사용하여 수행할 수 있습니다:
default['ssh-hardening']['ssh']['server']['match_blocks'].tap do |match|
match['User root'] = <<~ROOT
AuthorizedKeysFile .ssh/authorized_keys
ROOT
match['User git'] = <<~GIT
Banner none
AuthorizedKeysCommand /bin/false
AuthorizedKeysFile .ssh/authorized_keys
GSSAPIAuthentication no
PasswordAuthentication no
GIT
end
chef-dk, VirtualBox 또는 VMware Workstation 및 Vagrant를 설치하시기 바랍니다.
린팅은 rubocop 및 foodcritic로 확인합니다:
$ chef exec rake lint
.....
단위/spec 테스트는 chefspec로 수행합니다:
$ chef exec rake spec
.....
통합 테스트는 test-kitchen 및 inspec로 수행합니다:
$ chef exec rake kitchen
.....
# 또는 kitchen을 직접 사용할 수 있습니다
$ kitchen test
내 계정으로 로그인할 수 없습니다. 클라이언트 키를 등록했는데도 여전히 로그인이 허용되지 않습니다.
일반적인 문제(방화벽, 네트워크, 키 누락, 잘못된 키, 계정 비활성화 등)를 모두 확인했다면 계정이 잠겨 있을 수 있습니다. 가장 빠른 확인 방법은 사용자의 비밀번호 해시를 확인하는 것입니다:
sudo grep myuser /etc/shadow
해시에 !가 포함되어 있으면 계정이 잠긴 것입니다:
myuser:!:16280:7:60:7:::
이를 해결하는 올바른 방법은 계정을 잠금 해제하는 것입니다(passwd -u myuser). 사용자에게 비밀번호가 없는 경우 다음을 통해 잠금을 해제할 수 있습니다:
usermod -p "*" myuser
또는 PAM을 사용하려는 경우 ['ssh-hardening']['ssh']['use_pam'] = true로 활성화했는지 확인하세요. PAM은 잠긴 사용자가 키로 로그인하는 것을 허용합니다.
내 애플리케이션이 더 이상 SSH로 연결되지 않는 이유는 무엇인가요?
항상 먼저 로그 파일을 확인하고, 가능하면 연결 시 클라이언트와 서버 간의 협상(negotiation)을 확인하세요.
python 및 ruby 기반 애플리케이션에서 구식 암호화 세트를 사용하여 발생하는 일부 문제를 확인했습니다. 이는 이 하드닝 모듈이 암호화 방식, 메시지 인증 코드(MAC) 및 키 교환(KEX) 알고리즘 목록을 더 안전한 선택으로 축소했기 때문에 발생하는 충돌입니다.
이것으로 충분하지 않다고 판단되면, 지원하려는 위치에 따라 ['ssh-hardening']['ssh']['client'] 또는 ['ssh-hardening']['ssh']['server'] 네임스페이스에서 암호화용 cbc_requires, MAC용 weak_hmac, KEX용 weak_kex 속성을 자유롭게 활성화하세요.
SFTP 그룹에 사용자를 추가한 후 SFTP 서버에 로그인할 수 없는 이유는 무엇인가요?
이는 ChrootDirectory 소유권 문제입니다. sshd는 sshd가 안전하지 않다고 간주하는 소유권/권한이 있는 디렉토리로 chroot되도록 설정된 계정의 SFTP 연결을 거부합니다. sshd의 엄격한 소유권/권한 요구 사항에 따르면 chroot 경로의 모든 디렉토리는 root가 소유해야 하며 소유자만 쓰기 가능해야 합니다. 예를 들어 chroot 환경이 /home인 경우 /home은 root가 소유해야 합니다.
https://wiki.archlinux.org/index.php/SFTP_chroot 참조
이 쿡북은 주로 다음 가이드를 기반으로 합니다:
모두에게 감사드립니다!!
기여자 가이드라인을 참조하세요.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
nil['ssh-hardening']['ssh'][{'client', 'server'}]['cbc_required'] - false. 암호화에 CBC가 필요한 경우 true로 설정. 이는 일반적으로 구성된 보안 암호화 방식이 활성화되지 않은 구형 M2M 메커니즘이 SSH와 통신해야 하는 경우에만 필요합니다. CBC는 취약한 대안입니다. 이보다 더 취약한 방식은 피해야 하므로 제공되지 않습니다.['ssh-hardening']['ssh'][{'client', 'server'}]['weak_hmac'] - false. 더 약한 HMAC 메커니즘이 필요한 경우 true로 설정. 이는 일반적으로 구성된 보안 HMAC가 활성화되지 않은 구형 M2M 메커니즘이 SSH와 통신해야 하는 경우에만 필요합니다.['ssh-hardening']['ssh'][{'client', 'server'}]['weak_kex'] - false. 더 약한 키 교환(KEX) 메커니즘이 필요한 경우 true로 설정. 이는 일반적으로 구성된 보안 KEX가 활성화되지 않은 구형 M2M 메커니즘이 SSH와 통신해야 하는 경우에만 필요합니다.['ssh-hardening']['ssh']['client']['remote_hosts'] - [] - ssh-client가 연결할 수 있는 하나 이상의 호스트.['ssh-hardening']['ssh']['client']['password_authentication'] - false. 비밀번호 인증을 활성화하려면 true로 설정.['ssh-hardening']['ssh']['client']['roaming'] - false. 실험적인 클라이언트 로밍을 활성화하려면 true로 설정. 이는 비밀 정보가 악의적인 서버에 노출될 수 있는 잠재적 문제를 일으키는 것으로 알려져 있으며 기본적으로 비활성화되어 있습니다.['ssh-hardening']['ssh']['client']['extras'] - {}. 추가 구성 옵션 추가. 자세한 내용은 아래 참조['ssh-hardening']['ssh']['server']['host_key_files'] - nil. 서버 버전에 따라 최적의 호스트키 구성을 계산하려면 nil, 그렇지 않으면 파일 경로 배열 지정 (예: /etc/ssh/ssh_host_rsa_key)['ssh-hardening']['ssh']['server']['dh_min_prime_size'] - 2048 - /etc/ssh/moduli에서 허용되는 최소 소수(prime) 길이(비트). 이 숫자보다 작은 소수는 제거됩니다. (자세한 내용 및 배경은 여기 참조)['ssh-hardening']['ssh']['server']['dh_build_primes'] - false - 자체 소수를 생성할지 여부. 이 재생성은 한 번만 수행되며 많은 시간이 소요됩니다(최신 하드웨어에서 4096 길이 기준 약 1.5~2시간).['ssh-hardening']['ssh']['server']['dh_build_primes_size'] - 4096 - 생성할 소수 길이. 이 옵션은 dh_build_primes가 활성화된 경우에만 유효합니다.['ssh-hardening']['ssh']['server']['listen_to'] #override attribute# - ssh-server가 수신해야 하는 하나 이상의 IP 주소. 기본값은 모든 인터페이스에서 수신하는 것입니다. 보안상의 이유로 반드시 구성해야 합니다!['ssh-hardening']['ssh']['server']['allow_root_with_key'] - false는 root 로그인을 완전히 비활성화합니다. 키 기반 메커니즘을 통한 root 로그인을 허용하려면 true로 설정['ssh-hardening']['ssh']['server']['allow_tcp_forwarding'] - false. TCP 포워딩을 허용하려면 true로 설정['ssh-hardening']['ssh']['server']['allow_agent_forwarding'] - false. 에이전트 포워딩을 허용하려면 true로 설정['ssh-hardening']['ssh']['server']['allow_x11_forwarding'] - false. X11 포워딩을 허용하려면 true로 설정['ssh-hardening']['ssh']['server']['permit_tunnel'] - false는 tun 장치 포워딩을 비활성화합니다. tun 장치 포워딩을 허용하려면 true로 설정. 기타 허용 값: 'yes', 'no', 'point-to-point', 'ethernet'. 정확한 동작은 man sshd_config 참조. 참고: allow_tcp_forwarding도 활성화해야 합니다.['ssh-hardening']['ssh']['server']['use_pam'] - true. sshd의 pam 인증을 비활성화하려면 false로 설정['ssh-hardening']['ssh']['server']['challenge_response_authentication'] - false. 챌린지 응답 인증을 활성화하려면 true로 설정.['ssh-hardening']['ssh']['server']['deny_users'] - [] - DenyUsers를 구성합니다. 지정된 경우 패턴 중 하나와 일치하는 사용자 이름의 로그인이 거부됩니다.['ssh-hardening']['ssh']['server']['allow_users'] - [] - AllowUsers를 구성합니다. 지정된 경우 패턴 중 하나와 일치하는 사용자 이름만 로그인이 허용됩니다.['ssh-hardening']['ssh']['server']['deny_groups'] - [] - DenyGroups를 구성합니다. 지정된 경우 기본 그룹 또는 보조 그룹 목록이 패턴 중 하나와 일치하는 사용자의 로그인이 거부됩니다.['ssh-hardening']['ssh']['server']['allow_groups'] - [] - AllowGroups를 구성합니다. 지정된 경우 기본 그룹 또는 보조 그룹 목록이 패턴 중 하나와 일치하는 사용자만 로그인이 허용됩니다.['ssh-hardening']['ssh']['server']['print_motd'] - false. MOTD 출력을 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['print_last_log'] - false. 마지막 로그인 정보 출력을 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['banner'] - nil. 배너를 활성화하려면 '/etc/issue.net'과 같은 경로 설정['ssh-hardening']['ssh']['server']['os_banner'] - false는 프로토콜 핸드셰이크 중 버전 정보를 비활성화합니다(debian 계열만 해당). 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['use_dns'] - nil은 openssh 기본값을 사용합니다. 원격 호스트의 DNS 조회 및 확인을 활성화/비활성화하려면 true 또는 false로 설정['ssh-hardening']['ssh']['server']['use_privilege_separation'] - nil. 서버 버전에 따라 최적 값을 계산하려면 nil, 그렇지 않으면 true 또는 false로 설정['ssh-hardening']['ssh']['server']['login_grace_time'] - 30s. 로그인이 성공해야 하는 시간. 이 시간이 초과되면 사용자는 연결이 끊깁니다.['ssh-hardening']['ssh']['server']['max_auth_tries'] - 2. 연결당 인증 시도 횟수['ssh-hardening']['ssh']['server']['max_sessions'] - 10 연결당 세션 수['ssh-hardening']['ssh']['server']['password_authentication'] - false. 비밀번호 인증을 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['log_level'] - verbose. sshd의 로그 레벨. 가능한 값은 man 5 sshd_config의 LogLevel 참조.['ssh-hardening']['ssh']['server']['sftp']['enable'] - false. OpenSSH 데몬의 SFTP 기능을 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['sftp']['group'] - sftponly. 전용 사용자에게만 SFTP를 허용하도록 SFTP의 Match Group 옵션을 설정합니다.['ssh-hardening']['ssh']['server']['sftp']['chroot'] - /home/%u. SFTP 사용자가 chroot되어야 하는 디렉토리를 설정합니다.['ssh-hardening']['ssh']['server']['sftp']['authorized_keys_path'] - nil. nil이 아닌 경우, SFTP 전용 액세스를 위한 Match Group 내에 설정될 하나 이상의 공백으로 구분된 authorized keys 파일의 전체 경로['ssh-hardening']['ssh']['server']['sftp']['password_authentication'] - false. 비밀번호 인증을 활성화하려면 true로 설정['ssh-hardening']['ssh']['server']['authorized_keys_path'] - nil. nil이 아닌 경우, 하나 이상의 공백으로 구분된 authorized keys 파일의 전체 경로가 필요합니다.['ssh-hardening']['ssh']['server']['extras'] - {}. 추가 구성 옵션 추가. 자세한 내용은 아래 참조['ssh-hardening']['ssh']['server']['match_blocks'] - {}. Match 구성 블록. 자세한 내용은 아래 참조