CentOS 8 -> Rocky Linux 전환 실패

2021-06-25 ~ 2021-06-26 간에 CentOS 8 최소 설치버전을 Rocky Linux 전환 하는데 실패했다. 원인은 FTP 미러 데이터 정합성 문제로 보이며 일시적인 문제일듯. 작업에 사용한 스크립트는 https://github.com/rocky-linux/rocky-tools

1. 기본 설정 시, Rocky Linux mirrorlist 의 미러들의 repodata 못 받아와서 실패 https://pastebin.com/L6XeY3CD

2. baseurl mirror.navercorp.com 으로 지정했을 때 특정 패키지 사이즈 문제로 실패 https://pastebin.com/u571jjgH

migrate2rocky.sh 실행하는 동안 /etc/yum.repo.d 하위 파일들이 자꾸 변경 되고, mirrorlist 를 기본으로 작업 진행 되기 때문에 baseurl 설정으로 바꿔주는 무식한 스크립트로 해결. 링크 참조.

https://gist.github.com/jellygit/f39160d969a520db25524dbc21473212

Rocky Linux VS AlmaLinux

‘VS’ 는 어그로 끌어보려는거고… “EL8 파생판이지만 기본 외의 주변부 구현에 차이가 있다.”가 결론.

https://www.redhat.com/ko/blog/faq-centos-stream-updates

두 배포판 모두 RHEL 1:1 동일하게 구현한다고 적어놓음.

Rocky Linux is a community enterprise operating system designed to be 100% bug-for-bug compatible with America’s top enterprise Linux distribution now that its downstream partner has shifted direction. It is under intensive development by the community. Rocky Linux is led by Gregory Kurtzer, founder of the CentOS project. Contributors are asked to reach out using the communication options offered on this site.

AlmaLinux (opens new window) is an Open Source and forever-free enterprise Linux distribution, governed and driven by the community, focused on long-term stability and a robust production grade platform. AlmaLinux OS is a 1:1 binary comptible with RHEL® 8 and it was founded by the team behind the well-established CloudLinux OS (opens new window).

실제론 차이가 좀 있다. BaseOS, AppStream, extras 는 동일하지만 기본 소스가 아닌 SSG (SCAP Security Guide), SIG(Special Intrest Group) 지원에서 RL와 AL 이 차이가 보임.

보안설정(hardening): OpenSCAP

Rocky Linux: 존재하긴 하나, 적용 불가. CPE dictionary 의 문제인지 전 항목이 ‘notapplicable’. 8.4 RC1 버전은 아예 룰이 없었고… 8.4 GA 버전은 존재하지만 결과는 캡쳐와 같다.

AlmaLinux: 존재하며, Anaconda oscap plugin 도 정상 동작해 설치 단계부터 보안 설정 가능, 설치 후 적용 및 검사 가능.

Rocky Linux PCI-DSS
AlmaLinux PCI-DSS

SIG 패키지 설치된 CentOS 8 에서 전환(migration)

glusterfs 사용 시, Rocky Linux 전환 불가 (참고 링크), AlmaLinux 전환 가능

왜 이런가?

두 배포판 모두 RHEL 의 변형이지, CentOS 의 변형이 아니다. ‘같은 소스로 생성한 배포판이라 똑같을줄 알았다’고 이야기하니, AlmaLinux 의 릴리즈 엔지니어링 책임자 Eugene Zamriy 님의 대답이 인상이어서 요약하자면

동일 소스로 빌드해도 잘못될 부분이 존재한다. 다른 빌드 순서, 잘못된 RPM 매크로, 기타 등등. 때론 레드햇의 구현을 재현하기 어려운 경우도 있다.

어떤 사람은 EL8 파생 배포판을 sed 와 koji(RPM 빌드 시스템)만 있으면 만들 수 있다고 하지만, 현실은 그렇지 않다.

2021-02-04 OSCAP 테스트

한 일

OSCAP PCI-DSS 설정 적용 테스트 https://www.open-scap.org/getting-started/

CentOS 7 Ansible 설치

  1. 저장소 추가
    1. yum -y install centos-release-ansible-29
  2. Ansible 설치
    1. yum -y install ansible
  3. OSCAP 스캐너 설치
    1. yum install scap-workbench openscap-scanner
  4. 스캔 룰 기준으로 ansible 북 만들기
    1. oscap xccdf generate fix –profile pci-dss –template urn:xccdf:fix:script:ansible /usr/share/xml/scap/ssg/content/ssg-rhel7-xccdf.xml
    2. 표준 출력 되니 출력재지정으로 playbook.yml 만들 것.
  5. 생성된 playbook.yml 적용
    1. ansible-playbook -i “<IP>,” playbook.yml

