yum-cron을 이용한 자동 보안 업데이트

매번 직접 서버에 접속해 수동으로 업데이트를 체크하는 것은 번거로운 일입니다. 특히 보안과 관련된 중요한 업데이트라면 꼭 필요합니다. 굳이 매번 일일이 확인하고 수동으로 설치하는 과정을 반복하는 대신 자동으로 업데이트가 되게 할 수 있습니다.

리눅스에서는 시간을 정해두고 하는 반복 작업을 cron을 이용하지요? yum업데이트를 자동으로 해 주는 yum-cron 이라는 유용하나 유틸리티가 있습니다. 아주 간단합니다. yum을 이용해 yum-cron패키지를 설치해 줍니다. 이 유틸리티는 CentOS 저장소에 있으므로, 별도의 저장소 추가가 필요 없습니다. 혹 설치가 안된다면, 저장소를 확인해 보시기 바랍니다.

yum-cron의 설치

# yum -y install yum-cron

 

yum-cron 실행

# systemctl start yum-cron
# systemctl enable yum-cron

 

yum-cron 설정

이제 /etc/yum에 있는 설정 파일을 조정해서 자동 보안 업데이트가 되도록 수정해 봅니다.

# vi /etc/yum/yum-cron.conf

 

파일을 열면, 가장 윗 부분에 중요한 네 개의 플래그가 있습니다. 아래와 같이 플래그를 수정합니다.

[commands]
# What kind of update to use:
# default = yum upgrade
# security = yum --security upgrade
# security-severity:Critical = yum --sec-severity=Critical upgrade
# minimal = yum --bugfix update-minimal
# minimal-security = yum --security update-minimal
# minimal-security-severity:Critical = --sec-severity=Critical update-minimal
update_cmd = security

# Whether a message should be emitted when updates are available,
# were downloaded, or applied.
update_messages = yes

# Whether updates should be downloaded when they are available.
download_updates = yes

# Whether updates should be applied when they are available. Note
# that download_updates must also be yes for the update to be applied.
apply_updates = yes

 

이제 업데이트 내역이 이메일로 전달되도록 파일 내용에서 emit_via, emailto 부분을 찾아 아래와 같이 수정합니다. emit_via = stdio를 email로 바꾸고, mailfrom과 mailto 부분은 실제로 전달받을 이메일로 바꾸면 됩니다.

[emitters]
# Name to use for this system in messages that are emitted. If
# system_name is None, the hostname will be used.
system_name = None

# How to send messages. Valid options are stdio and email. If
# emit_via includes stdio, messages will be sent to stdout; this is useful
# to have cron send the messages. If emit_via includes email, this
# program will send email itself according to the configured options.
# If emit_via is None or left blank, no messages will be sent.
emit_via = email

# The width, in characters, that messages that are emitted should be
# formatted to.
output_width = 80


[email]
# The address to send email messages from.
# NOTE: 'localhost' will be replaced with the value of system_name.
email_from = root@micropress

# List of addresses to send messages to.
email_to = lee@micropress.co.kr

# Name of the host to connect to to send email messages.
email_host = localhost

 

특정 패키지를 업데이트에서 제외하고 싶은 경우

자동 업데이트에서 어떤 부분을 제외하고 싶다면 설정 파일의 맨 끝부분, [base]부분에 한 줄을 더 추가해 줍니다.
exclude = [제외할 패키지]

[base]
# This section overrides yum.conf

# Use this to filter Yum core messages
# -4: critical
# -3: critical+errors
# -2: critical+errors+warnings (default)
debuglevel = -2

# skip_broken = True
mdpolicy = group:main

# Uncomment to auto-import new gpg keys (dangerous)
# assumeyes = True

exclude = mysql* nginx* kernel*

 

서비스 재시작

설정을 변경했으니, 이제 서비스를 다시 시작하게 합니다.

# systemctl restart yum-cron

 

실행되는 시간

위의 설정에서 yum-cron이 언제 실행되는지는 전혀 지정되지 않았습니다. yum-cron은 /etc/cron.daily 에 추가되어서, 매일 한 번 실행되게 됩니다. 그럼 몇시에 실행되는지는 어떻게 아나요? cron.daily의 내용이 실행되는 것은 /etc/anacron에 지정되어 있습니다.

# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

 

cron.daily가 실행되는 부분을 보면,

1 5 cron.daily nice run-parts /etc/cron.daily

첫 숫자는 기간입니다. 1은 하루이고, 둘째 숫자는 딜레이입니다. 컴퓨터가 부팅된 후 5분이 지나면 실행하는 것입니다. 그런데, 웹서버는 리부팅을 잘 안합니다. 24시간 돌아가고 있습니다.

START_HOURS_RANGE=3-22

그런 때에는… 위의 START_HOURS_RANGE=3-22 이 부분이 관련됩니다. 리부팅 조건이 아니라면, 새벽3시에서 밤10시 사이에 실행되는 것입니다. 그럼 새벽 3시에 무조건 실행되느냐? 아닙니다.

RANDOM_DELAY=45

RANDOM_DELAY=45 라고 된 부분이 있지요? 3시 이후 이 45분 이내의 시간 중 랜덤으로 아무 시간에나 실행이 됩니다. 참고로, 우리 웹서버의 최근 며칠간의 기록을 보니 3시 20분, 3시 33분, 3시 43분, 3시 23분, 3시 9분… 이렇게 되었습니다.
매일 실행되는 크론의 로그는 /var/log/cron에서 확인할 수 있습니다.