3.9 C
New York
화요일, 12월 23, 2025

Buy now

[광고] 쿠팡 추천 링크

안녕하세요? 올해까지 삼성전자 25년 직장 생황릃 마치고 퇴직하려 합니다. 퇴직 후 아르바이트로 쿠팡 파트너스 활동을 하려고 합니다. 쿠팡 파트너스는 쿠팡 추천 링크를...

카누 캡슐 커피머신 솔직 리뷰: ‘네스프레소 호환’ 가성비 끝판왕 (ft. 쿠팡 최저가 할인)

'공유 커피' 카누가 만든 카누 캡슐 커피머신 : 캡슐 커피머신 바리스타 브리즈/어반! 네스프레소 오리지널 캡슐 호환으로 활용도는 높이고, 카누만의 황금 레시피로 커피 맛은 깊어졌습니다....
Home Blog Page 235

워드프레스 보안 진단 WPScan 사용법 및 이메일로 결과 받아보기

워드프레스 테마, 플러그인 등 워드프레스 전반에 걸쳐 취약점을 스캐닝할 수 있는 워드프레스 보안진단 툴인 WPScan 사용법을 정리해 보고, 이 스캔 결과를 이메일로 받아 볼 수 있는 방법에 대해 살펴봅니다.

워드프레스는 전 세계 CMS 사이트의 30%이상을 차지하는 가장 널리 사용되는 CMS 중 하나입니다. 그렇게 많이 사용하는만큼 해킹에 대한 시도가 끊이지 않는데요.

워드프레스 테마, 플러그인 그리고 워드프레스 코어 파일등이 멀웨어 감염되어 있는지 업데이트가 제대로 되어 있지 않은지 등을 워드프레스 보안 진단 툴인 WPScan으로 검사해 볼 수 있습니다.

여기서는 WPScan을 설치하고, 간단한 사용법을 토대로 정기적으로 워드프레스 취약점을 스캐닝하고 이 결과를 메일로 받아볼 수 있도록 만들어 보도록 하겠습니다.

WPScan이란

WPScan은 2011년 보안 전문가와 워드프레스 블로그 관리자들이 모여서 워드프레스 보안 취약성 데이타베이스를 구축하면서 시작했습니다.

WPScan는 워드프레스 취약점 데이타베이스를 API를 받아와 웓프레스 사이트를 스캐닝하면서 아래와 같은 사항을 점검합니다.

  1. 워드프레스 설치 버젼 체크 및 관련 취약성 점검
  2. 설치 플러그인 및 취약성 점검
  3. 설치 테마 및 취약성 점검
  4. 워드프레스 사용자 리스트
  5. 워드프레스 사용자중 암호화가 약한 암호를 가진 사용자 점검
  6. 백업 및 공개 액세스 가능한 파일이 있는지 점검
    wp-config.php 파일 포함
  7. 공개 액세스 가능한 데이터베이스가 있는지 점검
  8. 워드프레스 플러그인으로 인한 오류 로그 노출 여부.
  9. 미디어 파일 리스트
  10. 취약한 Timthumb 파일 여부
  11. 워드프레스 readme 파일 존재 여부
  12. WP-Cron 활성화 여부
  13. 사용자 등록 활성화 여부
  14. 워드프레스 전체 경로
  15. 디렉터리 목록

WPScan 사용법에 대해서는 아래 사용자 매뉴얼을 참조해 보시기 바랍니다.

WPScan User Documentation

WPScan 설치

워드프레스에서 WPScan을 사용하는 방법은 가장 간단한 방법은 WPScan 플러그인을 사용하는 방업입니다.

WPScan – WordPress Security Scanner

아마 쟁쟁한 워드프레스 보안 플러그인들이 많기 때문에 WPScan 플러그인 사용자는 그리 많지는 않습니다.

워드프레스 테마, 플러그인 등 위약점 진단은 워드프레스 보안 플러그인의 여러 분야 중 하나이기 때문에 대부분 워드프레스 보안 플러그인에서 제공하고 있는 기능이기도 하기 때문입니다.

그러나 저는 플러그인보다는 서버에서 직접 스캐닝하는 것을 원하고, 더우기 서버에서 스캐닝 시 여러 개의 워드프레스 사이트를 동시에 스캐닝할 수 있기 때문에 서버에서 사용하려고 합니다.

우분투에서 WPScan 설치

우선 우분투 서버를 업데이트하고 WPScan 설치 및 운영에 필요한 제반 프로그램을 설치합니다.

sudo apt update

sudo apt install curl git libcurl4-openssl-dev make zlib1g-dev gawk g++ gcc libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake libtool bison pkg-config ruby ruby-bundler ruby-dev -y libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake libtool bison pkg-config ruby ruby-bundler ruby-dev -yCode language: PHP (php)

이제 WPScan을 설치합니다. WPScan은 Ruby로 작성되었기 때문에 Ruby의 gem 설치기를 사용합니다.

gem install wpscanCode language: PHP (php)

CentOS 8/RHEL 8/Fedora에서 설치

먼저 ruby를 설치합니다.

sudo dnf install rubyCode language: PHP (php)

WPScan 설치 및 운영에 필요한 제반 프로그램을 설치합니다.

sudo dnf group install "Development Tools"
sudo dnf install git gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel libcurl-devel patch rpm-buildCode language: PHP (php)

WPScan을 설치합니다.

sudo gem install wpscanCode language: PHP (php)

WPScan 사용법

먼저 데이타베이스를 업데이트합니다.

wpscan --updateCode language: PHP (php)

이러면 아래와 같은 메세지를 볼 수 있습니다.

_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.2
                               
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[i] Updating the Database ...
[i] Update completed.
Code language: PHP (php)

이 상태에서 바로 사이트 점검을 할 수 있습니다. “–url=” 다음에 사이트 주소를 넣어 스캔토록 합니다.

wpscan --url=https://happist.comCode language: PHP (php)

그러면 이런 화면을 볼 수 있습니다.

______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.2
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[+] URL: https://happist.com/ [141.164.48.62]
[+] Started: Mon Jun 29 06:38:26 2020

Interesting Finding(s):

[+] Headers
 | Interesting Entries:
 |  - server: nginx
 |  - x-ua-compatible: IE=edge
 |  - referrer-policy: origin
 |  - content-security-policy: script-src 'self' 'unsafe-inline' inicis.com ; frame-ancestors 'self';
 |  - access-control-allow-origin: *
 |  - x-debug-whats-going-on: on
 | Found By: Headers (Passive Detection)
 | Confidence: 100%

[+] https://happist.com/robots.txt
 | Interesting Entries:
 |  - /wp-login.php
 |  - /xmlrpc.php
 | Found By: Robots Txt (Aggressive Detection)
 | Confidence: 100%

[+] The external WP-Cron seems to be enabled: https://happist.com/wp-cron.php
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 60%
 | References:
 |  - https://www.iplocation.net/defend-wordpress-from-ddos
 |  - https://github.com/wpscanteam/wpscan/issues/1299

[+] WordPress version 5.4.2 identified (Latest, released on 2020-06-10).
 | Found By: Rss Generator (Passive Detection)
 |  - https://happist.com/feed/, <generator>https://wordpress.org/?v=5.4.2</generator>
 |  - https://happist.com/comments/feed/, <generator>https://wordpress.org/?v=5.4.2</generator>

[+] WordPress theme in use: generatepress
 | Location: https://happist.com/wp-content/themes/generatepress/
 | Latest Version: 2.4.2 (up to date)
 | Last Updated: 2020-03-17T00:00:00.000Z
 | Style URL: https://happist.com/wp-content/themes/generatepress/style.css
 | Style Name: GeneratePress
 | Style URI: https://generatepress.com
 | Description: GeneratePress is a lightweight WordPress theme built with a focus on speed and usability. Performanc...
 | Author: Tom Usborne
 | Author URI: https://tomusborne.com
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | Version: 2.4.2 (80% confidence)
 | Found By: Style (Passive Detection)
 |  - https://happist.com/wp-content/themes/generatepress/style.css, Match: 'Version: 2.4.2'

[+] Enumerating All Plugins (via Passive Methods)
[+] Checking Plugin Versions (via Passive and Aggressive Methods)

[i] Plugin(s) Identified:

[+] content-views-query-and-display-post-page
 | Location: https://happist.com/wp-content/plugins/content-views-query-and-display-post-page/
 | Latest Version: 2.3.2 (up to date)
 | Last Updated: 2020-03-27T08:24:00.000Z
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | Version: 2.3.2 (20% confidence)
 | Found By: Query Parameter (Passive Detection)
 |  - https://happist.com/wp-content/plugins/content-views-query-and-display-post-page/public/assets/css/cv.css?ver=2.3.2
 |  - https://happist.com/wp-content/plugins/content-views-query-and-display-post-page/public/assets/js/cv.js?ver=2.3.2

[+] embed-any-document-plus
 | Location: https://happist.com/wp-content/plugins/embed-any-document-plus/
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] gp-premium
 | Location: https://happist.com/wp-content/plugins/gp-premium/
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] lazy-loading-responsive-images
 | Location: https://happist.com/wp-content/plugins/lazy-loading-responsive-images/
 | Latest Version: 6.0.1
 | Last Updated: 2020-05-01T15:42:00.000Z
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] otter-blocks
 | Location: https://happist.com/wp-content/plugins/otter-blocks/
 | Latest Version: 1.5.5
 | Last Updated: 2020-06-22T22:22:00.000Z
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] pt-content-views-pro
 | Location: https://happist.com/wp-content/plugins/pt-content-views-pro/
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] sassy-social-share
 | Location: https://happist.com/wp-content/plugins/sassy-social-share/
 | Latest Version: 3.3.10 (up to date)
 | Last Updated: 2020-05-14T06:16:00.000Z
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | Version: 3.3.10 (30% confidence)
 | Found By: Query Parameter (Passive Detection)
 |  - https://happist.com/wp-content/plugins/sassy-social-share/public/css/sassy-social-share-public.css?ver=3.3.10
 |  - https://happist.com/wp-content/plugins/sassy-social-share/admin/css/sassy-social-share-svg.css?ver=3.3.10
 |  - https://happist.com/wp-content/plugins/sassy-social-share/public/js/sassy-social-share-public.js?ver=3.3.10

[+] searchwp-live-ajax-search
 | Location: https://happist.com/wp-content/plugins/searchwp-live-ajax-search/
 | Last Updated: 2020-04-23T12:09:00.000Z
 | [!] The version is out of date, the latest version is 1.4.6.1
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | Version: 1.4.6 (10% confidence)
 | Found By: Query Parameter (Passive Detection)
 |  - https://happist.com/wp-content/plugins/searchwp-live-ajax-search/assets/styles/style.css?ver=1.4.6

[+] stackable-ultimate-gutenberg-blocks-premium
 | Location: https://happist.com/wp-content/plugins/stackable-ultimate-gutenberg-blocks-premium/
 |
 | Found By: Urls In Homepage (Passive Detection)
 | Confirmed By: Urls In 404 Page (Passive Detection)
 |
 | The version could not be determined.

[+] Enumerating Config Backups (via Passive and Aggressive Methods)
 Checking Config Backups - Time: 00:00:01 <=============================> (21 / 21) 100.00% Time: 00:00:01

[i] No Config Backups Found.

[!] No WPVulnDB API Token given, as a result vulnerability data has not been output.
[!] You can get a free API token with 50 daily requests by registering at https://wpvulndb.com/users/sign_up

[+] Finished: Mon Jun 29 06:38:47 2020
[+] Requests Done: 91
[+] Cached Requests: 7
[+] Data Sent: 17.227 KB
[+] Data Received: 792.266 KB
[+] Memory used: 188.879 MB
[+] Elapsed time: 00:00:20Code language: PHP (php)

위 결과에 따르면 WP cron을 활성화되어 있어 60% 신뢰도를 보이고, sassy-social-share 플러그인는 업데이트가 필요하고, 30% 신뢰도를 보인다고 지적합니다.

저는 이 sassy-social-share 플러그인의 일부 파일을 수정해 한국 소셜 미디어를 추가했기 때문에 이런 지적이 나오는 것 같습니다.

단 주의할 점은 서버에서 사이트 주소를 리다이렉트했으면 리다이렉트한 주소를 입력해야 합니다.

워드프레스 요소별로 스캔하려면

워드프레스 전체가 아니라 요소별로 스캔하려면 아래와 같은 옵션을 사용합니다.

[Scan installed plugins]
wpscan --url https://happist.com --enumerate p

[Scan vulnerable plugins]
wpscan --url https://happist.com --enumerate vp