스캔 항목이 많고 AIDA DB 생성까지 하기 때문에 시간이 꽤 걸림.

RHEL가 아닌 CentOS 라서 GPG 키 파일 읽기 실패… playbook.yml 에서 파일명을 RPM-GPG-KEY-centosofficial 로 수정하면 에러 안 날듯.

파일명 수정해줬더니 에러 없이 잘 끝났다. 그런데 이거 설정을 바꾸는게 맞나…?

RHEL Life Cycle

https://access.redhat.com/support/policy/updates/errata/

리눅스 아재(할배)력 셀프 테스트

https://sunyzero.tistory.com/245

  • 링크된 셀프 테스트 글도 좋지만 다른 글도 다 좋다. 2016년 글을 2021년에서야…

옛날 리눅스만 알고 있는지, 대체된 명령어도 알고 있는지 테스트…

몰랐던거 1-6, 2-1, 2-3, 3-4, 3-6, 3-7, 3-8, 4-2

WSL 등은 PID 1번이 init 이라서.. 레거시 버리고 최신 명령어만 알면 안된다는게 함정.

그 외에 CentOS 기준으로 쓴 글이라 그런지 동의할 수 없는 부분도 좀 있다.. netstat(net-tools) 는 1.42 까진 manpage에서 ss 쓰라는 내용이 있었으나 net-tools 2.x 대로 업데이트 되면서 그런 문구는 사라졌다. nslookup 도 한동안 dig 쓰는게 낫다고 되어있었으나 업데이트가 되면서 필요에 따라 적당히 맞는거 쓰면 되는듯.

grubby 같은건 archlinux 에 아예 없다.

xz: 원본 파일의 수정 시간 유지하며 다른 경로로 압축

for i in $( /usr/local/bin/fd -E '*xz' -E '*zip' -E '*gz' -E '*tgz' -p "./172.16.*" -t f --changed-within '2020-08-17 00:00:00' --changed-before '2020-08-19 23:59:59' ) ;
do if [ -e /data2/$i ]; then
ls -l /data2/$i;
elif [ -e /data2/$i.gz ];
then ls -l /data2/$i.gz ;
else
xz -v -T6 -c "$i" > "/data2/$i.xz";
touch -d "$(date -R -r "$i")" "/data2/$i.xz";
fi;
done

xz 에 ‘-c’ 옵션은 압축 파일을 표준출력으로 보내는 명령. ‘-k’ 이 원본을 유지하지만 다른 경로로 저장할 수 없으니 ‘-c’ 옵션을 쓰면 된다.

생성하고 끝이면 좋겠는데… 만약 파일 수정 시간 기준으로 관리하고 있다면 원본의 수정 시간을 가져와야 한다. 이미 생성된 파일 수정 시간 수정은 ‘touch -d’ 옵션이고, 원본의 시간을 읽어들이는게 ‘date -r’ (‘-R’ 은 시간표기 방법)

참고로 xz 명령 표준 출력이 병렬처리 되기도 하고 안되기도 하는데, CentOS 6 기본 xz 4.999.9 beta 는 표준 출력 압축 시 싱글 스레드로 실행. xz 5 대 버전부터 멀티 스레드로 압축 됨을 확인.

fd 명령은 rust 로 작성된 find 명령. https://github.com/sharkdp/fd 참조. rust 로 작성된 CLI 명령 중 가장 유용하지 않나 싶다. rust command 는 https://news.hada.io/topic?id=2958 참고 (rust command 로 grep, find, du 를 대체 시 멀티 스레드로 실행할 수 있어서 몇 배의 성능 향상을 얻을 수 있다.)

아래는 rust crates 에서 command-line-utilities 다운로드 순 정렬한 주소.

https://crates.io/categories/command-line-utilities?sort=downloads
https://zaiste.net/posts/shell-commands-rust/

Arch linux 업데이트 후 쉘 실행 시 append_path 실행 실패

/etc/profile.d/perlbin.sh:6: command not found: append_path
/etc/profile.d/perlbin.sh:8: command not found: append_path
/etc/profile.d/perlbin.sh:10: command not found: append_path

