[Linux] RHEL7에 최신 ClamAV 빌드/설치하기

WAS(Web Application Server)의 첨부 파일 기능은 외부 사용자가 시스템 내부로 악성 파일을 주입할 수 있는 가장 직접적인 경로입니다. 따라서 서버가 악성코드 유포지로 악용되거나, 랜섬웨어 감염으로 인해 서버 장악을 당하는 리스크를 방지하려면 리눅스 환경에서도 반드시 안티바이러스 솔루션을 운영해야 합니다. 인터넷 연결이 가능한 테스트 서버와 달리, 보안을 위해 네트워크가 단절된 운영 환경(Air-Gapped)에서는 오프라인 설치 방식이 필수적입니다. 본 가이드에서는 먼저 인터넷이 연결된 RHEL 7 리눅스 서버(이하 online 테스트 서버)에서 최신 ClamAV 빌드/설치한 후, 다운로드한 파일들을 그대로 인터넷이 차단된 RHEL 7 서버(이하 offline 운영 서버)에 전송하여 동일하게 최신 ClamAV를 빌드/설치할 수 있습니다.

  1. 먼저 인터넷이 연결된 RHEL 7 리눅스 서버(이하 online 테스트 서버)에서 최신 ClamAV 빌드를 위한 관련 패키지를 다운로드하고 설치합니다.
    1. 최신 ClamAV를 빌드하기 위해서는 cmake3, check-devel 등 일부 패키지는 EPEL 저장소에 통해 설치되므로 EPEL 저장소를 설치합니다.
      $ rpm -Uvh https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
      Retrieving https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
      warning: /var/tmp/rpm-tmp.Ydd6xB: Header V4 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
      Preparing...                          ################################# [100%]
      Updating / installing...
         1:epel-release-7-14                warning: /etc/yum.repos.d/epel.repo created as /etc/yum.repos.d/epel.repo.rpmnew
      $ vi /etc/yum.repos.d/epel.repo
      enabled=1
      $ yum clean all && yum makecache && yum repolist
      
    2. 의존성 패키지까지 다운로드하기 위해 yum-utils 패키지에 포함된 repotrack 명령어를 사용해야 하기 때문에, 먼저 yum-utils 패키지를 설치합니다.
      $ yum install yum-utils
      
    3. /opt/build_pkg 디렉토리에 빌드에 필요한 패키지를 다운로드합니다. 저와 환경이 달라 최신 ClamAV를 빌드하기 위해 추가적인 패키지가 요구될 수 있습니다. 이 경우에도 /opt/build_pkg 디렉토리에 해당 패키지를 다운로드한 후 추가 설치하셔야 합니다. 왜냐하면 /opt/build_pkg 디렉토리를 압축한 후 offline 운영 서버로 전송해야 하기 때문입니다.
      $ mkdir /opt/build_pkg
      $ repotrack -a x86_64 -p /opt/build_pkg gcc gcc-c++ cmake3 openssl-devel libxml2-devel \
      json-c-devel bzip2-devel curl-devel pcre-devel ncurses-devel libcurl-devel \
      make python3-pip check-devel
      $ cd /opt/build_pkg && createrepo .
      $ vi /etc/yum.repos.d/local_build.repo
      [local-build]
      name=Local Build Package Repository for ClamAV
      baseurl=file:///opt/build_pkg
      enabled=1
      gpgcheck=0
      $ yum clean all && yum makecache && yum repolist
      
    4. local-build 저장소만을 사용해서 최신 ClamAV 빌드에 필요한 패키지를 설치합니다.
      -- 저는 일부 패키지의 다운그레이드가 필요했습니다.
      $ yum downgrade krb5-libs libxml2 libxml2-python --disablerepo="*" --enablerepo="local-build"
      
      -- --assumeno 옵션을 사용해서 먼저 의존성 불일치 등 설치 오류가 없는지 확인해 봅니다.
      $ yum install -y --disablerepo="*" --enablerepo="local-build" \
      gcc gcc-c++ cmake3 openssl-devel libxml2-devel \
      json-c-devel bzip2-devel curl-devel pcre-devel ncurses-devel libcurl-devel \
      make python3-pip check-devel \
      --assumeno
      
    5. ClamAV 빌드에 필요한 추가 패키지를 설치합니다.
      -- pcre2 : ClamAV의 핵심인 **바이러스 시그니처(패턴)**를 검사할 때 정규 표현식을 해석하는 엔진 역할을 합니다.
      -- https://github.com/PCRE2Project/pcre2/releases 페이지에서 다운로드합니다.
      $ cd /opt
      $ wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.47/pcre2-10.47.tar.gz
      $ tar -xvzf pcre2-10.47.tar.gz
      $ cd pcre2-10.47/
      $ ./configure --prefix=/usr/local --enable-jit
      $ make
      $ make install
      
      -- json-c : ClamAV의 설정 파일이나 검사 결과 리포트를 JSON 형식으로 처리할 때 사용됩니다.
      -- https://github.com/json-c/json-c/wiki 페이지의 Obtain sources 링크로부터 다운로드합니다.
      $ cd /opt
      $ wget https://s3.amazonaws.com/json-c_releases/releases/json-c-0.17.tar.gz
      $ tar -xvzf json-c-0.17.tar.gz
      $ cd json-c-0.17/
      $ mkdir build && cd build
      $ cmake3 .. -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D CMAKE_BUILD_TYPE=Release
      $ make
      $ make install
      
      -- rustup : 보안과 성능을 강화하기 위해 'Bytecode Runtime'과 같은 구성 요소 등 최신 ClamAV 버전의 핵심 기능 중 일부가 Rust라는 언어로 작성되었습니다. 
      -- Standalone Installer 페이지에서 본인의 환경에 맞는 Stable version을 다운로드합니다.
      $ cd /opt
      $ wget https://static.rust-lang.org/dist/rust-1.95.0-x86_64-unknown-linux-gnu.tar.xz
      $ tar -xvf rust-1.95.0-x86_64-unknown-linux-gnu.tar.xz
      $ cd rust-1.95.0-x86_64-unknown-linux-gnu
      $ ./install.sh
      $ vi ~/.bash_profile
      PATH=$PATH:/usr/local/bin
      export PATH
      $ source ~/.bash_profile
      $ rustc --version
      rustc 1.95.0 (59807616e 2026-04-14)
      
  2. CMake를 업데이트합니다. (RHEL 7 needs 3.x+)
    $ cd opt/
    $ python3 -m pip download --dest ./python_packages pip scikit-build cmake
    $ cd python_packages/
    $ ll
    total 28624
    -rw-r--r--. 1 root root 26313120 May  6 14:07 cmake-3.28.4-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
    -rw-r--r--. 1 root root    20277 May  6 14:07 distro-1.9.0-py3-none-any.whl
    -rw-r--r--. 1 root root    40750 May  6 14:07 packaging-21.3-py3-none-any.whl
    -rw-r--r--. 1 root root  1723581 May  6 14:07 pip-21.3.1-py3-none-any.whl
    -rw-r--r--. 1 root root   104100 May  6 14:07 pyparsing-3.1.4-py3-none-any.whl
    -rw-r--r--. 1 root root    79015 May  6 14:07 scikit_build-0.16.7-py3-none-any.whl
    -rw-r--r--. 1 root root   952597 May  6 14:07 setuptools-59.6.0-py3-none-any.whl
    -rw-r--r--. 1 root root    26844 May  6 14:07 typing_extensions-4.1.1-py3-none-any.whl
    -rw-r--r--. 1 root root    35301 May  6 14:07 wheel-0.37.1-py2.py3-none-any.whl
    $ python3 -m pip install --user --upgrade --no-index --find-links=./ pip scikit-build cmake --ignore-installed
    $ vi ~/.bash_profile
    PATH=$PATH:/root/.local/bin
    export PATH
    $ source ~/.bash_profile
    $ cmake --version
    cmake version 3.28.4
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    
  3. https://www.clamav.net/downloads 페이지로부터 ClamAV 소스코드를 다운로드한 후 빌드합니다.
    $ cd /opt
    $ wget https://www.clamav.net/downloads/production/clamav-1.4.4.tar.gz
    $ tar -xvzf clamav-1.4.4.tar.gz
    $ cd clamav-1.4.4/
    $ mkdir build && cd build
    $ cmake3 .. -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D CMAKE_BUILD_TYPE=Release \
    -D ENABLE_MILTER=OFF
    $ make -j$(nproc)
    $ make install
    $ clamscan --version
    ClamAV 1.4.4
    
  4. ClamAV 전용 사용자를 생성합니다. ClamAV 운영에 필요한 파일/디렉토리를 생성하고 권한을 설정합니다.
    -- SELinux 비활성화
    $ vi /etc/selinux/config
    SELINUX=disabled
    $ setenforce 0
    
    -- ClamAV 서비스 전용 사용자
    $ useradd -s /sbin/nologin clamav
    
    -- 정책 데이터베이스 저장 디렉토리
    $ mkdir -p /usr/local/share/clamav
    $ chown -R clamav:clamav /usr/local/share/clamav
    
    -- 감염 파일 격리 디렉토리
    $ mkdir -p /data/quarantine
    $ chown -R clamav:clamav /data/quarantine
    
    -- 다른 프로그램(예: clamscan)과 통신할 소켓 경로
    $ mkdir -p /run/clamav
    $ chown -R clamav:clamav /run/clamav
    $ chmod 755 /run/clamav
    
    -- 로그 파일 생성 및 권한 부여
    $ install -o clamav -g clamav -m 644 /dev/null /var/log/freshclam.log
    $ install -o clamav -g clamav -m 644 /dev/null /var/log/clamd.log
    $ install -o root -g root -m 644 /dev/null /var/log/clamonacc.log
    
  5. 환경설정 파일을 생성하고 지시자를 적당하게 설정합니다.
    -- freshclam 명령어 환경 설정: 정책 데이터베이스 업데이트
    $ cp /usr/local/etc/freshclam.conf.sample /usr/local/etc/freshclam.conf
    $ vi /usr/local/etc/freshclam.conf
    #Example
    DatabaseDirectory /usr/local/share/clamav
    UpdateLogFile /var/log/freshclam.log
    LogFileMaxSize 2M
    LogTime yes
    LogRotate yes
    DatabaseOwner clamav
    DatabaseMirror database.clamav.net
    Checks 4
    -- freshclam 명령어 실행 및 정책 데이터베이스 다운로드 결과 확인
    $ freshclam
    $ ll /usr/local/share/clamav
    total 110128
    -rw-r--r--. 1 clamav clamav   281702 May  6 14:42 bytecode.cvd
    -rw-r--r--. 1 clamav clamav 23407623 May  6 14:41 daily.cvd
    -rw-r--r--. 1 clamav clamav       90 May  6 14:41 freshclam.dat
    -rw-r--r--. 1 clamav clamav 89072577 May  6 14:42 main.cvd
    
    -- clamd 데몬 환경 설정: 파일 감염 여부 스캔
    $ cp /usr/local/etc/clamd.conf.sample /usr/local/etc/clamd.conf
    $ vi /usr/local/etc/clamd.conf
    #Example
    LogFile /var/log/clamd.log
    LogFileMaxSize 2M
    LogTime yes
    LogRotate yes
    DatabaseDirectory /usr/local/share/clamav
    LocalSocket /run/clamav/clamd.sock
    User clamav
    TCPSocket 3310
    TCPAddr localhost
    -- 악성코드에 감염된 파일의 스캔 테스트
    $ mkdir -p /data/upload && echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > /data/upload/eicar_test.txt
    $ clamscan --move=/data/quarantine /data/upload
    Loading:    11s, ETA:   0s [========================>]    3.63M/3.63M sigs       
    Compiling:   3s, ETA:   0s [========================>]       41/41 tasks 
    
    /data/upload/eicar_test.txt: Eicar-Signature FOUND
    /data/upload/eicar_test.txt: moved to '/data/quarantine/eicar_test.txt'
    
    ----------- SCAN SUMMARY -----------
    Known viruses: 3627854
    Engine version: 1.4.4
    Scanned directories: 1
    Scanned files: 1
    Infected files: 1
    Data scanned: 0.00 MB
    Data read: 0.00 MB (ratio 0.00:1)
    Time: 15.720 sec (0 m 15 s)
    Start Date: 2026:05:06 14:55:48
    End Date:   2026:05:06 14:56:04
    $ ll /data/quarantine
    total 4
    -rw-r--r--. 1 root root 69 May  6 14:55 eicar_test.txt
    
    -- 실시간 감시를 위해 ClamOnAcc 설정하기(On-access Scan Settings)
    -- clamd 데몬이 실행되고 있어야 clamonacc 명령어를 사용할 수 있습니다.
    $ vi /usr/local/etc/clamd.conf
    OnAccessMaxFileSize 10M
    OnAccessIncludePath /data/upload
    OnAccessPrevention yes
    OnAccessExcludeUname clamav
    $ clamonacc -F --config-file=/usr/local/etc/clamd.conf --move=/data/quarantine --log=/var/log/clamonacc.log
    
  6. 서비스를 등록하여 자동으로 정책 데이터베이스를 업데이트하거나 실시간으로 악성코드에 감염된 파일을 모니터링합니다.
    1. freshclam 서비스를 등록하여 주기적으로 정책 데이터베이스를 업데이트합니다.
      $ vi /etc/systemd/system/freshclam.service
      [Unit]
      Description=ClamAV virus database updater
      After=network.target
      
      [Service]
      Type=forking
      ExecStart=/usr/local/bin/freshclam -d --config-file=/usr/local/etc/freshclam.conf
      Restart=on-failure
      User=clamav
      Group=clamav
      
      [Install]
      WantedBy=multi-user.target 
      
    2. clamd 데몬 서비스를 등록합니다. clamdscan 명령어를 사용해서 clamscan명령어보다 빠르게 감염파일을 스캔할 수 있습니다.
      $ vi /etc/systemd/system/clamd.service
      [Unit]
      Description=Clam AntiVirus userspace daemon
      After=network.target
      
      [Service]
      Type=forking
      ExecStart=/usr/local/sbin/clamd -c /usr/local/etc/clamd.conf
      Restart=on-failure
      User=clamav
      Group=clamav
      
      [Install]
      WantedBy=multi-user.target
      
    3. clamonaccess 서비스를 등록하여 지정된 디렉토리(OnAccessIncludePath 지시자를 실시간으로 감시합니다.
      $ vi /etc/systemd/system/clamonacc.service
      [Unit]
      Description=ClamAV On-Access Scanner
      #After executing clamd service, executes clamonacc service
      After=clamd.service
      Requires=clamd.service
      
      [Service]
      Type=simple
      # -F option: Foreground for systemd management
      ExecStart=/usr/local/sbin/clamonacc -F --config-file=/usr/local/etc/clamd.conf --move=/data/quarantine --log=/var/log/clamonacc.log
      Restart=on-failure
      User=root
      
      [Install]
      WantedBy=multi-user.target
      
    4. 등록된 서비스를 실행합니다. clamonacc 서비스는 clamd 서비스가 실행된 이후에 실행해야 합니다.
      $ systemctl daemon-reload
      $ systemctl enable --now freshclam
      $ systemctl enable --now clamd 
      $ systemctl enable --now clamonacc
      

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다