
이 puppet 모듈은 다양한 보안 관련 구성을 제공하여 전방위적인 기본 보호를 제공합니다.
이 Puppet 모듈은 하드닝을 통해 기본 OS의 보안 구성을 제공하며 DevSec 하드닝 프레임워크의 일부입니다.
이 모듈을 추가한 후 다음 클래스를 사용할 수 있습니다:
class { 'os_hardening': }
모든 매개변수는 기본 os_hardening 클래스에 포함되어 있으므로 다음과 같이 전달하기만 하면 됩니다:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
PE 환경에서 이 모듈을 사용하는 경우 pe_environment = true로 설정해야 합니다.
그렇지 않으면 Puppet이 오류(중복 리소스)를 발생시킵니다!
system_environment = 'default'
시스템이 실행되는 컨텍스트를 정의합니다. 일부 옵션은 docker/lxc에서 작동하지 않습니다.pe_environment = false
Puppet Enterprise를 사용하는 경우 true로 설정하세요. 중요 - 위 참조extra_user_paths = []
사용자의 PATH 변수에 추가 경로를 추가합니다 (기본값은 비어 있음).umask = undef
useradd / newusers가 새 홈 디렉토리를 생성할 때 사용하는 umask (예: '027')maildir = undef
maildir 경로 (예: '/var/mail')usergroups = true
각 사용자에 대해 별도의 그룹을 원하면 true, 그렇지 않으면 falsesys_uid_min = undef 및 sys_gid_min = undef
login.defs의 기본 설정을 재정의합니다.password_max_age = 60
최대 비밀번호 사용 기간Hiera에서 매개변수를 설정하는 것도 가능합니다:
os_hardening::password_max_age: 90
os_hardening::password_min_age: 0
os_hardening::password_warn_age: 14
os_hardening::unwanted_packages: ['telnet']
os_hardening::ignore_users: ['git','githook','ansible','apache','puppetboard']
CIS 배포판 독립 Linux 벤치마크가 시스템 하드닝에 관한 좋은 출발점이므로 전체 모듈을 작성하고 싶지 않은 일회성 처리를 위한 쉬운 방법을 구현하는 것이 적절하다고 판단되었습니다.
예를 들어, Debian 시스템에서 CIS DIL 준수를 높이려면 다음을 설정해야 합니다:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
NTP의 기본 설정은 대부분의 상황에서 실제로 꽤 좋으므로 모듈을 즉시 구현할 필요는 없습니다. 그러나 이러한 서비스를 제어하기 위해 모듈을 사용한다면 물론 더 선호됩니다.
이 모듈은 테스트되었으며 대부분의 Linux 배포판에서 실행되어야 합니다. 지원되는 운영 체제의 전체 목록은 metadata.json을 참조하세요.
기여하려면 기여 가이드를 따라주세요.
시스템에 Ruby 인터프리터가 설치되어 있어야 합니다. 이를 위해 rvm을 사용하는 것이 좋을 수 있습니다. 그 외에도 통합 테스트가 Docker 컨테이너에서 실행되므로 Puppet Development Kit PDK와 Docker Community Edition을 설치해야 합니다.
모든 통합 테스트에는 test-kitchen을 사용합니다. test-kitchen에 익숙하지 않다면 가이드를 참조하세요.
# 구문 및 린트 테스트
pdk validate
# 단위 테스트
pdk test unit
기본적으로 통합 테스트는 Docker 컨테이너에서 실행됩니다 - 불행히도 모든 테스트가 컨테이너 환경에서 실행될 수 있는 것은 아닙니다 (예: sysctl 설정).
# 의존성 설치
gem install bundler
bundle install
# 모든 테스트 인스턴스 나열
bundle exec kitchen list
# 한 머신에서 빠른 테스트
bundle exec kitchen test ubuntu-16-04-puppet5
# 모든 머신에서 테스트
bundle exec kitchen test
DigitalOcean에서 완전한 통합 테스트를 수행하려면 계정을 만들고 일부 환경 변수를 설정해야 합니다:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - DigitalOcean 액세스 토큰DIGITALOCEAN_SSH_KEY_IDS - ssh 키의 DigitalOcean ID, 자세한 내용은 이 문서 참조ssh 키는 ~/.ssh/do_ci로 이름을 지정하고 DigitalOcean의 프로필에 추가해야 합니다.
이후 통합 테스트 (Docker)에 설명된 대로 테스트를 실행할 준비가 됩니다.
포크에서 Github Actions로 전체 통합 테스트를 실행하려면 포크 설정에 다음 환경 변수를 추가해야 합니다:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - DigitalOcean 액세스 토큰CI_SSH_KEY - 인스턴스에 대해 DigitalOcean에서 사용 가능한 ssh 키의 개인 키 부분, base64 인코딩 형식 (예: cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS - CI_SSH_KEY의 DigitalOcean ID, 자세한 내용은 이 문서 참조패치는 Github Actions를 통해 자동으로 테스트됩니다. 테스트 요약은 Github의 PR에서 볼 수 있으며, 세부 정보는 연결된 테스트에서 확인할 수 있습니다.
여러 가지 방법으로 연락할 수 있습니다:
chef-os-hardening의 puppet 포팅 원본:
모두 감사합니다!!
Apache License, Version 2.0 (the "License")에 따라 라이선스가 부여됩니다. 이 파일은 라이선스를 준수하지 않는 한 사용할 수 없습니다. 라이선스 사본은 다음에서 얻을 수 있습니다.
http://www.apache.org/licenses/LICENSE-2.0
해당 법률에 의해 요구되거나 서면으로 동의하지 않는 한, 이 라이선스에 따라 배포되는 소프트웨어는 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건 없이 "AS IS" 기준으로 배포됩니다. 라이선스에 따른 권한 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하세요.
password_min_age = 7
최소 비밀번호 사용 기간 (다른 비밀번호 변경을 허용하기 전)password_warn_age = 7
비밀번호 변경 예정일 전 경고 일수login_retries = 5
비밀번호가 잘못된 경우 최대 로그인 재시도 횟수 (일반적으로 PAM / auth_retries로 재정의됨)login_timeout = 60
인증 제한 시간(초). 이 시간이 지나면 로그인이 종료됩니다.chfn_restrict = ''
일반 사용자가 chfn을 사용하여 변경할 수 있는 필드allow_login_without_home = false
홈 디렉토리가 없는 사용자의 로그인을 허용하려면 trueallow_change_user = false
사용자가 su를 사용하여 로그인을 변경할 수 있는지 여부ignore_users = []
하드닝되지 않아야 하는 시스템 사용자 계정 배열 (비밀번호 비활성화 및 셸을 /usr/sbin/nologin으로 설정)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
그룹 및 기타 사용자가 해당 폴더 또는 내용에 쓰기 권한이 없도록 해야 하는 폴더ignore_max_files_warnings = false
/bin, /usr/bin 등 1000개 이상의 파일이 있는 폴더를 재귀적으로 검사할 때 puppet이 max_files 및 성능 경고를 기록하지 않도록 하려면 truerecurselimit = 5
재귀적 권한 검사를 위한 디렉토리 깊이passwdqc_enabled = true
PAM에서 passwdqc를 사용하여 강력한 비밀번호 검사를 사용하려면 trueauth_retries = 5
계정이 일정 시간 동안 잠기기 전 최대 인증 시도 횟수auth_lockout_time = 600
너무 많은 실패한 인증 시도로 계정이 잠긴 경우 경과해야 하는 시간(초)passwdqc_options = 'min=disabled,disabled,16,12,8'
passwdqc에 전달하려는 옵션 라인(문자열)으로 설정manage_pam_unix = false
이 모듈이 pam_unix를 관리하도록 하려면 trueenable_pw_history = true
pam_unix가 비밀번호 재사용을 방지하기 위해 비밀번호 기록을 기억하도록 하려면 true (manage_pam_unix = true 필요)pw_remember_last = 5
기억할 최근 비밀번호 수 (예: 5는 사용자가 최근 5개의 비밀번호를 재사용하지 못하게 함)only_root_may_su = false
root와 wheel 그룹의 구성원만 su를 사용할 수 있도록 하려면 true, CIS 벤치마크 준수를 위해 true가 필요합니다.root_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
root에 등록된 TTYwhitelist = []
설정된 경우 SUID/SGID 비트를 유지해야 하는 모든 파일 (사전 정의된 파일 화이트리스트와 결합됨)blacklist = []
설정된 경우 SUID/SGID 비트를 제거해야 하는 모든 파일 (사전 정의된 파일 블랙리스트와 결합됨)remove_from_unknown = false
blacklist에 명시적으로 구성되지 않은 파일에서 SUID/SGID 비트를 제거하려면 true. 이렇게 하면 모든 Puppet 실행이 마운트된 파일시스템을 검색하여 기본 및 사용자 블랙리스트에 구성되지 않은 SUID/SGID 비트를 찾습니다. SUID/SGID 비트를 찾으면 whitelist에 없는 한 제거됩니다.dry_run_on_unknown = false
위의 remove_from_unknown과 유사하지만 SUID/SGID 비트가 제거되지 않습니다. 여전히 파일시스템을 검색하여 SUID/SGID 비트를 찾지만 로그에만 출력합니다. 이 옵션은 SUID/SGID 비트에 대해 remove_from_unknown을 처음 구성할 때만 권장됩니다. 변경되는 파일을 확인하고 whitelist 및 blacklist를 조정할 수 있기 때문입니다.enable_module_loading = true
시스템이 실행 중일 때 커널 모듈 변경(예: modprobe, rmmod)을 허용하려면 trueload_modules = []
enable_module_loading이 false인 경우 initramfs를 통해 이 모듈을 로드합니다.disable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
비활성화해야 하는 파일시스템(커널 모듈) 배열cpu_vendor = 'intel'
enable_module_loading = false인 경우에만 필요: 로드할 모듈의 CPU 공급업체 설정icmp_ratelimit = '100'
기본값 '100', 재정의 허용, String 필요desktop_enabled = false
Xorg, KDE/GNOME/Unity 등 데스크톱 시스템인 경우 trueenable_ipv4_forwarding = false
이 시스템이 IPv4에서 패킷 전달을 요구하는 경우 true (예: 라우터), 그렇지 않으면 falsemanage_ipv6 = true
ipv6 설정을 하드닝하려면 true, ipv6를 완전히 무시하려면 falseenable_ipv6 = false
이 시스템에서 ipv6를 비활성화하려면 false, 활성화하려면 trueenable_ipv6_forwarding = false
이 시스템이 IPv6에서 패킷 전달을 요구하는 경우 true (예: 라우터), 그렇지 않으면 falsearp_restricted = true
ARP 알림 및 응답 동작을 제한하려면 true, 그렇지 않으면 falsearp_ignore_samenet = false
true는 동일한 서브넷에서 오지 않은 패킷을 버립니다 (arp_ignore = 2), false는 대상 IP만 확인합니다 (arp_ignore = 1)enable_sysrq = false
매직 sysrq 키를 활성화하려면 true, 그렇지 않으면 falseenable_core_dump = false
코어 덤프 생성을 방지하려면 false, 그렇지 않으면 trueenable_stack_protection = true
주소 공간 레이아웃 무작위화(ASLR)용. ASLR은 특정 유형의 버퍼 오버플로 공격을 방어하는 데 도움이 될 수 있습니다. ASLR은 프로세스의 주소 공간에서 베이스, 라이브러리, 힙 및 스택을 무작위 위치에 배치하여 공격 프로그램이 다음 명령의 메모리 주소를 예측하기 어렵게 만듭니다.enable_rpfilter = true
역방향 경로 필터링을 활성화하려면 true (가짜 패킷 폐기), 그렇지 않으면 falserpfilter_loose = false
(enable_rpfilter가 true인 경우에만) true이면 느슨한 모드 (rp_filter = 2), 그렇지 않으면 엄격한 모드enable_log_martians = true
의심스러운 / 라우팅 불가능한 네트워크 패킷에 대한 로깅을 활성화하려면 true, 그렇지 않으면 false 경고 - 이로 인해 대용량 로그 파일이 생성될 수 있습니다!unwanted_packages = []
시스템에서 제거해야 하는 패키지wanted_packages = []
시스템에 추가해야 하는 패키지disabled_services = []
활성화되지 않아야 하는 서비스enable_grub_hardening = false
일부 grub 하드닝 규칙을 활성화하려면 true로 설정grub_user = 'root'
grub 프롬프트에서 구성을 변경할 때 제공해야 하는 grub 사용자 이름grub_password_hash = ''
grub-mkpasswd-pbkdf2로 생성된 grub_user와 연결된 비밀번호 해시boot_without_password = true
기존 항목을 부팅할 때가 아닌 항목을 변경할 때만 비밀번호를 요구하도록 Grub 설정system_umask = undef
이 변수가 설정된 경우 시스템의 모든 사용자에 대한 umask를 설정합니다 (예: '027')manage_home_permissions = false
로컬 사용자 파일 및 디렉토리 권한을 관리하려면 true로 설정 (g-w,o-rwx)ignore_home_users = []
manage_home_permissions에 의해 제한되지 않아야 하는 사용자 배열manage_log_permissions = false
로그 파일 권한을 관리하려면 true로 설정 (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
기본 로그 디렉토리 설정ignore_restrict_log_dir = []
기본 로그 디렉토리 아래에서 제외할 로그 디렉토리 배열ignore_files_in_folder_to_restrict = []
folder_to_restrict 배열 아래의 디렉토리에서 하드닝할 파일을 무시하는 배열manage_cron_permissions = false
cron 파일 권한을 관리하려면 true로 설정 (og-rwx)enable_sysctl_config = true
sysctl 구성을 비활성화하려면 false로 설정manage_system_users = true
시스템 사용자 관리(빈 비밀번호 및 nologin 셸 설정)를 비활성화하려면 false로 설정shadow_group = undef
/etc/shadow의 그룹 소유권 재정의shadow_mode = undef
/etc/shadow의 파일 권한 재정의