2020 년 9 월 말 경부터 쉘 실행시 (bash,zsh) 위 같은 에러가 발생한다면, /etc/profile 업데이트 되었는지 확인할 것. 자신만의 설정을 넣었다면 /etc/profile 파일이 업데이트 안되고 /etc/profile.pacman 에 있어서 append_path 를 못 찾아서 발생하는 건임.

https://bbs.archlinux.org/viewtopic.php?id=259400

IdM 으로 ID 통합 관리

Red Hat Enterprise Linux 7 릴리즈 노트를 보면 인증 관련 패키지들이 대체 되었고, OpenLDAP 은 IdM 을 사용하라고 되어 있다(IdM 은 FreeIPA, 389-DS 기반 패키지임).

Red Hat Enterprise Linux 7 릴리즈 노트 중 Deprecated Packages

참고로 FreeIPA 관련 패키지는 RedHat(Fedora, RHEL, CentOS), Debian 계열만 사용 가능하다. ~300 여개 개별 패키지를 통합 관리해야 하는데 영세한 리눅스 배포판은 전담 관리 팀이 없어서(How to set up a FreeIPA server on Arch Linux?…) 지원 못하고 있다고. 이 경우는 OpenLDAP, sssd 활용해야 하는 모양.

참고글 Configure FreeIPA server On CentOS 7 / RHEL 7 – A Identity Management System

IdM 으로 ID 통합관리

이하는 검색 중 발견한 일어 페이지 번역


“그야, 한 번에 모든 서버에서 계정 삭제 가능하면 편하겠네요.”

퇴직자 계정 삭제는 보통 일이 아니다. 서버가 한대라면 몰라도, 모두 멋대로 이쪽저쪽에 계정을 만들어대니… 지워서 원복해야 한다.

“그래, 계정 일괄 관리 하자. 자네가 만들어봐”

엥? 그거 Active Directory 나 OpenLDAP 으로 계정 관리하고 통합인증 하자는거죠? Windows 는 잘 모르겠고, OpenLDAP 은 설정이 어려우니 싫은데.

“OpenLDAP 은 CentOS 7.4 부터 사용 중지 패키지가 됐다고.”

뭐.라.고.요?

1. IdM 이란 선택지

Red Hat 사이트를 찾아보니 ‘장래 제거’ 가 있다.

第39章 非推奨の機能 / Deprecated Functionality

에 의하면, 7.x 인 동안 지원되지만, 적극적인 수정 등은 기대할 수없다. 뭐 우리는 CentOS 이므로 지원도 뭣도 없지만.

대신 6.x 때부터 사용자 인증은 IdM 라는 것이 준비되어있다. Identity Manager 약어이며, FreeIPA라는 프로젝트의 결과물에 Red Hat Enterprise Linux 에서 사용자, 호스트, 서비스 관리 하는 것. 물론 CentOS 에도 들어있다. LDAP 및 Kerberos, BIND 따위를 사용하여 ID 관리를하기 때문에 일반적인 Linux 서버라면 이제 IdM 하나로 관리 할 수있을 것 같다. Web 관리 화면도 있다.

2. 인증 서버 설치

바로 서버 준비를한다. DNS 의 기능이 통합되어 있기에 기존 네트워크에 구축하고 조금씩 이동하려고 하다보면 기존의 DNS 와 관리 영역을 곂치거나 해서 조금 귀찮다. 하지만 어떻게든 한다.

먼저 인증 서버에 CentOS 7.4를 넣고 yum update, FreeIPA의 설치.

[root@ipa ~]# yum -y install ipa-server ipa-server-dns bind bind-dyndb-ldap

설치가 완료되면 설정을 하는데, 지금부터 설정하려는 DNS 영역(Zone)이 이미 네트워크의 DNS 에 있다면 설치가 실패하기 때문에 설정 중엔 /etc/resolv.conf 을 다음과 같이 수정한다.

[root@ipa ~]# vi /etc/resolv.conf
nameserver 127.0.0.1

또한 DNS 를 보러 가지 않을 때 자신의 IP 주소 를 알 수 없으므로 /etc/hosts에 자신의 IP 주소 를 등록 해 둔다.

[root@ipa ~]# vi /etc/hosts
172.16.10.100 ipa.example.jp

설치 시작