[Scan installed themes
wpscan --url https://happist.com --enumerate t

[Scan vulnerable themes]
wpscan --url https://happist.com --enumerate vt

[Scan user accounts:]
wpscan --url https://happist.com --enumerate u

[Scan vulnerable timthumb files:]
wpscan --url https://happist.com --enumerate ttCode language: PHP (php)

WPVulnDB API 사용법

기본적으로 WPScan은 알려진 보안 취약성이 있는지 여부만 알려줍니다.

발견된 세부 취약점이 무엇인지를 알려면 WPVulnDB를 이용해야 합니다.

위에서 언급한대로 https://wpvulndb.com/users/sign_up에 등록하시면 일일 50건 요청이 가능한 무료 API 토큰을 받으실 수 있습니다.

여기서 계정을 등록 후 API 토큰을 발급받으면 아래와 같은 명령으로 WPScan 설정 파일에서 API 토큰을 등록할 수 있습니다.

nano ~/.wpscan/scan.ymlCode language: PHP (php)

이 설정 파일에서 아래 코드를 추가합니다.

cli_options:
    api_token: 발급받은 API 토큰Code language: PHP (php)

위에서도 설명했듯이 WPScan은 무료 및 비상업적 용도로 제공됩니다.

그러나 워드프레스 사이트 스캔 시 보다 자세한 취약점을 분석하려면 워드프레스 취약성 데이타베이스 API에 접속해서 보다 자세한 정보를 받아야 하는데요.

이 세부 취약성 데이타는 횟수에 따라서 과금하고 있습니다. 즉 하루 50회까지는 무료로 사용가능하며 그 이상 서비스를 원하는 경우 비용을 지불하는 시스템입니다. WPScan 팀 운영을 위해서는 어쩔 수 없는 일이 아닐까 합니다.

아마 사이트 보안을 위해 실시간으로 사이트를 점검한다면, 물론 이러려면 엄청난 시스템 자원이 필요하겠지만 점검 시간을 짧게 가져가려면 API 접속 횟수를 늘려야하기 때문에 유료 플랜 사용이 필요합니다.

수없이 등장하는 수많은 워드프레스 플러그인, 자주 업데이되는 워드프레스 코어 및 각종 테마들을 테스트하고 데이타베이스로 구축하는 것은 재능 기부로 해결할 수는 없을 듯합니다.

워드프레스 보안진단 툴 WPScan Vulnerability Database API 가격표
워드프레스 보안진단 툴 WPScan Vulnerability Database API 가격표

WPWatcher, 스캔 결과를 이메일로 받아보기

WPScan 결과를 이메일로 받아보려면 가장 간단하게는 위에서 설명한 워드프레스 플러그인을 설치하면 쉽습니다.

그러나 서버에서 작동시키는 것이 목적이기 때문에 우분투를 비롯한 리눅스 서버에서 메일로 보내줄 수 있는 방법이 필요합니다.

이러한 니즈를 잘 충족시키는 것이 바로 WPWatcher인데요. 여기서는 WPWatcher를 이용해서 이메일 송부 방법에 대해 살펴보도록 하겠습니다.

WPWatcher 설치 방법

WPWatcher를 설치, 사용하기 위해서는 당연히 WPScan이 필요하고, 파이썬 3가 필요합니다.

먼저 PyPi로 WPWatcher를 설치 및 업그레이드 합니다.

pip3 install wpwatcher
pip3 install wpwatcher --upgradeCode language: PHP (php)

WPWatcher 설정

WPWatcher 설정을 위해서는 설정 파일을 복사해 옵니다.

wpwatcher --template_conf > ./wpwatcher.confCode language: PHP (php)

WPWatcher 설정 파일을 편집합니다.

nano ./wpwatcher.confCode language: PHP (php)

저는 아래와 같이 설정을 구성했습니다.

[wpwatcher]
wpscan_path=wpscan
wpscan_args=[   "--format", "json",
                "--no-banner",
                "--random-user-agent",
                "--disable-tls-checks",
                "--api-token", "API 토큰" ]

# Sites (--url or --urls)
wp_sites=   [ {"url":"happist.com"}]

# Notifications
send_email_report=Yes
email_to=["받을 이메일 주소"]

send_infos=Yes
send_errors=Yes
send_warnings=Yes
attach_wpscan_output=Yes
resend_emails_after=1d
Code language: PHP (php)

# Email server settings
from_email=WordPressWatcher@happist.com
smtp_server=smtp.gmail.com:587
smtp_auth=Yes
smtp_user=email address
smtp_pass=password(gmail app password)
smtp_ssl=Yes
Code language: PHP (php)

# Sleep when API limit reached (--wait)
api_limit_wait=YesCode language: PHP (php)

제가 이전에 지메일을 활용한 메일 세팅에 대해 포스팅했는데요. 이를 참조하시면 좋을 것 같네요.

자동 수행을 위한 크론탭 설정

설정에 따라 일정 시간이 되면 자동으로 실행되도록 크론탭을 설정합니다.

crontab -eCode language: PHP (php)

크론탭에 아래와 같은 명령을 추가합니다. WPWATCHER는 루트에서만 실행되기 때문에 먼저 cd 명령을 이용해 루트로 이동 후 wpwatcher를 실행토록 합니다.

40 3 * * * cd && wpwatcher --conf wpwatcher.conf  --quietCode language: PHP (php)

원래 위와 같은 크롭탭 설정이 생각외로 작동하지 않아서 저는 조금 더 확실하게 스크립트 실행 파일(sh)을 만들어 작동하도록 만들었습니다.

cd /bin   # /bin 폴더로 이동 장 확률이 높았기에.
nano wpwatcher.shCode language: PHP (php)

이 스크립트 파일에는 아래와 같은 내용을 추가합니다.

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

cd /root/
wpwatcher --conf wpwatcher.conf
Code language: PHP (php)

그리고 스크립트 파일이 실행 가능토록 만듭니다.

그 다음에는 이 파일에 권한을 부여합니다.

chmod +x wpwatcher.shCode language: PHP (php)

그 다음에는 크론에 이 파일 실행을 추가해야 겠죠?
이는 아시다시피 crontab -e 명령을 사용합니다.

crontab -eCode language: PHP (php)

크랜탭에서 아래 내용을 추가해 줍니다. 매일 새벽 4시 40분과 오후 6시 35분에 정의한 wpwatcher.sh를 실행하라는 명령입니다.

40 04 * * * wpwatcher.sh
35 18 * * * wpwatcher.shCode language: PHP (php)

크론을 다시 시작합니다.

service cron restart Code language: PHP (php)

크론이 제대로 작동하는지 한번 확인해 봅니다.

service cron statusCode language: PHP (php)

그러면 아래와 같이 크론이 active되고 있다고 나오면 OK입니다.

n# service cron status
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-07-12 13:12:24 KST; 7s ago
       Docs: man:cron(8)
   Main PID: 2732171 (cron)
      Tasks: 1 (limit: 9451)
     Memory: 384.0K
     CGroup: /system.slice/cron.service
             └─2732171 /usr/sbin/cron -f

Jul 12 13:12:24 fashionseoul.com systemd[1]: Started Regular background program processing daemon.
Jul 12 13:12:24 fashionseoul.com cron[2732171]: (CRON) INFO (pidfile fd = 3)
Jul 12 13:12:24 fashionseoul.com cron[2732171]: (CRON) INFO (Skipping @rebootCode language: PHP (php)

페이스북 샵이 쇼피파이에게 재앙인 이유와 쇼피파이 전략 by Ben Thompson

얼마전 페이스북이 중소기업들을 지원한다는 명분을 내세워 무료로 사용할 수 있는 페이스북 샵을 출시한다고 밝혔습니다. 여기에는 쇼피파이나 카페24와 같은 이커머스 플랫폼업체들이 파트너로 참여하는데요.

이러한 페이스북 샵에 파트너로 참여하는 업체들, 특히 아마존 대항마로 부상하고 있는 쇼피파이(Shopify)에게는 어쩌면 재앙일 수 있다는 분석이 있습니다.

이는 실리콘밸리 혁신 이론중의 하나인 제품 혁신론을 주장하는 톰 벤슨이 그의 블로그에서 주장한 내용인데요.

빠르게 변화하는 이커머스를 비롯한 인터넷 환경 변화를 파악하는데 좋은 인사이트를 주는 글이기 때문에 시간을 내서 번역,. 소개해 봤습니다

Platforms in an Aggregator World

제가 The Anti-Amazon Alliance이란 글을 쓴지 한달이 안되어 이러한 동맹의 중요한 두 주요 참여 기업에서 중요한 발표를 했습니다.

– 쇼피파이의 숍 앱(Shop App) 발표
쇼피파이 숍앱, Shopify Shop App, Shop better(Universal Standard)
– 페이스북의 페이스북 샵 발표
페이스북 샵(Facebook Shops), Image from Facebook

페이스북 샵, 아마존 공략 위한 페이스북의 이커머스 전략 무기

많은 사람들은 쇼피파이와 페이스북의 이러한 발표가 서로 관련이 있다고 주장해 왔습니다. 쇼피파이(Shopify)는 페이스북이 가지고 있는 고객을 얻기 위해서 고객용 애플리케이션을 구축해야 하는데, 페이스북 숍은 그런 필요를 충족해줄 수 있다는 것입니다.

저는 이와 다르게 해석합니다. 저는 쇼피파이가 직접 최종 고객을 얻는데 많은 시간과 투자를 해서는 안된다고 생각하는데 그것을 증명해주는 것이 페이스북 숍이라고 생각합니다.

반(反)아마존 동맹 부활

저는 The Anti-Amazon Alliance에서 오프라인 유통은 상품의 탐색(discovery)와 배포(Distribution)의 두 가지 기능을 제공한다고 언급했습니다.

그러나 인터넷에서는 이러한 기능이 두 개의 서로 다른 가치 사슬로 분할되었습니다. 페이스북은 탐색(discovery)에서 가장 중요한 위치를 차지하고 있으며, 아마존은 탐색(discovery)에 기반한 배포(Distribution)를 지배하고 있습니다.

그 포스팅은 구글이 PTP(Pay-To-Play)에서 벗어나 구글 쇼핑에 집중, 검색엔진에서 상품 리스트를 보여주는 방향으로 선회함으로써 반 아마존 연합에 가입했다는 뉴스를 듣고 정리한 것입니다.

Amazon을 제외하고 가치 체인 작동에서 가장 중요한 회사 중 하나는 쇼피파이입니다. 그리고 쇼피파이는 애그리게이터(여러 회사의 상품이나 서비스를 한군데 모아서 보여주는 서비스)가 아니라 플랫폼입니다.

구글과 페이스북은 고객을 모을 수 있지만 판매자들이 실제로 온라인으로 상품을 판매할 수 있는 인프라를 제공하는 것은 쇼피파이(및 우커머스, 오픈 소스 경쟁업체)입니다.

쇼피파이는 또한 제가 Shopify and the Power of Platforms에서 언급했듯이 쇼피파이 Fulfillment Network를 통해 판매 상품들이 고객에게 제대로 전달되도록 돕기 위해 노력하고 있습니다.

지난 주  Reunite Conference에서 쇼피파이는 현재 미국 전역에 7개 물류 창고를 운영하고 있으며, 물류 창고 운영을 개선하기 위한 R&D 센터를 설립했으며, 주문 이행(warehouse operations)에 도움을 주기 위해 “Chuck” 로봇을 6개의 리버 시스템을 통합했다고 발표했습니다.

쇼피파이 Fulfillment Network의 한 가지 유용한 구성 요소는 쇼피파이 웹 사이트 템플릿은 컴스텀 패키지로 완벽하게 변환된다는 점입니다.

즉 여러분이 쇼피파이로부터 패키지를 받으면(이는 전 세계 어디에서나 이틀 정도 소요됩니다.) 이는 쇼피파이 템플릿이 아닌 완전히 해당 판매자 용으로 커스터마이제이션한 것처럼 변신합니다.

이는 플랫폼의 일부가 되는 것이며 쇼피파이 플랫폼의 선물입니다. 고객이 비록 쇼피파이 존재를 의식하지 못해도 플랫폼을 이용하고 있는 고객이 승리하면 쇼피파이가 승리하는 것입니다.

이러한 이유로 쇼피파이가 상품 배송 과정을 추적하는 앱을 쇼피파이 앱으로 다시 브랜드화하기로 한 결정에는 동의하지 않았습니다. 쇼피파이 앱은 판매자들을 쇼피파이 자체와 비교해 격을 낮추어 버립니;다. (그리고 브랜드 가치를 유지하려는 시도는 사용자 경험을 혼란스럽게 만듭니다.)

페이스북 숍

쇼피파이 숍 앱에 대한 제 의견에 동의하지 않은 사람들은 일반적으로 페이스북을 비롯한 소셜 미디어와 소비자가 직접 만나는 공간에서 점점 더 많은 가치를 포착하고 있다는 사실을 언급합니다.

저는 올해 초 Email Addresses and Razor Blades에서 이러한 현상이 발생하는 이유에 대해 다음과 같이 설명햇습니다.

문제는 마케팅을 구글과 페이스북에 의존하는 과정에서 DTC(Direct To Consumer) 기업들이 가치 사슬에서의 계획했던 통합과 관련 수익을 페이스북과 구글에 넘겨 버렸다는 점입니다.

페이스북 샵이 쇼피파이에게 재앙인 이유와 쇼피파이 전략 by Ben Thompson 1

실제 (가치 사슬) 통합 업체인 구글과 페이스북은 고객과 연구 개발을 통합하여 마케팅을 지배합니다. DTC는 온라인 소매 영업을 할 수 있지만, 이는 가치 사슬의 일부로서 모듈화되어 상품화된 것입니다. 한편, 아마존은 소매와 물류를 통합하는 과정에 있었습니다.

그러나 쇼피파이가 고객을 직접 획득하는 것에 대해 책임을 지는 것은(판매자에게 도움을 주는 도구를 구축하는 것이 아니라) 가치 사슬에서 쇼피파이의 역활과 맞지 않을 뿐만 아니라, 쇼피파이가 이 일을 판매자들보다 더 잘할 것이라고 믿을만한 특별한 이유는 없습니다.

페이스북이 고객 확보 측면에서 탁월한 역량을 가지고 있기 때문에 페이스북은 그것에 프리미엄을 부과할 수 있는 것입니다.

쇼피파이가 더욱 더 신경을 써야하는 것은 페이스북이 꺼꾸로 페이스북 숍 뒷단을 통합할 수 있는 가능성입니다. 페이스북은 뉴스룸에서 아래와 같이 이야기 합니다.

페이스북 숍을 통해 기업은 고객이 페이스북과 Instagram에서 모두 액세스할 수 있는 온라인 숍을 쉽게 개설할 수 있습니다. 페이스북 숍을 만드는 것은 무료이며 간단합니다.

기업은 카탈로그에서 원하는 제품을 선택한 다음 자신 브랜드를 보여주는 커버 이미지와 액센트 색상으로 가게의 모양과 느낌을 사용자 정의할 수 있습니다.즉, 규모나 예산에 관계없이 모든 판매자는 언제 어디서나 편리한 시간에 비지니스를 온라인으로 전환하고 고객과 만날 수 있습니다.

사람들은 기업 페이스북 페이지나 인스타그램 프로필, 페이스북 스토리 또는 페이스북 광고를 통해 페이스북 숍을 찾을 수 있습니다.

여기서 전체 컬렉션을 검색하고, 관심 있는 제품을 저장하고, 주문할 수 있습니다. 미국의 경우 체크아웃을 활성화 놓았다면, 비즈니스 웹 사이트 또는 앱을 떠나지 않고도 주문을 완료할 수 있습니다.

또한 오프라인 매장에서에 누군가에게 도움을 요청하는 것처럼 페이스북 숍에는 WhatsApp, Messenger 또는 Instagram Direct를 통해 브랜드에게 메시지를 보내 질문하고, 지원을 받고, 배송 과정을 추적할 수 있습니다.

또한 앞으로는 WhatsApp, Messenger 또는 Instagram Direct에서 채팅을 통해 왓츠앱, 메신저 또는 인스타그램 다이렉트 채팅에서 비즈니스 숍을 살펴보고 바로 구매할 수 있습니다.

이는 쇼피파이에게 안 좋은 소식이죠? 다만 마지막 단락은 다음과 같습니다.

또한 쇼피파이, BigCommerce, WooCommerce, ChannelAdvisor, CedCommerce, 카페24, Tienda Nube 및 Feedomics와 같은 파트너와 더욱 긴밀히 협력하여 중소기업에 필요한 지원을 제공하고 있습니다.

이러한 조직은 기업가가 비즈니스를 시작하고 운영하며 온라인으로 전환할 수 있도록 지원하는 강력한 도구를 제공합니다.

이들은 이제 중소기업들이 페이스북 숍을 구축 및 성장시키고 다른 이커머스 도구를 사용하는 데 도움을 줄 것입니다.

쇼피파이도 블로그에서 페이스북 숍에 대한 전했지만, 이 파트너십은 Reunite Conference 키노트에서 단 18초만 언급되는데 그쳤습니다. 이 파트너쉽에 대해서 쇼피파이가 흥분할 대단한 이유를 느낄 수 없습니다.

쇼피파이 비즈니스 모델

쇼피파이의 원래 비즈니스 모델은 “Subscription Solutions”입니다. 판매자들은 쇼피파이 플랫폼을 사용하기 위해 구독료를 지불하며(한 달에 29달러에서 299달러까지) 원하는 페이 제공업체를 사용할 수 있습니다.

페이스북 샵이 쇼피파이에게 재앙인 이유와 쇼피파이 전략 by Ben Thompson 2

쇼피파이가 기업공개(IPO) 시 발표한 자료에 따르면 쇼피파이의 Subscription Solutions가 분기 매출 6700만 달러의 60%를 차지했습니다.

하지만 지난 5년 동안 쇼피파이 자체 페이 숄류션을 사용하는 “Merchant Solutions” 매출 비중이 꾸준히 증가해 지난 분기엔 분기 매출 4억 7천만 달러의 60%를 차지했습니다.

쇼피파이 비즈니스 모델에서 이러한 변화르 보면 쇼피파이의 페이스북과 “파트너십”이 불편한 요소를 가지고 있습니다.

물론, 페이스북 숍 통합은 쇼피파이의 Subscription Solutions 입장에서는 플러스 요인이지만 페이스북 숍에서는 페이스북 결제 솔류션을 이용해야 하기 때문에 쇼피파이 Merchant Solutions 매출은 부정적이 요인으로 작용할 것입니다.

이는 판매자 솔류션 매출이 없다는 것을 의미하며, 나아가서는 판매자들의 성장 트랜드에 참여하지 않는다는 것을 의미합니다.

이것이 쇼피파이에게는 특히 씁쓸한 이유는 페이스북의 움직임이 판매자들에게 정말 좋은 기회라는 점입니다. 그리고 페이스북 숍은 외부 서비스와 통합되지 않고 지나치게 복잡했던 인스타그램 쇼핑 베타보다 훨씬 더 나은 해결책입니다.

이 시점에서 저는 인스타그램에서 제품 구매 경험한 사람들이 아직 구매하지 않은 사람들보다 더 많으며, 실제로 인스타그램에서 구매 경험은 상당히 비참한 경험이었다고 알고 있습니다. 때로는 그냥 구매를 포기해 버리는 것이 더 쉬운 선택일때가 많았습니다.

반면에 페이스북에서 체크아웃은 몇분이 걸리는 것이 아니라 몇초만에 구매가완료될 수 있습니다.

결국, 여러분이 누구인지 아는 사람이 있다면, 그것은 바로 페이스북입니다! 이는 페이스북과 인스타그램 광고에서 특히 더 많은 변화를 의미할 것이며 쇼피파이가 성장할 여지가 보이지 않을 것입니다.

소방관과 방화범

페이스북은 실제로는 자기들이 만들어 낸 문제에 대한 솔류션 제공자로 자리매김하고 있다는 점을 주목할 필요가 있습니다.

iOS를 구체적으로 살펴보면 Apple은 결제 문제에 대해서는 사용자 친화적인 애플페이를 제공합니다.

그러나 애플페이는 Safari 및 SFSafariViewController로 구현한 개체로 제한됩니다. 후자는 개발자가 애플리케이션에 브라우저를 추가하는 가장 간단한 방법입니다. 이는 Safari와 유사하며 오른쪽 하단에 Safari에서 페이지를 로드할 수 있는 버튼이 있습니다.

사파리 브라우저와 인스타그램에서 구현된 SFSafariViewController 웹 뷰를비교, 대조해 봅니다.

사파리 브라우저와 인스타그램에서 구현된 SFSafariViewController 웹 뷰를비교, shopify-webviews
사파리 브라우저와 인스타그램에서 구현된 SFSafariViewController 웹 뷰를비교

인스타그램은 기본적으로 인스타그램 내에 그들만의 브라우저를 만들었습니다. 여기서는 여전히 iOS의 요구사항인 WebKit 엔진을 사용합니다. 이는 Chrome도 WebKit를 사용한다는 의미입니다.

그럼에도 애플은 이들 내부 브라우저를 통제하지 않습니다. 애플은 여기에 애플페이를 적용하지 않기로 했습니다.

이는 즉, 인스타그램과 페이스북에서 구매 경험이 페이스북이 (애플페이가 가능한) SFSafariViewController를 적용하거나 애플이 애플페이 적용 정책을 완화했을 때보다 사용 경험이 좋지 않다는 것을 의미합니다.

특히, 페이스북과 애플 모두 동전의 양면에서 동기부여를 받고 있습니다. 페이스북은 자체 브라우저를 사용합니다. SFSafariViewController에서 가능한 한 많은 데이터를 캡처할 수 있기 때문입니다. 한편,

Apple은 사용자 데이터를 타사 개발자가 쉽게 접근하지 못하도록 막을 목적으로 SFSafariViewController 부변에 샌드박스를 설치하는 동시에 SFSafariViewController를 훨씬 더 사용하기 쉽게 만들고, 애플페이 통홥과 같은 이점을 제공하면서 사용을 장려합니다.

여러분 중 많은 분들이 이미 애플의 정책에 감사하고 페이스북의 정책에는 짜증 날것이라고 확신합니다. 결국, 애플은 사용자 편의성을 추구하고, 페이스북은 사용자를 이용하려고만 합니다. 그렇죠?

사실 그것보다 좀 더 복잡한데 쿠키가 좋은 예입니다.

인스타그램 광고는 쇼피파이 플랫폼을 이용하는 판매자들의 광고라는 것을 기억하세요. 이 모든 웹사이트들은 동일한 (쇼피파이) 인프라에서 호스팅됩니다.

사용자가 (쇼피파이 플랫폼을 이용하는) 웹 사이트에서 구매 후 (쇼피파이 플랫폼을 이용하는) 다른 웹 사이트를 방문했을 때 쇼피파이가 쿠키를 설정할 수 있다면 그 사이트에서는 이미 모든 결제 준비가 완료된 상태로 로그인되어 있는 경우를 생각해 보죠.

특히 쇼피파이는 숍페이(ShopPay)라고 불리는 이러한 페이 인프라를 구축했지만 이는 모든 쇼피파이 웹 사이트에 로그인해야 사용 가능하다는 점에서 주목할 필요가 있습니다.

이런 이야기를 시시콜콜하는 이유는 지난 3년 동안 애플은 이러한 제3자 쿠키를 없애기 위해 노력해 왔기 때문입니다.

여기에는 특히 광고를 위해 로드되는 제3자 쿠키 추적기 제거라는 그럴싸한 이유가 있습니다. 그러나 그 와중에 쇼피파이와 그 플랫폼을 이용하는 판매자들은 실질적인 피해자가 되고 있습니다.

저는 작년에 Privacy Fundamentalism라는 글에서 이러한 트레이드오프에 다음과 같이 적었습니다.

기술은 좋은 것과 나쁜 것 모두를 위해 사용될 수 있지만, 나쁜 것을 없애는 것을 서두르면서 좋은 것을 망각하기 쉽습니다.

예를 들어, Manjoo는 구독을 통해 대부분 수익을 거두는 뉴욕 타임즈를 위해 일합니다. 이 점을 감안하면, 그들이 저 자신의 구독 사업을 지원하는 Stratechery의 제 3자 콘텐츠에 반대하지 않는다고 가정할 수 있습니다.

이것은 제 모든 부분에 적용됩니다. 왜냐하면 정보는 경제적 이득을 노리고 수많은 회사들이 구축해 놓은 인프라를 통해 인터넷에서 아주 쉽게 퍼지기 때문입니다. 저는 이 기사를 제 집에서 쓸 수 있습니다. 그리고 여러분은 여러분의 집에서 읽으실 수 있습니다.

이것이 놀랍지도 않다는 것은 우리가 인터넷을 당연시 여기기 때문입니다. 세계 어느 곳의 사이트든 누구나 접속할 수 있습니다. 인터넷은 데이터를 자유롭고 쉽게 이동하기 때문입니다.

불행히도, 이것은 2020년보다는 2017년 세계를 더 잘 정의하는 표현일 수 있습니다.

예, 웹 사이트는 여전히 자유롭게 액세스할 수 있습니다. 그렇지만 쇼피파이와 같은 중요한 플랫폼((내 경우에는 워드프레스와 스트라이프)에서 이러한 사이트들을 지원하는 것은 점점 더 어려워졌습니다.

프라이버시는 좋은 것이지만, 기업가 정신과 경쟁도 마찬가지로 중요합니다. 다른 사람들을 고려하지 않고 하나를 최대화하면 의도하지 않은 결과가 초래된다.

페이스북 샵은 이러한 완벽한 예입니다. 페이스북 샵은 쇼피파이 플랫폼을 이용하는 판매자들에게 좋기 때문에 성공할 것입니다.

그러나 쇼피파이 판매자들에게 좋은 이유는 페이스북과 애플이 효과적으로 협력해 쇼피파이가 결제 솔류션 문제를 해결할 수 없도록 만들었기 때문입니다.

이것은 저를 슬프게 합니다.

제가 인터넷을 낙과적으로 바라본 이유는 쇼피파이, 스트라이프 그리고 서브스택(Substack)과 같은 플랫폼들 때문입니다. 이 플랫폼들은 개인 기업가들이 원하는 대로 세계적 수준의 도구를 사용해 자신만의 비지니스를 구축할 수 있도록 만들 수 있기 때문입니다.

그런데 (페이스북과 애플등이) 이러한 도구 사용을 어렵게 만들고 있기 때문에 기존 회사들과 기존 앱들에게 유리한 상황으로 퇴보하고 있습니다.

쇼피파이 플랫폼 전망

쇼피파이와 애그리게이터(Aggregator)로 가치 사슬(Value Chain)에서 경쟁하는 모든 기업에게 이는 가혹한 현실입니다.

특히 인프라 공급업체들이 점점 더 직면하고 있는 기술적 한계를 감안할 때 이 게임에서 페이스북을 이길 수는 없습니다.

결국 페이스북의 고객 확보 기술을 극복하는 일은 판매자 스스로 책임져야 합니다.

즉, 웹이 존재하는 한 항상 작동하는 법칙은 아주 매력적인 무언가를 만들어내어 사람들이 여러분에게 몰려들도록 만드는 것입니다.

그래서 제가 쇼피파이의 Fulfillment Network에 대해 계속 흥분하는 이유입니다.

저는 쇼피파이의 접근에 완전히 매료되지는 않았습니다. 저는 쇼피파이가 자체 물류 서비스를 구축하는 대신 판매자들과 독립적인 3PL 제공업체간 상호 작용할 수 있는 공통 인터페이스를 만드는 것이 더 합리적일 수 있다고 생각했습니다(그러나 제가 잘못 알고 있을 수도 있습니다).

하지만 저는 이 분야에 막대한 투자를 하고 있는 이 회사를 전적으로 지지합니다.

첫째, 이 서비스는 어떤 판매자도 자체적으로 구축할 수 없는 서비스이기 때문입니다.

이는 플랫폼이 생태계를 위한 무언가를 어떻게 만들 수 있는지를 보여주는 완벽한 예입니다.

게다가 이것은 특히 작년에 제가 지적했듯이 아마존의 경쟁사로서의 쇼피파이의 약속을 이행하기 위해 필요한 것입니다. 사용자들이 쇼피파이로 가는 것을 선택해서가 아니라 쇼피파이가 존재한다는 것을 알 이유가 없기 때문입니다.

둘째로, 이것은 페이스북 샵들을 더 가치 있게 만들어 줄 서비스이기 때문입니다. 페이스북 체크아웃으로 인해 매출이 증가하는 모든 상인들은 여전히 그들의 상품을 배송해야 합니다. 그리고 페이스북이 현실 세계에 통합될 가능성은 전혀 없습니다.

셋째, 이 서비스는 다른 누구도 구축하지 않을 서비스입니다. 네, 이행 센터를 짓고 로봇을 개발하고 많은 노동자를 고용하는 것은 매우 어렵습니다.

하지만 그 어려움 속에 경쟁으로부터의 벗어날 수 있는 해자가 되고, 장기적으로 지속 가능한 수익을 낼 수 있는 훨씬 더 신뢰할 수 있는 방법입니다.

쇼피파이가 은행 및 금융 서비스로 전환하는 것에 대해서도 낙관적입니다.

예, 여기 스트라이프(Stripe)와 같은 쇼피파이 파트너와의 경쟁은 더욱 치열합니다. 하지만 이 영역은 Aggregator가 플랫폼 공급자에게 결코(그리고 절대로) 이치에 맞지 않는 위험을 감수하는 또 다른 영역입니다.

구축 필요성

Marc Andreessen의 에세이 It’s Time to Build에 대한 제 답변에서, 저는 기술 산업이 더 많은 차이를 만들 수 있는 세 가지 다른 방법을 제안했습니다. 이 중 두 번째는 다음과 같습니다.

둘째, 소프트웨어를 가지고 하드웨어에서 차별화하기 위해 투자하는 실제 기업(real-world companies)에 투자합니다.

이 하드웨어는 공장이나 공장 자체를 위한 기계일 수도 있고, 새로운 형태의 교통수단이나 방어시스템일 수도 있습니다.

최소한 90%의 총 마진 요구를 포기하면 그 가능성은 무궁무진합니다.

그것은 최근 쇼피파이 실적 보고서의 다음과 같은 두 가지 “경고”가 떠올랐습니다.

– 당사는 쇼피파이 Fulfillment Network와 6 River Systems Inc.(“6RS”) 개발에 따라 단기적으로 가맹점 솔루션( merchant solutions) 총 마진율이 감소할 것으로 예상됩니다.
– 가맹점 솔루션(merchant solutions)의 지속적인 성장은 매출총이익률의 하락을 초래할 수 있다고 예상합니다.

간단히 말해서, 이행 센터를 짓고 로봇을 개발하고 많은 직원을 고용하는 것은 이윤을 위해 좋지 않습니다.

그렇지만 적어도 쇼피파이가 운영하는 경쟁이 치열한 시장에서는 해자를 만들기에 좋습니다. 이것은 분명히 아마존이 오래 전에 발견한 것입니다;

저는 2018년에 Amazon Go and the Future에서 다음과 같이 썼습니다.

이러한 투자 의지는 Amazon을 진정으로 차별화하는 것이며, 그 보상은 어마어마합니다. 저는 이전에 통신 회사들에 대해 언급한 적이 있습니다.
그들의 경제적 파워는 막대한 자본 지출에서 직접 나오며 그 경제적 파워는 차별화 부족으로 제한됩니다.

그러나, 소프트웨어 기반 수평 모델과 네트워크 기반 차별화를 통해 Amazon은 수직 계열화 구축에 착수했을 뿐만 아니라 이를 위해 막대한 비용을 지출했습니다.

이러한 지출은 단기적으로는 고통스럽지만(대부분의 소프트웨어 회사들이 이를 기피하는 이유이기도 하져), 이는 대규모 해자를 제공합니다.

이런 관점에서, 실제 세계에 건설한 건축의 위상은 그 과정이 얼마나 어려운가에 달려 있습니다.

우리가 “The End of the Beginning”에 도달했다는 것은 어쩌면 우리가 도달 가능한 가장 높은 위상일지도 모릅니다.

참고

DDoS 취약 기능 XMLRPC 사용 중지로 워드프레스 보안 강화하기

오늘은 워드프레스 사용 기능 중 DDoS 공격에 취약하다는 XLMRPC 사용 중지로 워드프레스 보안을 강화하는 방안에 대해서 살펴봅니다.

이전 포스팅에서 무작위적인 ID와 비밀번호 대입으로 워드프레스 로그인 시도에 대한 대응으로 워드프레스 로그인 주소 변경하고, Fail2Ban으로 워드프레스 로그인 시도 IP를 블락하는 정책을 세웠습니다.

https://happist.com/573644/fail2ban%ec%9c%bc%eb%a1%9c-%ec%9b%8c%eb%93%9c%ed%94%84%eb%a0%88%ec%8a%a4-%ed%95%b4%ed%82%b9-%eb%b0%a9%ec%a7%80%ed%95%98%ea%b8%b0/

이러한 정책외 XMPRPC는 2007년 도입때무터 해커들의 공격에 취약하다는 문제를 가지고 있었습니다.

그렇지만, 워드프레스 관리자들 대부분이 이러한 위험에 무신경함으로서 최근 몇년간 해커들의 주요 공격 포인트가 되면서 경각심이 높아진 기능이기도 합니다.

여기서는 XLMRPC란 무엇이며, 워그프레스에서 이 기능을 사용하지 않으려면 어떻게 해야하는지 그 몇가지 방법을 살펴봅니다.

xmlrpc란 무엇인가?

서버와 서버간 또는 서버와 클라이언트간 통신을 표준 문서 형식인 XML을 이용한 원거리 전송 규약으로 서버 메소드에 직접 접근 가능한 방법입니다.

XML를 이용해 서버에서 멀리 떨어진 서버 또는 클라이언트의 서브 프로그램(Procedure)를 불러 작동 또는 작용하도록 만드는 것(Call)이란 의미로 XMLRPC라고 부릅니다.

XMLRPC는 이런 특성때문에 워드프레스나 블로그에서는 외부에서 글을 작성 후 사이트로 보내면 자동으로 포스팅이 되는 기능에 활용되기도 했습니다.

블러그가 한창 인기가 있을 때는 메일 본문에 글을 작성해 메일을 보내면 이를 자동으로 블러그 포스팅이 되는 기능이 활성화 되기도 했습니다.

또는 워드에서 글을 저장하면 이를 블러그로 보낼 수 있기도 했습니다. 이는 XML 규격을 활용해 그 포맷을 그대로 블러그 포스팅으로 저장할 수 있기 때문에 가능한 기능이었습니다.

지금은 이런 기능은 보안 이슈 등등으로 전부 없어지고 대신 REST를 사용하는 방향으로 전환되었습니다.

워드프레스에서는 핑백(pingback) 기능 때문에 사용 중 – 핑백을 사용하지 않으면 어느 정도 문제 해결 가능

또 현재 워드프레스에서 글을 인용 시 핑백(pingback) 기능 때문에 xmlrpc가 남아 있다고 합니다.

그러나 이 핑백 기능을 이용한 DDoS 공격도 많아지면서 점ㅂ차 핑백 기능을 사용하지 않는 사이트들이 증가하면서 유명무실해지고 있습니다.

XMLRPC 사용 중지 방법

그러면 어떻게 XMLRPC를 절대로 사용하지 않토록 만들까요? 이를 위한 여러가지 방법이 있습니다.

서버 설정이 가능한 경우

SFTP나 SSL을 통해서 서버 접속이 가능하고, 서버 설정 변경 권한이 있는 경우는 서버 설정을 변경하는 것이 좋습니다.

아파치를 웹서버로 사용하는 경우는 아래와 같은 명령어를 사용합니다.

<Files xmlrpc.php>
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</Files>Code language: PHP (php)

NGINX를 웹서버로 사용한다면 서버 설정 파일에 아래와 같은 코드를 추가합니다.

location ~* (xmlrpc)\.php$ {
    allow from xxx.xxx.xxx.xxx
    deny all;
    access_log off;
}Code language: PHP (php)

서버 설정이 어려운 경우

서버에 접속하기 위해 SFTP나 SSL사용이 어려운 경우는 XMLRPC 사용 중단을 위해서 플러그인을 사용할 수 있습니다.

사실 XMLRPC 사용 중단은 워드프레스 구성 파일 중 xmlrpc.php 파일 하나와만 연관되어 있기 때문에 굉장히 복잡한 작업은 아닙니다.

그렇기 때문에 굳이 플러그인까지 설치할 필요가 있을까하는 생각이 들 수 있습니다. 저처럼 가능하면 플러그인 사용을 자제하려는 경우에는 더욱 그러겠죠.

그러나 니즈가 있는 곳에 플러그인이 있다는 말처럼 워드프레스에서 XMLPC 사용 중지를 위한 플러인인드링 많이 있고 실제로도 많이 사용하고 있습니다.

  • 서버 접속이 어려운 경우
  • 서버 접속이 번거롭고, 굉장히 어렵게 느껴지는 경우
  • 플러그인 설치 및 적용이 생각보다 간단히 가장 편한 기능이기 때문

어떤 플러그인?

워드프레스에서 XMPRPC를 비활성화하는 플러그인도 생각외로 여러가지가 있지만 Disable XML-RPC 플러그인이 가장 많이 추천되고 있네요. 현재 약 10만명이 설치했했습니다.

다만 이 플러그인은 지난 1년동안 업데이트가 없어서 조금 주의 깊게 살펴볼 필요가 있습니다.

워드프레스 XMLRPC 플러그인들

Iptables 방화벽 연계 Fail2Ban 설정 방법, 워드프레스 해킹 방지

근래들에 멀웨어 감염되는 등 사이트에 심각한 문제가 했길래 서버 보안 및 사이트 보안에 대해 추가 조치를 하고 있습니다. 이중 워드프레스 로그인 시도를 제한해 워드프레스 해킹 방지하는 Fail2Ban 설정을 Iptables 방화벽과 연계 설정 방법에 대해서 알아보겠습니다.

Fail2Ban은 로그를 분석해 의심스러운 사이트 접근을 막는 방법으로 SSH, Apache, Nginx, FTP 등의 의심스러운 접근을 차단할 수 있습니다.

또한 워드프레스 로그인 실패 로그 기록을 기반으로 워드프레스 관리자 로그인 시도 등을 막을 수도 있습니다.

Fail2Ban에 대한 소개나 사용법에 대한 소개 자료는 많이 있지만 이중에서 워드프레스 해킹 방지 방법에 대해서는 조금 낮선 것 같아서 이번 사이트 보안 대책 수립하면서 자세하게 확인해 보았습니다.

특잏 이러한 Fail2Ban 설정을 Iptables 방화벽과 연계해 보안을 강화하는 방법까지 살펴보겠습니다.

워드프레스 로그인 감시를 위한 Fail2Ban 설정 – 필터 정의

Fail2Ban에서 워드프레스 관리자 로그인으로 워드프레스 해킹하려는 시도를 막기 위해서는 우선 워드프레스 로그인 실패를 모니터링할 수 있는 필터를 추가합니다.

Fail2Ban 필터는 /etc/fail2ban/filter.d 폴더에 존재하는데요. Fail2Ban에는 워드프레스 로그인 시도를 모니터링할 필터가 없기 때문에 수작업으로 만들어 줍니다.

필터 이름은 구분하기 적당하게 지으면 되는데요. 설명 자료등에서 wordpress를 많이 사용하고 있기 때문에 저도 wordpress 이름을 사용해 wordpress.conf 파일에 필터 옵션을 추가했습니다.

nano /etc/fail2ban/filter.d/wordpress.confCode language: PHP (php)

wordpress 필터에는 다음과 같은 내용이 들어갑니다.

[Definition]
failregex = ^<HOST> .* "(GET|POST) /wp-login.php
                  ^<HOST> .* "(GET|POST) /xmlrpc.phpCode language: PHP (php)

워드프레스 로그인 감시 옵션

그 다음에는 위에서 정의한 Fail2Ban 필터를 기반으로 워드프레스 로그인을 감시하고 조치할 옵션을 정의합니다.

이는 /etc/fail2ban/jail.d 폴더 내 적절한 이름 + .conf 형식으로 로그인 감시 옵션을 추가합니다. 별도 파일을 만들지 않고 local.conf와 같은 파일안에 모든 종류 옵션을 추가해도 좋을 것입니다.

nano /etc/fail2ban/jail.d/local.confCode language: PHP (php)

여기에 아래와 같은 내용을 주가합니다. 하루 24시간동안 3번 로그인 실패하면 IP를 영구 금지시키는 다소 엄격한 조건을 설정했습니다.

[wordpress]
enabled  = true
port     = http,https
filter   = wordpress
action   = iptables-multiport[name=wordpress, port="http,https", protocol=tcp], %(action_mw)s
logpath  = /var/log/nginx/access.log
maxretry = 3
findtime  = 86400
bantime  = -1Code language: PHP (php)

위 내용을 항목별로 해석해 보죠.

  1. enabled = true : 워드프레스를 모니터링하라는 옵션, 반드시 true로 설정되어야 모니터링을 시작함
  2. port = http,https : SSL이 적용된 443 포트나 일반 80 포트로 들어와서 시도되는 행동들을 모니터링
  3. filter = wordpress : 사용할 필터
  4. action = iptables-multiport : 문제를 감지 시 어떻게 할지는 iptables-multiport에서 정의한 대로 조치
  5. logpath = /var/log/nginx/access.log : Fail2B이 참조해야하는 로그 파일
  6. maxretry = 3 : 3번 이상 시도해서도 실패 시 조치를 취함
  7. findtime = 86400 : 로그인 실패등이 일어났는지 확인할 시간, 86400은 1일로 로그를 검색해 조치 여부 판단
  8. bantime = -1 : 조치를 지속하는 시간, -1은 무기한 금지

검색 봇 조치

구글 등의 검색 엔진의 봇들이 사이트를 돌아다니다 파일들을 테스트하면서 잘못해 구글 봇 ip가 블락될 가능성도 있기 때문에 robots.txt에 아래 내용을 추가해 줍니다.

User-agent: *
Disallow: /wp-login.php
Disallow: /xmlrpc.phpCode language: PHP (php)

Fail2Ban 설정 결과

위와같이 Fail2Ban 설정에 wordpress 옵션을 추가한 1일 후 아래처럼 264개 ip가 블럭당했음을 볼 수 있습니다.

# fail2ban-client status wordpress
Status for the jail: wordpress
|- Filter
|  |- Currently failed:	87
|  |- Total failed:	2282
|  `- File list:	/var/log/nginx/access.log
`- Actions
   |- Currently banned:	264
   |- Total banned:	264
   `- Banned IP list:	139.59.43.196 162.241.29.139 167.71.139.8 178.116.22.137 178.128.82.148 178.135.93.158 212.116.102.246 213.5.78.240 45.55.135.88 159.89.110.45 51.15.180.70 70.113.11.186 67.205.161.59 62.210.88.90 165.22.191.129 49.145.70.15 107.179.19.68 134.122.120.74 139.99.121.6 142.4.22.236 178.62.33.222 159.203.36.107 213.149.103.132 128.199.158.182 103.83.36.101 166.62.80.109Code language: PHP (php)

저의 경우 SSL 공격은 많지 않은데요. 아마 포트를 22번이 아닌 별도의 포트를 사용하기 때문이 아닐까 싶습니다. 워드프레스 로그인을 통한 공격이 굉장히 많다는 점에 놀랬습니다.

한때는 보안 플러그인 워드펜스(wordfence)를 같이 사용했는데요. 워드펜스에서 막는 것보다 Fail2Ban에서 막는 것이 훨씬 더 많더군요. 워드프레스 로그인 보안 관련해서는 Fail3Ban을 활용하는 것이 훨씬 낫다는 생각을 했습니다.

Fail2Ban 설정을 Iptables 방화벽과 연계 방법

그러면 이렇게 Fail2Ban 설정을 통해서 막았던 ip들을 Iptables 방화벽에게 알려주어 보다 근본적으로 서버 접근 자체를 막아버리는 방법에 대해서 살펴보도록 하겠습니다.

여기서 목적은 Fail2Ban에서 IP 금지 리스트에 등록되면 Iptables 방화벽에도 자동으로 등록, 방화벽에서 ip를 금지 시키도록 변경하고 나중에 Fail2Ban을 다시 설치해도 Block ip list를 활용할 수 있도록 만드는 것입니다.

아시다시피 Fail2Ban은 다시 시작하면 기존에 막았던 ip 리스트들은 전부 초기화됩니다. 그때부터 다시 ip를 관리하기 시작합니다.

이를 막기 위해서는 아래와 같이 Fail2Ban 액션을 추가합니다.

nano /etc/fail2ban/action.d/iptables-repeater.confCode language: PHP (php)

여기에 아래와 같은 내용을 추가합니다.

# Fail2Ban configuration file
# Author: WireFlare
# https://wireflare.com/blog/permanently-ban-repeat-offenders-with-fail2ban/

[Definition]
# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = iptables -N fail2ban-
               iptables -A fail2ban- -j RETURN
               iptables -I  -p  -j fail2ban-
               # Establish chain and blocks for saved IPs
               iptables -N fail2ban-ip-blocklist
               iptables -A fail2ban-ip-blocklist -j RETURN
               iptables -I  -p  -j fail2ban-ip-blocklist
               cat /etc/fail2ban/ip.blocklist. |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-ip-blocklist 1 -s $IP -j REJECT --reject-with icmp-port-unreachable; done

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D  -p  -j fail2ban-
              iptables -F fail2ban-
              iptables -X fail2ban-
              # Remove chain and blocks for saved IPs to prevent duplicates on service restart
              iptables -D  -p  -j fail2ban-ip-blocklist
              iptables -F fail2ban-ip-blocklist
              iptables -X fail2ban-ip-blocklist

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
 actioncheck = iptables -n -L  | grep -q 'fail2ban-[ \t]'

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = VERIFY="*"
             ADD="        # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): Perma-Banned"
             FILE=/etc/fail2ban/ip.blocklist.
             grep -q "$VERIFY" "$FILE" || iptables -I fail2ban-  1 -s  -j DROP
             grep -q "$VERIFY" "$FILE" || echo "$ADD" >> "$FILE"

# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionunban = # Do nothing becasuse their IP is in the blocklist file

# To manually unban from the ip blocklist file run this command:
# Be warned that if the ip is in log rotated files it must be whitelisted
#
# sed -i '/^/d' /etc/fail2ban/ip.blocklist.repeatoffender
#

[Init]
# Default name of the chain
#
name = default

# Option:  protocol
# Notes.:  internally used by config reader for interpolations.
# Values:  [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp

# Option:  chain
# Notes    specifies the iptables chain to which the fail2ban rules should be
# added
# Values:  STRING  Default: INPUT
chain = INPUTCode language: PHP (php)

이러한 설정을 적용하려면 Fail2Ban을 다시 시작합니다.

sudo service fail2ban restartCode language: PHP (php)

[참고] 이메일로 받아보기

Fail2Ban에서는 사이트 공격으로 IP가 블락되면 이를 이메일로 알려주라고 설정할 수 있습니다.

이를 위해서는 두가지 조치가 필요합니다. 하나는 어떤 이벤트가 발생 시 이메일로 알려다오라고 설정하는 것이고, Fail2Ban에게 이메일 주소를 알려주어야겠죠.

물론 서버에서 외부로 메일을 보낼 수 있는 상태가 되어 있어야 합니다. 이는 구글 지메일 이용 우분투 메일 서버 구축하기라는 포스팅을 참조해 보시기 바랍니다.

먼저 action에서 %(action_mw)s를 추가하는 것인데요. [DEFAULT] 섹션에서 추가할 수도 있고 [wordpress]와 같은 특정 필터를 커스텀 정의하는 섹션에서 추가할 수도 있습니다.

마찬가지로 메일 주소를 destemail과 sender로 나누어 이메일 주소를 세팅해 줄 수 있습니다. 아래는 제가 세팅한 모습니다.

[DEFAULT]
ignoreip  = ***.***.***.*** ***.***.***.*** ***.***.***.*** 
bantime   = -1
findtime  = 86400
maxretry  = 5

action = %(action_mw)s

# Mail
destemail = *****@gmail.com
sender    = YYYYY@gmail.comCode language: PHP (php)

그러면 IP가 블럭되었을 때마다 아래와 같은 이메일을 받을 수 있습니다. 이메일을 받으면 별도 조치는 할 수는 없지만 경각심을 가질 수 있겠죠.

Fail2Ban 설정, Fail2Ban IP 블락 후 이메일 알람

참고

해킹 시도 악성 IP 차단 리스트 관리 방법 – NGINX 기준

도쿄 리젼과 비교해 본 Vultr 서울 리젼 사용기

가성비가 뛰어난 Vultr 가상서버호스팅(클라우드호스팅,VPS) 사용기

Vultr 가상서버호스팅의 새상품 High Frequency 사용기

가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로

해외 가상서버호스팅(VPS)이 국내 호스팅보다 빠르다? – 아이비호스팅과 해외 가상서버호스팅 VULTR간 비교

사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.2)

워드프레스 최적화를 위한 18개월간의 고민, 그 노하우를 담다.

구글 지메일 이용 우분투 메일 서버 구축하기

0

가장 안정적인 구글 지메일 이용 우분투 메일 서버 구축이 가능하다면 스팸으로 분류될 가능성을 낮추고 안정적으로 메일 서버 운영이 가능해집니다. 여기서는 우분투 서버에서 구글 지메일 릴레이 서비스를 이용해 안정적인 발신 전용 메일 서버 구축 방법에 대해서 정리해 봅니다.

구글 지메일 릴레이 서비스는 일반 지메일을 활용하는 방법과 상업용인 G Suite를 이용하는 방법이 있습니다.

일반 지메일 이용방법은 하루에 발송할 수 있는 메일 수가 500개로 제한되어 있습니다. G Suite의 경우 하루 2,000개부터 옵션에 따라 달라지면 기본도 최대 10,000통까지는 보낼 수 있습니다.

여기서 소개하는 방식은 서버에서는 Postfix라는 오픈소스 MTA(mail transfer agent)로 구글 지메일과 연결해 구글 지메일에서 메일을 송부하도록 하는 방식을 소개하려고 합니다.

블로그를 운영하든 쇼핑몰을 운영하든 메일은 중요한 커뮤니케이션 도구입니다. 우리나라는 일찍부터 스마트폰 보급이 증가하고 기초적인 SMS나 카톡과 같은 소셜 미디어가 할발하게 사용되면서 상대적으로 이메일 사용이 낮은 편입니다.

그러다보니 처음 사이트 운영 시 이메일에 대해서 별 신경을 쓰지 않았습니다. 사이트에서 메일을 보내야겠다는 생각 또는 사이트 상황을 메일로 받아보면서 관리를 하겠다는 생각을 전혀 하지 못했습니다.

그러나 시간이 지나면서 워드프레스를 비롯한 CMS나 우분투 서버와 같은 시스템들은 메일을 통한 커뮤니케이션이 아주 자연스럽고 기본에 가깝다는 것을 알게 되었습니다.

사이트 운영을 제대로 하려면 메일에 의존하지 않으면 안된다는 것을 깨닫게 된 것이죠. 그래서 오늘은 우분투 서버에서 메일 발신 기능을 추가하는 방법을 살펴보도록 하겠습니다.

Postfix 설치

그동안 서버에서 메일 서버 구축을 위해서는 QMail이나 sendmail을 많이 사용했습니다. 지금도 우분투 서버 세팅을 설명하는 수많은 자료들을 보면 메일 서버로 sendmail 설치를 이야기하고 있습니다.

그러나 갈수록 보안이 중요시 되면서 인증 수준이 높아지고 고려 요소들이 높이지면서 Postfix를 많이 사용합니다. Postfix는 IBM Public License에서 공개한 오픈소스 MTA(mail transfer agent)입니다.

Postfix는 SASL(Simple Authentication and Security Layer)를 이용한 SMTP 인증을 지원해 간단하게 스팸들을 걸러낼 수 있다고 합니다.

Postfix 설치

설치전에 서버 상태를 최신으로 업데이트 및 업그레이드 합니다.

apt-get update
apt-get upgrade -yCode language: PHP (php)

Postfix에서 SMTP 인증을 위해서 Postfix 설치 시 libsasl 라이브러리를 함께 설치합니다.

apt-get install postfix mailutils libsasl2-2 ca-certificates libsasl2-modulesCode language: PHP (php)

Postfix가 설치되는 동안 Postfix Configuration 팝업이 뜨는데요. 여기서 Internet Site를 선택합니다.

그 다음에는 도메인 이름을 입력합니다. happist.com과 같은..

지메일 릴레이 기능을 이용하기 위한 Postfix용 앱 비밀번호 생성

메일 서버는 공격 받기 쉬운 시스템이기 때문에 서버에서 전용 메일 서버를 구축해 운영하는 것을 굉장히 비효율적입니다. 그래서 가능하면 단순 메일 발송 기능만 사용하거나 이 조차 외부 메일 서버를 이용해서 리스크를 분산시키는 것이 좋습니다.

메일을 서버에서 직접 보내지 않고 외부 메일 서버에 부탁해서 대신보내도록 하는 것을 릴레이라고 부르는데요. 구글 Gmail과 같은 전용 메일 서비스에서는 이런 릴레이 서비스를 제공하고 있습니다.

물론 무한 메일 발송을 지원하지는 않고 일 또는 월 발송 가능한 메일 수가 제한되어 있습니다. 일반 지메일 사용 시 일일 500개로 제한되어 있고 유료인 G Suite를 사용시 월 6$짜리 기본의 경우 일 2,000개 또는 10,000통이상을 보낼 수 있습니다.

여기서는 우리가 흔히 이용하는 Gmail을 이용해 메일을 릴레이해서 보내도록 하겠습니다. G Suite를 이용하는 방법에 대해서는 아래 글을 참조하시기 바랍니다.

[쇼핑몰 구축기] 안정적인 Gmail을 이용한 발신 전용 메일 서버 구축 방법

구글 Gmail 릴레이 기능을 이용하기 위해서는 Gmail에서 몇가지 설정을 통해서 Postfix용 앱 비밀번호를 얻어야 합니다.

구글드라이브 2단계 인증 사용

처음 지메일을 생성하면 기본적으로 2단계 인증은 사용하지 않토록 되어 있습니다. 그러나 점차 보안을 중시하고 구글도 2단계 인증을 기본 정책으로 세우기 시작했기 때문에 2단계 인증을 사용합니다.

예전에는 2단계 인증 사용하지 않고 보안 수준이 낮은 앱을 허용해 사용 가능했으나 구글에서 보안 이슈로 이를 불허하고 있습니다.

구글드라이브 2단계 인증을 사용하려면 전화번호가 있어야 합니다. 참고하시기 바랍니다.

  1. 구글 계정 – 보안으로 진입해 2단계 인증 사용으로 변경
  2. 전화번호 인증 코드 받기
    인증코드가 오면 G-다음에 오는 숫자만입력
  3. 정확히 인증코드를 입력하면 “완료되었습니다. 2단계 인증을 사용하도록 설정하시겠습니까?”라는 메세지가 나오는데 이 “사용”을 선택

구글드라이브 앱 비밀번호 생성

Postfix와 같이 2단계 인증을 지원하지 않는 기기는 별도 앱 비밀번호를 생성해 구글 Gmail에 접속할 수 있습니다.

  1. 위에서 구글드라이브 2단계 인증을 마치면 다시 보안 메인 화면으로 나옵니다.
  2. 그러면 이전에는 보이지 않았던 앱 비밀번호라는 메뉴가 2단계 인증 아래에 생겼음을 볼 수 있습니다.
  3. 앱 비밀번호를 눌러 이동합니다. 이때 사용자 확인을 위해 비밀번호를 요구합니다.
  4. 앱 비밀번호로 들어가면 앱 종류와 기기를 선택할 수 있습니다.
    여기서는 앱 종류에서 기타(맞춤이름)을 선택합니다.
  5. 그러면 앱이름을 입력 화면이 나오고 여기에 앱 이름을 입렵합니다.
    저는 postfix라고 입력했습니다.
  6. 입력하면 아래와 같은 식으로 앱 비밀번호가 생성 됨구글 지메일 이용 우분투 메일 서버 구축하기 3
  7. . 생성된 앱 비밀번호를 저장 후 다음 단계에서 활용

Postfix Setting

Postfix 설정 파일은 /etc/postfix/main.cf입니다.

이 파일을 열어서 Gmail을 활용해서 SMTP 릴레이(Relay)서비스가 가능토록 설정을 변경합니다.

nano /etc/postfix/main.cfCode language: PHP (php)

우선 릴레이호스트에는 G Suite를이용한다면 [smtp-relay.gmail.com]:587를 적용하고, 일반 Gmail을 이용한다면 [smtp.gmail.com]:587를 적용합니다.

relayhost = [smtp.gmail.com]:587Code language: PHP (php)

그리고 중간에 smtp_tls_security_level=may 항목이 있는데 뒤에 나오는 설정과 충돌하므로 앞에 #를 붙여 사용하지 않토록 합니다.

##smtp_tls_security_level=mayCode language: PHP (php)

그리고 마지막 부분에 아래 내용을 추가합니다.

# Enable SASL authentication
smtp_sasl_auth_enable = yes
# Disallow methods that allow anonymous authentication
smtp_sasl_security_options = noanonymous
# Location of sasl_passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
# Enable STARTTLS encryption
smtp_tls_security_level = encrypt
# Location of CA certificates
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crtCode language: PHP (php)

최종적으로는 이런 모습이 됩니다. sftp등으로 파일을 열어 수정한다면 전부 지우고 이를 복사해 붙여도 될 것 같네요.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
#smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = happist.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, fashionseoul.com, localhost.com, , localhost
relayhost = [smtp.gmail.com]:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# Enable SASL authentication
smtp_sasl_auth_enable = yes
# Disallow methods that allow anonymous authentication
smtp_sasl_security_options = noanonymous
# Location of sasl_passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
# Enable STARTTLS encryption
smtp_tls_security_level = encrypt
# Location of CA certificates
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
Code language: PHP (php)

Gmail 계정 설정

다음으로는 위 설정 중 smtp_sasl_password_maps에서 지정한 지정한 파일에 G Suite 또는 Gmail 계정에 접속 가능토록 사용자 및 비밀번호를 설정합니다.

위에서 설정한대로 /etc/postfix/sasl/sasl_passwd 파일을 열어 편집합니다.

nano /etc/postfix/sasl/sasl_passwdCode language: PHP (php)

일반 Gmail 이용하는 경우 아래와 같은 순서에 따라 정보를 입력합니다.

[smtp.gmail.com]:587 Gmail계정@gmail.com:(postfix용) 앱 비밀번호Code language: PHP (php)

해시 DB 생성

이 다음에는 postmap 명령어를 이용해 hash db를 만들어 줍니다.

sudo postmap /etc/postfix/sasl/sasl_passwdCode language: PHP (php)

이러면 /etc/postfix/sasl/ 폴더에는 sasl_passwd와 sasl_passwd.db 이름의 두개의 파일이 존재하게 됩니다.

권한 부여

이렇게 만들어진 sasl_passwd와 sasl_passwd.db에는 SMTP에 대한 매우 중요한 정보가 들어 있기 때문에 권한을 강화해 줍니다.

오직 root 사용자만 읽고 쓸 수 있도록 합니다. 아래 명령을 사용합니다.

chown root:root /etc/postfix/sasl/sasl_passwd /etc/postfix/sasl/sasl_passwd.db
chmod 0600 /etc/postfix/sasl/sasl_passwd /etc/postfix/sasl/sasl_passwd.dbCode language: PHP (php)

이렇게 설정이 완료되면 Postfix를 재가동시킵니다.

systemctl restart postfixCode language: PHP (php)

테스트

postfix를 이용한 Gmail 릴레이 설정이 끝났으면 제대로 메일이 발송되는지 테스트해 봅니다.

sendmail recipient@elsewhere.com
From: you@example.com
Subject: Test mail
This is a test email
.Code language: PHP (php)

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유

0

이상하게 CD 음반 판매가 증가하는 우리나라와는 달리 미국을 비롯한 다른 나라들은 여러 곡이 포함된 앨범 발매가 줄고 싱글 앨범 증가가 중요한 트렌드로 등장하고 있다고 합니다.

이는 스포티파이나 애플뮤직과 같은 뮤직 스트리밍 서비스의 확대로 이용자들이 원하는 곡만 듣기 때문이기도하고, 틱톡의 밈으로 바로 사용될 수 있는 음악들이 각광을 받으며 확산의 중요한 역활을 하기때문에 싱글로도 충분한 뮤직 문화가 만들어졌기 때문입니다.

앨범 판매가 증가하는 한국

먼저 차이점을 분명히 알기 위해 우리나라 상황을 간단히 정리해 보죠.

우리나라 음악계는 아이들 팬덤이 시장을 이끌면서 기존 상식을 뛰어넘는 상당히 독특한 현상을 많이 보여주고 있습니다.

그중 하나가 음악 앨범 판매의 증가인데요. 대부분 사람들는 뮤직 스트리밍 서비스들이 활성화되면서 전 세계적으로 음반 시장은 자연스럽게 쇠퇴하고 있습니다.

미국 음반산업협회 보고서에 따르면 미국의 CD 음반 판매는 2011년 2.4억장에서 2017년 8,760만장으로 90%넘게 감소했다고 합니다.

그러나 우리나라는 정 반대 현상이 나타나고 있습니다. 2011년 508만장이던 상위 100개 음반 판매량이 2017년에는 1,448만장으로 285% 증가했습니다.

이는 우리나라 음악계가 아이돌 팬덤 중심으로 운영되면서 팬덤들에게 어필하기 위해 여러곡이 포함된 앨범 중싱으로 발매하고, 여기에 각각 구성 및 음반 컨셉을 달리해서 (같은 음악을 담도 있지만) 여러 종의 앨범을 출시되면서 음반 판매를 극대화하고 음반 매출을 극대화하는 경향을 강화해 오고 있습니다.

그러다보니 우리나라에서는 싱글 앨범으로 출시하는 경우는 상대적으로 적은 편이라는 평가를 받고 있습니다.

뮤직 스트리밍으로 싱글 앨범 증가하는 미국

이러한 우리나라 트렌드와 정반대로 미국은 스포티파이, 애플뮤직과 같은 뮤직 스트리밍 서비스의 대중화 거기다가 틱톡이라는 젊은층에서 핫한 숏폼 비디오 앱이 확산되면서 싱글 앨범이 증가하고 여러곡을 함꺼번에 발매하는 앨범의 의미가 갈수록 희미해지고 있다고 합니다.

How music streaming and TikTok are fueling the rise of the Track 1 hit

쿼츠가 분석한 바에 따르면 2020년 스포티파이 Top 40에 포함된 곡중 50%가 싱글앨범이거나 발매 앨범의 첫번째 트랙 곡이었다고 합니다. 아래 보여주는 그래프에서 보여주듯이 트랙 1의 비중이 무려 48%에 달합니다.

스포티파이 데이타를 보면 점점 더 발매 앨범의 첫번째 곡(트랙 1)이 점점 사용자들의 관심을 받으며 표준으로 작용하고 있다는 것을 알 수 있습니다. 여기에는 싱글 앨범이 포함됩니다.

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유 4

이러한 데이타를 시계열로 살펴보면 스포티파이 Top 40 데이타를 처음 발표한 2017년에는 트랙 1의 비중은 40%정도에 불과했습니다. 그러나 그 수치는 2019년 5월부터 2020년 4월까지 1년간 데이타에서는 48.1에 달했습니다.

이 기간동안 트랙 2 ~ 트랙 4의 비중은 크게 감소했고 트랙 5이상 비중은 변동이 없었습니다.

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유 5
  • 사람들이 뮤직 스트리밍 서비스를 이용하면서 앨범의 중요성이 감소했습니다.
  • 사람들은 음악을 앨범 전체 묶음으로 구매, 감상하지 않고 자신이 좋아하는 노래만 골라서 듣습니다.
  • 이러한 경향으로 점점 더 많은 뮤지션들이 앨범보다는 싱글을 발매하고 있습니다.

아래 그래프는 스포티파이 Top 40에 포함된 싱글 앨범의 비중 추이를 보여주고 있는데요. 2017년에는 싱긍 앨범 비중이 30%이내 였지만점점 증가하는 트렌드를 보이면서 2020년에는 40%를 훌쩍 넘고 있습니다.

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유 6

이러한 싱글을 제외하면 앨범에서 첫번째 트랙은 큰 의미를 갖지 못합니다. 8곡이상을 수록한 앨범중에서 스포티파이 Top 40에 포함된 트랜 넘버추이를 살펴보니 트랜 순서에 따라 별 차이가 없습니다.

굳이 가장 높은 비중을 차지한 것은 2번째 곡이 15%로 수위를 차지하고 있습니다. 일반적으로 가수가 앨범을 발매 시 대표곡을 첫곡으로 내세우는 경향이 있지만 아무래도 가수와 대중과는 어느 정도 간격이 있나봅니다.

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유 7

틱톡은 싱글 앨범 증가 경향을 더욱 강화한다,

이러한 싱글 중심은 틱톡의 등장으로 더욱 강화되고 있다고 합니다. 쿼츠는 애리조나 제르바스의 “Roxanne”를 그 예로 들고 있는데요.

“Roxanne”는 틱톡 밈에 적극적으로 활용되면서 공전의 히트를 쳤고 몇달동안 스포티파이 정상을 차지했고 2019년 전체 2위를 차지하기에 이르렀습니다.

틱톡이 젊은층들에게 인기를 끌면서 틱톡의 숏폼 동영상에서 많이 사용될 수 있는 음악은 쉽게 바이럴되고 쉽게 인기를 끌 수 있는 구조가 되고 있습니다. 따라서 음악을 틱톡을 통해 먼저 유통해 바이럴을 일으키려는 시도가 늘고 있고 도 이러한 시도가 잘 먹히고 있습니다.

참고

스포티파이 CEO 인터뷰에서 읽는 스포티파이 전략 – 음악에서 라디오로

스포티파이와 틱톡이 바꾸는 뮤직 문화, 싱글 앨범 증가 이유

스포티파이가 팟캐스트 콘텐츠에 집중하는 이유 4가지

뮤직 스트리밍의 선두, 스포티파이 미래는 넷플릭스가 될 수 있을까?

애플 뮤직은 어떻게 기존 강자 스포티파이를 추격하고 있을까?

스포티파이는 어떻게 뮤직 스트리밍 시장을 장악했을까? 가치 제안, 쇼셜 미디어, 추천 Discover Weekly

스포티파이 실적 관련

기대에 못 미친 성장과 수익, 3분기 스포티파이 실적과 향후 스포티파이 전망

20년 2분기 스포티파이 실적, 코로나로 광고 감소는 매출과 이익을 제한하다.

포스트 코로나, ’20년 디지탈 광고 정체 속 첫 구글 광고 감소를 경험할 듯

코로나 팬데믹으로 미국 경제가 침체되면서 광고 산업도 큰 영향을 받고 있습니다. 이마케터는 20년 구글 광고는 사상 첫 마이너스 성장하고, 페이스북은 성장세가 둔화되며 아마존 상품 검색 광고 증가로 여전히 높은 성장을 이어갈 것으로 전망했습니다.

이러한 이마케터 전망은 그동안 디지탈광고는 이커머스의 급속한 확산과 경제플랫폼이 인터넷 중심으로 재편되면서 하늘 높은 줄 모르고 성장에 성장을 거듭해 왔던 디자탈 광고가 코로나 팬데믹으로 새로운 변화를 맞고 있다는 것을 시사합니다.

그것은 그동안 거침없이 성장해온 디지탈광고도 무차별적인 성장 시대를 마치고 분야별로 성장 속도가 크게 분화되는 다변화 시대가 왔다는 것입니다.

그동안 구글이 강점을 가지고 있었던 검색광고나 일반 인터넷 광고는 성장이 멈추거나 감소하는 추세를 보이고, 소셜 미디어 관련 광고들은 여전히 성장하지만 성장세가 둔화되고 있으며 아마존으로 대표되는 쇼핑 광고는 여전히 성장을 거듭하고 있습니다.

이러한 트렌드에 따라 구글은 광고 매출이 사상 처음으로 전년 비 감소할 것으로 전망되고 있습니다. 소셜 미디어 광고가 강한 페이스북은 성장세가 둔화될 예정이고, 아마존닷컴을 통한 상품 검색 광고에 집중하는 아마존 광고 매출은 여전히 높은 성장을 이어갈 전망입니다.

미국 및 세계 경제 전망은 부정적

OECD는 지난 6월 4일 세계 경제 전망을 통해서 미국 경제 성장률을 -7.3% 역성장할 것으로 전망했습니다. 또한 6월말에 발표한 IMF 세계경제전망에서도 2020년 미국 경제 성장률을 -8%로 부정적으로 전망했습니다.

아래표는 OECD가 발표한 주요 국가들의 2020년 및 2021년 경제 전망치입니다. 널리 알려졌듯이 중국이나 인도네시아등도 역성장을 면지 못할 것이며 가장 양호하다고 평가받은 한국도 -1.2%로 역성장이 예상되었습니다.

OECD 주요 국가별 2020년 및 2021년성장율 전망, Data from OECD, Graph by Happist
OECD 주요 국가별 2020년 및 2021년성장율 전망, Data from OECD, Graph by Happist

디지탈 광고 전망도 부정적 – 구글 첫 마이너스 성장

아무튼 이렇게 미국 경제 역성장이 전망되면서 미국 광고 전망도 한층 부정적으로 변해가고 있는데요.

이마케터는 미국 경제가 마이너스 성장을 이어가고 유통 매출도 -10% 역성장이 예상되면서 그동안 승승장구했던 디지탈 광고도 전년 비 1.7% 성장한 1,346.6억 달러에 그쳐 거의 정체 수준에 머물 것으로 전망했습니다.(이러니 오프라인 광고는 얼마나 감소할까요?

특히 구글 광고 매출은 사상 처음으로 마이너스 성장이 예상되고 있습니다. 구글은 디지탈 광고가 빠르게 성장하는 가운데 2016년부터 광고 매출 성장률이 눋화되어 왔으며, 이번 코로나 팬데믹 영향으로 그 감소폭이 더 커졌습니다.

  • 구글 광고 매출은 2019년 418억 달러에서 2020년 395억 달러로 전년 비 -5.3% 감소 전망(2019년 성장률은 14.6%)
    이에 따라 디지탈 광고 점유율도 31.6%에서 29.4%로 20%대로 하락 예상
  • 페이스북 광고 매출은 2019년 299.5억 달러에서 2020년 314.3억 달러로 전년 비 4.9% 성장 (2019년 성장률은 26.1%)
    페이스북 디지탈 광고 점유율은 22.7%에서 23.4%로 소폭 상승 예상
  • 아마존 광고 매출은 2019년 103.2억 달러에서 2020년 127.5억 달러로 전년 비 23.5% 성장 (2019년 성장률은 39.4%)
    아마존 디지탈 광고 점유율은 7.5%에서 9.5%로 상승 예상
포스트 코로나, '20년 디지탈 광고 정체 속 첫 구글 광고 감소를 경험할 듯 8

검색광고에서 격돌하는 구글과 아마존

검색광고에서 구글과 아마존은 오래전부터 격돌해왔습니다. 일반 검색엔진에서 검색 광고보다 아마존닷컴과 같은 쇼핑몰에서 광고 효과가 월등하게 좋기 때문에 아마존 광고는 어느 회사, 어느 부문보다도 빠르게 성장해 왔습니다.

아마존은 별도로 광고 사업부 매출을 공개하지 않기 때문에 대부분 광고 매출로 추정되는 Others 매출 추이로 추정하고 있는데요. 매 분기 40%이상씩 성장하고 있습니다.

아마존 디지탈 광고가 주를 이루는 기타 부문 분기별 매출 추이(2016년 1분기 ~ 2020년 1분기) Amazon digital ads, Graph by Happist
아마존 디지탈 광고가 주를 이루는 기타 부문 분기별 매출 추이(2016년 1분기 ~ 2020년 1분기) Amazon digital ads, Graph by Happist

사람들은 상품 구매 시 구글 검색보다는 아마존 검색을 우선시 할 정도로 아마존은 매력적인 광고 플랫폼으로 성장해 왔습니다.

이런 상황속에서 코로나 팬데믹은 트래픽은 증가하고 광고주들은 감소하면서 광고 단가가 하락하는 등 구글로서는 그리 유쾌하지 못한 상황에 처하게 되었습니다.

유튜브 광고가 빠른 속도로 증가하고 있지만 일반 사이트 및 검색 엔진에서 검색 광고 하락을 막지는 못하고 있습니다.

  • 구글 검색 광고는 2019년 342.8억 달러에서 2020년 318.1억 달러로 전년 비 -7.2% 역성장 전망
    이에 따라 구글 검색 광고 점유율도 61.3%에서 58.5%로 하락 예상
  • 아마존 검색 광고는 2019년 74.3억 달러에서 2020년 93.1억 달러로 전년 비 25.2% 성장 전망
    아마존의 검색 광고 점유률도 13,3%에서 17.1%로 상승 예상
포스트 코로나, '20년 디지탈 광고 정체 속 첫 구글 광고 감소를 경험할 듯 9

무료 리눅스 백신 ClamAV 이용 및 문제 해결법

0

리눅스 서버 사용자는 적지만 매우 중요한 데이타를 담고 있기 때문에 컴퓨터 바이러스나 멀웨어로부터 안전하게 보호할 수 있는 안전 장치가 필요합니다. 이를 위한 무료 리눅스 백신 중 가장 평가가 좋은 ClamAV 이용 방법에 대해서 알아보겠습니다.

바이러스는 사용자가 많을수록 많기 때문에 윈도우즈 사용 시 백신 설치가 아주 중요합니다. 컴퓨터 바이러스들이 기승을 부리면서 한때는 한 컴퓨터안에 여러가지 백신을 설치해 놓는 것이 유행이다시피 한적도 있습니다.

그러나 바이러스나 멀웨어라는 것이 특정 패턴을 가지고 있다보니 바이러스나 멀웨에에 대한 체계적인 데이타베이스를 가진 프로그램 하나면 충분하고 여러가지 백신 사용은 오히려 문제 발생 소지가 크다는 지적도 있기 때문에 요즘엔 윈도우즈10에서 기본 제공 프로그램을 일반적으로 사용합니다.

여러 유료 백신 프로그램들이 있지만 마이크로소프트에서 제공하는 기본 보안 프로그램도 나쁘지 않다는 평가가 많기 때문이죠.

상대적으로 사용자가 적은 리눅스 서버도 마찬가지입니다. 리눅스 서버는 상대적으로 이러한 바이러스 공격이 적다는 평가를 받아 왔습니다.

리룩스 취약점이 상대적으로 적고 사용자가 상대적으로 적기 때문에 바이러스로 이익을 얻을 수 있는 이익이 상대적으로 적기 때문일까요? 그럼에도 불구하고 이러한 공격이 상대적으로 적다는 것이지 없는 것은 아니므로 대비가 필요합니다.

그래서 우분투 서버에서 제반 바이러스 및 멀웨어를 탐지하고 스캔할 수 있는 솔류션으로 ClamAV를 선택하고 이를 활용하는 방업을 알아 보도록 하겠습니다.

리눅스 백신 ClamAV란?

ClamAV(Clam AntiVirus)는 시스코 시스템즈에서 지원하는 오픈소스 소프트웨어 기반 바이러스 검사 소프트웨어입니다. 오픈 소스에서 보듯 철저히 무료로 사용할 수 있습니다.

이는 유닉스뿐 아니라, AIX, BSD, HP-UX, 리눅스, OS X, 오픈VMS, OSF, 솔라리스 그리고 마이크로소프트 윈도우즈에서도 실행되는 크로스 플랫폼 소프트웨어로 알려져 있습니다.

원래는 메일 서버에서 이메일 내 바이러스 검사를 위해서 개발한 것인데 이후 바이러스를 비롯한 멀웨어 등 수많은 종류의 악성 소프트웨어를 찾아내는 소프트웨어로 발전했습니다.

ClamAV 데이타 센터는 ClamAV.net에 있는데 전 세계에서 발생하는 바이러스 구조에 대한 방대한 자료를 확보하고 있으며 주기적으로 업데이트 및 공개하고 있습니다.

위에서 설명했듯이 메일 검색에서 시작해서 그만큼 날리지가 쌓여서인지 메일 게이트웨이 검색 소프트웨어의 오픈 소스 표준으로 사용됩니다.

또한 무료 바이러스 백신 프로그앰으로 다른 유료 백신들과도 비교될 정도로 무료 백신으로서는 안정성과 인지도를 가지고 있습니다.

ClamAV 설치 및 이용 방법

우분투에서 ClamAV 설치는 아주 간단합니다. 예전에는 복잡한 과정을 거쳤는데 지금은 apt-get 명령으로 간단히 실행할 수 있습니다.

sudo apt-get install clamavCode language: PHP (php)

그러면 아래와 같은 메세지가 나오면서 설치되기 시작합니다.

~# apt-get install clamav
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  clamav-base clamav-freshclam libclamav9 libtfm1
Suggested packages:
  clamav-docs libclamunrar9
The following NEW packages will be installed:
  clamav clamav-base clamav-freshclam libclamav9 libtfm1
0 upgraded, 5 newly installed, 0 to remove and 3 not upgraded.
Need to get 1,133 kB of archives.
After this operation, 3,915 kB of additional disk space will be used.
Do you want to continue? [Y/n] YCode language: PHP (php)

다음으로는 바이러스 데이타베이스 업데이트를 실시합니다.

sudo freshclamCode language: PHP (php)

바이러스 검사는 clamscan 명령을 사용합니다.
가본적인 명령 포맷은 아래와 같습니다.

sudo clamscan -r -i DIRECTORYCode language: PHP (php)

예를들어 home디렉토리의 하위디렉토리까지 검사한다면 아래 명령을 사용합니다. 옵션 -r은 하위 폴더까지 모두 검사한다는 것입니다.

clamscan -r /home  Code language: PHP (php)

위는 검사만 한 경우인데요. 검사 후 바이러스 감염 파일 발견 시 특정 폴더로 이동시키는 경우 아래 명령을 사용합니다.

검사 결과 바이러스 감염된 파일이 있으면 /virus 폴더로 강제 이동시키는 옵션입니다.

clamscan -r /home --move=/virus Code language: PHP (php)

바이러스 검사에는 많은 시간이 걸립니다. 저는 시간이 많이 걸려 검사 명령을 내리고는 잤습니다. 최소 2시간이상 걸리는 듯 하더군요.

검사가 모두 끝나면 아래와 같은 검사 요약을 출력해 줍니다.

----------- SCAN SUMMARY -----------
Known viruses: 7336539
Engine version: 0.102.3
Scanned directories: 58145
Scanned files: 478294
Infected files: 0
Total errors: 52481
Data scanned: 20653.49 MB
Data read: 57326.96 MB (ratio 0.36:1)
Time: 3070.948 sec (51 m 10 s)Code language: PHP (php)

ClamAV 바이러스 정의 업데이트 시 에러 해결

ClamAV는 기본적으로 사용자 id를 clamav를 사용합니다.

그런데 서버 hostname이 인증되지 않아서인지 설치도중 ‘clamav’라는 사용자가 없다는 메세지가 나오며 오랬동안 설치를 멈추는 현상이 발생합니다.

그리고 local host name이 인증되지 않았다는 메세지를 뿜어냅니다. 아래와 같은 메세지..

id: ‘clamav’: no such user
WARNING: local host name (etrend) is not qualified; see cf/README: WHO AM I?Code language: PHP (php)

시간이 지나면 나머지를 알아서 설치합니다. 그러나 데이타베이스를 업데이트하기 위해 freshclam 명령을 주면 에러 메세지를 보입니다.

~# sudo freshclam
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
ERROR: Initialization error!Code language: PHP (php)

이 경우 아래와 같은 명령어를 사용해서 문제를 해결합니다.

sudo lsof /var/log/clamav/freshclam.log 
sudo pkill -15 -x freshclam 
sudo /etc/init.d/clamav-freshclam stop  
sudo freshclam 
sudo /etc/init.d/clamav-freshclam startCode language: PHP (php)

크론탭에서 매일 자동 실행 명령 추가

그리고 이 프로그램은 서버에 상주하면서 실시간 모니터링하지 않기 때문에 주기적으로 실행시켜서 모니터링 비슷한 효과를 내는 것이 필요합니다.

리눅스에서는 이를 위한 크론 기능이 활성화 되어 있으니 이를 활용하면 아쉬운대로 사용할만 합니다.

우선 sh 파일을 만듭니다. 저는 바이러스 데이타베이스 업데이트하는 freshclam 명령이 잘 먹히지 않아서 매번 이를 해결하는 프로세스를 주가했습니다.

nano clamav.shCode language: PHP (php)

여기에 아래와 같은 내용을 추가합니다.

#!/bin/sh

# 바이러스 데이타베이스 업데이트
lsof /var/log/clamav/freshclam.log 
pkill -15 -x freshclam 
/etc/init.d/clamav-freshclam stop  
freshclam 
/etc/init.d/clamav-freshclam start

# ClamAV 검사 (1회/일)
clamscan -r /Code language: PHP (php)

그 다음에는 이 파일에 권한을 부여합니다.

chmod +x clamav.shCode language: PHP (php)

그 다음에는 크론에 이 파일 실행을 추가해야 겠죠?
이는 아시다시피 crontab -e 명령을 사용합니다.

crontab -eCode language: PHP (php)

크랜탭에서 아래 내용을 추가해 줍니다. 매일 새벽 4시 15분에 위에서 정의한 clamav.sh를 실행하라는 명령입니다.

15 04 * * * clamav.shCode language: PHP (php)

크론을 시작합니다.

service cron start Code language: PHP (php)

크론이 제대로 작동하는지 한번 확인해 봅니다.

service cron statusCode language: PHP (php)

그러면 아래와 같이 크론이 active되고 있다고 나오면 OK입니다.

# service cron status
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-06-22 23:06:34 KST; 2 days ago
       Docs: man:cron(8)
   Main PID: 823 (cron)
      Tasks: 1 (limit: 4620)
     Memory: 600.9M
     CGroup: /system.slice/cron.service
             └─823 /usr/sbin/cron -fCode language: PHP (php)

포스트 코로나, 20년 중국 유통 매출이 처음으로 미국 유통 매출을 능가할 전망

코로나 팬데믹으로 미국과 중국 유통 판매 성장률이 차이가 나면서 2020년엔 처음으로 중국 유통 매출 규모가 미국 유통 매출 규모를 능가할 것으로 전망이 나왔습니다.

마케팅 조사업체인 이마케터는 미국과 중국 경제 성장 및 소비 추세를 고려 시 2020년 중국 유통 매출은 5,072B$로 4,894$B에 그친 미국 유통 매출을 앞지를 것으로 전망했습니다.

  • 2019년 중국 유통 매출은 전년 비 7.9% 증가
    이는 미국과 중국간 경제 전쟁 여파로 상대적은 낮은 수준이었음
  • 2020년 중국 유통 매출은 코로나 팬데믹 영향으로 전년 비 -4% 역성장에 그칠 것으로 전망
  • 그러나 미국 유통 매출은 전년 비 -10.4% 역성장 할 것으로 전망
  • 이에 따라 2020년에는 중국 유통 매출이 미국 유통 매출을 앞서는 첫해가 될 전망
포스트 코로나, 20년 중국 유통 매출이 처음으로 미국 유통 매출을 능가할 전망 10

그러나 비록 2020년에는 코로나 팬데믹으로 미국 경제가 크게 하락하면서 유통 판매액 규모가 중국에 밀렸지만 경제 회복에 따라 2021년과 2022년에는 미국에 다시 중국을 앞지를 것으로 전망되었습니다.

그렇지만 중국 경제가 지속 빠르게 성장학 때문에 궁극적으로 유통 판매액도 2023년부터는 중국이 다시 앞설 것이며 계속 그 차리가 커질 것으로 전망됩니다.

참고로 이마케터는 위와 같은 맥락에서 코로나 팬데믹으로 미국 유통 판매가 전년 비 -10%이상 역성장할 것으로 전망했었습니다. 미국 리테일 및 이커머스 전망에 대해서는 이전에 공유했던 미국 이커머스 판매 및 비중 전망( ~ 23년)글을 참조하시기 바랍니다.

미국 연도별 리테일 판매 및 성장율 추이 및 향후 전망, Data from US Government & eMarketer, Graph by Happist
미국 연도별 리테일 판매 및 성장율 추이 및 향후 전망, Data from US Government & eMarketer, Graph by Happist

2030년이면 중국 경제규모가 미국을 능가할 가능성

2018년 기준 중국 인구는 13.93억명이고 미국 인구는 3.27억명으로 중국 인구 비 23%에 불과합니다.

그렇지만 1인당 GDP가 높기 때문에 미국 GDP가 월등히 높은 수준인데요. 2019년 IMF 자료에 따르면 중국 GDP는 14,200$B로 미국 GDP 21,200$B의 66.9% 수준입니다. 중국 경제가 빠르게 성장하면서 미국과 Gap을 빠르게 좁히고 있는 상황인데요.

최근 코로나 팬데믹은 이러한 미국과 중국간 차이가 획기적으로 줄어들면서 가까운 시일 내에 경제 규모가 역전될 가능성이 높아지고 있습니다.

며칠전 IMF가 발표한 2020년 및 2021년 세계 경제 전망에 따르면 2020년 미국은 -8% 역성장하고 중국은 1% 성장하는 것으로 전망되었습니다. 거기에다 2021년에는 미국은 4.5%로 반등하지만 중국은 8%로 월등히 높은 수준의 성장이 예상되었습니다,

이러한 코로나 팬데믹에 따른 경제 성장 차이 및 향후 평균 성장률을 고려하면 곧 미국 경제 규모와 중국 경제 규모가 역전될 가능성이 커 보입니다.

  • 2020년 미국은 -8% 역성장하고 중국은 1% 성장 시 GDP 차이는 73.5% 수준으로 줄어듬
  • 2021년 미국은 4.5% 성장 및 중국 8% 성장 시 차이는 77.9%로 줄어 듬
  • 2022년 이후 미국 경제가 매년 2.5% 성장하고 중국 경제가 매년 6% 성장 시 2030년엔 중국 GDP가 미국을 역전
    만약 중국 성장률이 둔화되어 매년 4.5% 정도 성장한다면 2036년에야 미국을 앞설 것으로 전망
    만약 5%라면 2033년에 역전
  • 개인적으로는 중국 경제규모가 있기 때문에 매년 고성장을 구할 수는 없을 것이고 연평균 4%정도로 보는 것이 적절하다고 판단
    중국 경제가 4%씩 성장하고 미국이 2.5%씩 성장한다면 2040년에야 경제 규모가 역전

이렇게보면 언제인지는 모르지만 가까운 시일내에 중국 경제가 미국 경제를 앞서는 것이 당연한 것이 되는 것인지 모르겠네요.