[root@ipa ~]# ipa-server-install
Existing BIND configuration detected, overwrite? [no]: yes↩️

Server host name [ipa.example.jp]: ↩️

Please confirm the domain name [example.jp]: ↩️

Please provide a realm name [EXAMPLE.JP]: ↩️

Directory Manager ( LDAP 에서 말하는 root dn 같은 것) 암호

Directory Manager password: ********↩️
Password (confirm): ********↩️

IPA ADMIN ( IPA admin 계정 암호 설정) 암호

IPA admin password: ********↩️
Password (confirm): ********↩️

Forwarders하지만 지금 보러 살릴하면 귀찮은 일이되기 때문에 설정은 하지 않는다. 나중에 설정을 한다.

Do you want to configure DNS forwarders? [yes]: no↩️

역방향 영역의 설정은 메일 서버 라든지 사용한다면 있을지도.

Do you want to configure the reverse zone? [yes]: ↩️
Please specify the reverse zone name [10.16.172.in-addr.arpa.]:

설정의 확인을 구할 수있다.

The IPA Master Server will be configured with:
Hostname:      ipa.example.jp
IP address:    172.16.10.100
Domain name:   example.jp
Realm name:    EXAMPLE.JP

Continue to configure the system with these values? [no]: yes ↩️

그러면 다양한 설정되어 마지막으로 Firewall 설정과 IPA 에 로그인을 구할 수있다.

Setup complete

Next steps:
        1. You must make sure these network ports are open:
                TCP Ports:
                  * 80, 443: HTTP/HTTPS
                  * 389, 636: LDAP/LDAPS
                  * 88, 464: kerberos
                UDP Ports:
                  * 88, 464: kerberos
                  * 123: ntp

        2. You can now obtain a kerberos ticket using the command: 'kinit admin'
           This ticket will allow you to use the IPA tools (e.g., ipa user-add)
           and the web user interface.

우선 Firewall을 연다. dns 아까 목록에는 없었지만, DNS 도 사용하므로 연다.

[root@ipa ~]# firewall-cmd --permanent --zone=public --add-service=http --add-service=https --add-service=ldap --add-service=ldaps --add-service=kerberos --add-service=freeipa-ldap --add-service=dns --add-service=ntp
[root@ipa ~]# firewall-cmd --reload

여기까지 준다면 /etc/resolv.conf 설정을 취소합니다.

[root@ipa ~]# vi /etc/resolv.conf
nameserver 192.168.0.2
nameserver 192.168.0.3

DNS 에 Forwarders를 설정한다.

[root@ipa ~]# vi /etc/named.conf
option {
	...
	forwarders {
		192.168.0.2;
		192.168.0.3;
	};
};

보통이라면 여기서 named를 재시작하는데, named가 mask라는 상태가되어 재부팅을 허용하지 않습니다. 시스템마다 재부팅 해 둔다.

[root@ipa ~]# systemctl reboot

다음은 IPA 에 로그인하여 Kerberos 티켓을 얻습니다. 이 상태에서 ID 관리 할 수있게된다.

[root@ipa ~]# kinit admin
Password for admin@EXAMPLE.JP: [IPA adminで入れたパスワード]

3.ID 추가

사용자의 추가 명령한다. 다음에 소개하는 Web 화면에서 수도 있지만, 여기가 간단합니다. 또한 관리자가 설정 한 암호는 사용자가 처음 로그인 할 때 강제로 변경을 요구하는 보안만이 다.

[root@ipa ~]# ipa user-add [ユーザID] --first=[名] --last=[姓] --password=********
-------------------
Added user "fhoge"
-------------------
  User login: fhoge
  First name: fuga
  Last name: hoge
  Full name: fuga hoge
  Display name: fuga hoge
  Initials: fh
  Home directory: /home/fhoge
  GECOS field: fuga hoge
  Login shell: /bin/bash
  Kerberos principal: fhoge@EXAMPLE.JP
  Email address: fhoge@example.jp
  UID: 1113400020
  GID: 1113400020
  Password: True
  Kerberos keys available: True

어쩐지 UID / GID 가 월등하게 크다 데요. . . .

또한 호스트도 등록 할 수있다. 이것은 클라이언트의 설정을하기 전에 대상 호스트를 등록하는 것이.

[root@ipa ~]# ipa dnsrecord-add [domain名] [host名] --a-rec [IPアドレス]
Record name: dev1
A record: 172.16.10.41

4. 클라이언트 설치

클라이언트는 기존 서버를 마이그레이션하는데 먼저 DNS 의 참조를 IPA 서버로 변경한다.

[root@dev1 ~]# nmcli c modify ens192 ipv4.dns 172.16.10.100
[root@dev1 ~]# systemctl restart NetworkManager

클라이언트 소프트웨어를 넣는다.

[root@dev1 ~]# yum -y install ipa-client
Discovery was successful!
Hostname: dev1.example.jp
Realm: EXAMPLE.JP
DNS Domain: example.jp
IPA Server: ipa.example.jp
BaseDN: dc=example,dc=jp

Continue to configure the system with these values? [no]: yes ↩️
User authorized to enroll computers: admin ↩️
Password for admin@EXAMPLE.JP: ******** ↩️
.....
Client configuration complete.

또한 로컬 사용자를 만드는 경우와 달리 홈 디렉토리 리는 자동으로 생성되지 않기 때문에 설정을 해 둔다.

[root@dev1 ~]# authconfig --enablemkhomedir --update

여기에서이 귀찮은 것이지만, UID 및 GID 가 바뀌어 버리기 때문에 기존의 홈 디렉토리 리의 소유자가 바뀌어 버린다. 그래서 미리 chown 명령으로 홈 디렉토리 리의 소유자를 전원 분 바꿔 둘 필요가있다. 그것이 싫은 경우 Web 화면에서 UID 및 GID 를 종래와 같은 것으로 바꾸어 놓는다.

[root@dev1 ~]# chown -R fhoge:fhoge fhoge

5. Web 화면

IPAIP 주소https 로 접속하면 Web 관리 화면이 표시됩니다. sudo 등 세세한 설정은 여기에서하는 것이 편할 것이다 (후략).

중앙 관리라고하면 소리는 좋지만, 기존의 환경에서 마이그레이션 할 때 클라이언트 측의 설정 시간이 어지럽게 느꼈다. 이후 클라이언트의 구축은 구성 관리 도구 등으로 미리 IdM 에 대응시켜 두는 것이 좋을 것이다.

rsync 병렬화(Parallelise rsync)

https://unix.stackexchange.com/questions/189878/parallelise-rsync-using-gnu-parallel
  1. rsync –dry-run 으로 목록 텍스트로 저장
  2. parallel rsync 에 목록 텍스트를 넘겨서 병렬로 동기화

더 간단하게

  1. ls 결과를 parallel rsync 에 파이프로 넘겨줌
    1. ls -1 | parallel rsync -a {} /destination/directory/

Archlinux AUR 패키지 설치

pacman 으로 제공 안되고 Arch User Repository (AUR) 만 있을 때의 설치 방법.

  1. PKGBUILD 파일 다운로드 (보통 github 등에 올려둠)
  2. makepkg -si # PKGBUILD 내용으로 소스 다운로드, 컴파일, 패키지 생성하는 명령
  3. pacman -U 패키지.pkg.tar.xz # makepkg 이상 없이 실행되면 패키지 파일 생성 되어 있음.

내 경우는 lnav, gitflow 등이 기본으로 제공 되지 않아 AUR로 설치했다. https://wiki.archlinux.org/index.php/AUR_helpers 에 있는 유틸리티를 사용하는 것도 방법.

Archlinux에서 Python 모듈 경로 확인

pip로 설치했으면 간단했겠지만 Archlinux에서 패키지로 제공 되는 모듈이길래 그냥 pacman으로 설치. 설치하고 보니 from bs4 import BeautifulSoup 등으로 모듈 로딩이 안 됨(…줄 알았는데 그냥 소스 잘못 붙여넣었던게 아닌가 싶음). 결론적으로 ‘bs4’로 로딩해야 했다.

pacman -Ss beautifulsoup 패키지 있는지 검색.

설치. 설치 후 경로 실제 파일들 경로 확인은 pacman -Ql 패키지명

__init__.py 이 모듈 초기화 파일일듯 하다. import 명은 bs4가 아닐까 추정.

해당 경로를 기본 path로 갖고 있는지 확인하려면 sys.path 를 보면 된다고.

#!env python
"""
Archlinux 환경에서 python3 module 경로 출력
"""
import os
import bs4

print(bs4.__file__)
PATH = os.path.dirname(bs4.__file__)
print(PATH)
실행결과

맞는듯. 잘 된다.