2023. 8. 7. 12:18ใSystem ์์ ์ค/LINUX
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ Shell Script๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ ์ ์ ์ฌ์ฉ์ ์ ๋ณด ๋์ค์ฝ๋์ ๋ณด๋ด๊ธฐ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
ํ์ฌ ์ฃผ๋๊ฐ ์ฐธ์ฌํ๊ณ ์๋ IT Project ๋ชจ์์์ ์ฌ์ฉํ๋ ์๋ฒ์ ์ฌ์ฉ์๊ฐ ์ ์ํ ์ผ์ด ๋ง๊ณ , ์ด์ ๋ฐ๋ผ ๋ณด์์ ์ํด ๋ชจ๋ํฐ๋ง์ ํด์ผ ํ๋๋ฐ, ์๋ฒ์ ์ ์ํ์ฌ ๋ก๊ทธ ๋ถ์ ํ๋ ๋ฐฉ๋ฒ ์ธ์๋ ํ์ฌ ๋ฑํ ์ด์ํ๊ณ ์๋ ์๋ฃจ์
์ด ์๋ ์ํ์์.
๋ชจ์์์ ์ฌ์ฉ์ค์ธ ๋์ค์ฝ๋์ ์๋ฒ์ ์ ์์ Access(์ ์) ID, User(์ฌ์ฉ์) IP, Server Hostname(์๋ฒ ํธ์คํธ๋ค์), Server IP(์๋ฒ IP) ์ ๋ณด๋ฅผ ๋ฐ์ผ๋ฉด ๋ณด๋ค ๊ด๋ฆฌํ๊ธฐ ํธํ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๊ณ , ์ด๋ฅผ ๊ตฌํํด ๋ณด๋ ค๊ณ ํด์.
๋์ OS๋ Ubuntu Linux 22.04 LTS ์ด๊ณ , Shell Script(์ ์คํฌ๋ฆฝํธ)์ Discord Webhook(๋์ค์ฝ๋ ์นํ
)์ ์ด์ฉํ์ฌ ๊ตฌ์ฑํด ๋ณด๋๋ก ํ ๊ฒ์.
๐ฝ ๋์ค์ฝ๋ ์นํ
๐ฆ ์ค์
์ต์ด ์๋ฆผ ๋ฐ์ ๋์ค์ฝ๋ ์ฑ๋์ ์ค๋นํ๊ณ , ํด๋น ์ฑ๋์ ์นํ
URL์ ๋ฐ์ผ ํด์.
์์ ๊ฐ์ด ์นํ
์ ๋ง๋ค๊ณ , ํด๋น ์นํ
URL์ ๋ณต์ฌํ์ฌ ์ ์ฅํด ์ค๋๋ค.
๐ฝ ๋ฆฌ๋ ์ค ์์
๐ฆ ์ ์คํฌ๋ฆฝํธ ๋ง๋ค๊ธฐ
์ด๋ฒ์๋ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ์ํ๋ ์ ๋ณด๋ฅผ ํ์ฑํ์ฌ ์นํ
์ ๋ณด๋ผ ์ ์๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ๋ณผ๊ฑฐ์์.
ํด๋น ์ ์คํฌ๋ฆฝํธ๋ /etc/profile.d์ ๋ง๋ค์ด ์ฃผ๋๋ฐ, ์ต์ด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๊ฒ ๋๋ฉด Login shell(๋ก๊ทธ์ธ ์)๋ก ๋์ํ๊ฒ ๋์. ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ์์ bash์ด๊ณ , ๋ก๊ทธ์ธ ์๋ก ๋์ํ ๋, profile์ ์ฝ๊ฒ ๋์ด ์์ด์.
/etc/profile์ /etc/profile.d Directory(๋๋ ํฐ๋ฆฌ) ์์ ์กด์ฌํ๋ ๋ชจ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ฃผ๋ ์น๊ตฌ์์.
/etc/profile.d๋ vim, qt, lang, colors ๋ฑ ๋ค์ํ ์ค์ ์ด sh File(์ ํ์ผ) ํํ๋ก ์กด์ฌํ๊ณ , ์ต์ด ๋ก๊ทธ์ธ ์ /etc/profile์ ํตํด ์คํ๋๊ฒ ๋๋ต๋๋ค.
๊ทธ๋์ ๋ก๊ทธ์ธ์ ํ๊ฒ ๋๋ฉด /etc/profile์ ๋จผ์ ์ฝ๊ณ , ์ด ํ ํด๋น ๊ณ์ ์ ํ ๋๋ ํฐ๋ฆฌ์ ~./profile์ ์ฝ๊ฒ ๋์ํด์.
๊ทธ๋์ /etc/profile.d์ ์ฃผ๋๊ฐ ๋ง๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๊ฒ ํ์ฌ ์ ์ญ์ ์ผ๋ก ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๊ฒ ๋๋ฉด ๋์ํ ์ ์๋๋ก ํ๊ธฐ ์ํด ํด๋น ๋๋ ํฐ๋ฆฌ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํ๋ ๊ฑฐ์์.
#!/bin/bash
set -e
DISCORD_WEBHOOK_URL="๋์ค์ฝ๋ ์นํ
URL"
USER_IP=$(echo $SSH_CONNECTION | cut -d " " -f 1)
USER=$(who | grep "$USER_IP" | awk '{print $1}' | sort | uniq)
HOSTNAME=$(hostname)
SERVER_IP=$(hostname -I | awk '{print $1}')
ACCESS_DATE=$(date +"%Y-%m-%d %T")
LOG_DIR="/var/log/discord/webhook/accessAlarm"
LOG_FILE="${LOG_DIR}/${ACCESS_DATE}_sshAccessAlarm.log"
if [ -d "$LOG_DIR" ];
then
echo "[$ACCESS_DATE] Directory๊ฐ ์กด์ฌ ํฉ๋๋ค" >> "$LOG_FILE" 2>&1
else
mkdir -p $LOG_DIR
if [ $? != 0 ];
then
echo "[$ACCESS_DATE] Log ์ ์ฅ์ ์ํ Directory ๋ง๋ค๊ธฐ ์คํจ ํ์์ต๋๋ค."
exit 1
else
echo "[$ACCESS_DATE] Directory๊ฐ ์กด์ฌ ํ์ง ์์ ์์ฑ ํ์์ต๋๋ค." >> "$LOG_FILE" 2>&1
fi
fi
echo "User ์ ๋ณด: $USER" >> "$LOG_FILE" 2>&1
if [ -n "$USER" ];
then
TITLE="$ACCESS_DATE ์ฌ์ฉ์ SSH ์ ์ ํ์ธ!"
MESSAGE="SSH ์ ์ ์ ๋ณด ์๋ฆผ \n ์ ์์: $USER, ์ ์์ IP ์ฃผ์: $USER_IP \n ์ ์ ๋์ ์๋ฒ: $HOSTNAME, ์ ์ ๋์ ์๋ฒ IP: $SERVER_IP"
echo "[$ACCESS_DATE] SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ๋ง๋ค๊ธฐ ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
else
TITLE="$ACCESS_DATE ์ฌ์ฉ์ SSH ์ ์ ํด์ ํ์ธ!"
MESSAGE="SSH ์ ์ ํด์ ์ ๋ณด ์๋ฆผ \n ์ฌ์ฉ์: $USER, ์ฌ์ฉ์ IP ์ฃผ์: $USER_IP \n ์ ์ ๋์ ์๋ฒ: $HOSTNAME, ์ ์ ๋์ ์๋ฒ IP: $SERVER_IP"
echo "[$ACCESS_DATE] SSH ์ ์ ํด์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ๋ง๋ค๊ธฐ ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
# curl์ ์ด์ฉํ์ฌ ๋์ค์ฝ๋ ์นํ
๋ฉ์์ง ์ ์ก
curl -H "Content-Type: application/json" -d "{\"username\":\"๋ด๋ถ ์๋ฒ ์ ์ ์ ๋ณด ์๋ฆผ๋ด\",\"embeds\":[{\"title\":\"$TITLE\",\"description\":\"$MESSAGE\"}]}" "$DISCORD_WEBHOOK_URL"
if [ $? != 0 ];
then
echo "[$ACCESS_DATE]Discord๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์คํจํ์์ด์." >> "$LOG_FILE" 2>&1
else
echo "[$ACCESS_DATE]Discord๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
3๋ฒ์งธ ์ค์ ์์์ ๋์ค์ฝ๋ ์นํ
URL์ ์ป์ ๊ฒ์ ๋ณต์ฌํ์ฌ ๋ฃ์ด์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ , ์ ์ ์ฌ์ฉ์ IP ์ฃผ์๋ฅผ ํ์ฑํ๊ธฐ ์ํด ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฃผ์๋๋ฐ, ์ฌ๊ธฐ์ $SSH_CONNECTION์ Unix ๋ฐ Unix-like ์์คํ
์์ ํ๊ฒฝ ๋ณ์๋ก ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก SSH ์ฐ๊ฒฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ๊ณ ์์ด์. ์ด ๋ณ์๋ SSH Session(์ธ์
)์ ์์ํ Client(ํด๋ผ์ด์ธํธ) ๋ฐ ์๋ฒ ๊ฐ์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ด์.
์ฃผ์ ์ ์คํฌ๋ฆฝํธ๋ ๋ช
๋ น์ด์์ ์ฌ์ฉ๋๊ณ , SSH ์ฐ๊ฒฐ์ ํด๋ผ์ด์ธํธ IP ์ฃผ์, ํด๋ผ์ด์ธํธ Port(ํฌํธ), ์๋ฒ IP ์ฃผ์, ์๋ฒ ํฌํธ๋ฑ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ด์.
ํด๋น ๋ณ์์ ํ์์ ๋ค์๊ณผ ๊ฐ์์.
ํด๋ผ์ด์ธํธIP์ฃผ์ ํด๋ผ์ด์ธํธํฌํธ๋ฒํธ ์๋ฒIP์ฃผ์ ์๋ฒํฌํธ
๊ทธ๋์ awk๋ฅผ ํตํด ์ฒซ๋ฒ์งธ ์ด์ ์๋ ํด๋ผ์ด์ธํธ IP์ฃผ์ ๊ฐ์ USER_IP ๋ณ์์ ๋ด์ ์ฃผ์์ด์.
12 ~ 25๋ฒ์งธ ์ค์ Log(๋ก๊ทธ)๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด ๋ก๊ทธ ๋๋ ํฐ๋ฆฌ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ถ๋ถ์ด์์.
์ด ๋ถ๋ถ์ ๋ํด์๋ ์ด ๊ณณ์ ์ข ๋ ์์ธํ ์ ๋ฆฌํด ๋์์ด์.
31 ~ 42๋ฒ์งธ ์ค๊น์ง๋ ์ ์ ์ด์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ , ๋์ค์ฝ๋ ๋ฉ์์ง๋ก ๋ณด๋ผ ๋ฌธ์์ด์ ์ค๋นํ๋ ๋ถ๋ถ์ด์์.
31๋ฒ์งธ ๋ถ๊ธฐ๋ฌธ์ ํตํด USER ๋ณ์์ ๊ฐ์ด ๋น์ด์๋์ง๋ฅผ ํ์ธํด ์ฃผ๊ณ , ๋น์ด์์ง ์๋ค๋ฉด then ์ ์ ํตํด SSH ์ ์์ ํ๋ค๋ ๊ฒ์ ๋ํ ๋ฉ์์ง๋ฅผ ๋ง๋ค๊ณ , ๋น์ด์๋ค๋ฉด ์ ์ ํด์ ๋ฅผ ํ๋ค๋ ๊ฒ์ ๋ํ ๋ฉ์์ง๋ฅผ ๋ง๋ค๊ฒ ํด ์ฃผ์์ด์.
์ด ๋ถ๋ถ์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ๋์ค์ฝ๋ ์นํ
์ ์ด์ฉํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ถ์ด์์.
curl ๋ช
๋ น์ด๋ฅผ ํตํด HTTP๋ก ์ค๋น๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๋๋ก ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค 49๋ฒ์งธ ์ค์ ๋ช
๋ น์ด ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋๋ก ํด ์ฃผ์์ด์.
๐ฝ ํ์ธํ๊ธฐ
๐ฆ SSH ์ ์
๊ทธ๋ผ ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์๋ํ๋์ง ํ์ธํด ๋ณผ๊ฒ์.
์ด๋ ๊ฒ ์์ ๊ฐ์ด ๋ฉ์์ง๊ฐ ์ ์์ ์ผ๋ก ์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
================================ ์ ์ ์ฌ ํญ ================================
์์ ๊ฐ์ด ์ฌ์ฉํ๋ ค๊ณ ํ์์ง๋ง, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ด์.
ํน์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๊ฒ ๋๋ฉด SSH๊ฐ ํ๊ฒจ ๋ฒ๋ฆฌ๋ ํ์์ด์์.
ํนํ ๋์ปค ๊ด๋ จ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด SSH๊ฐ ํ๊ฒจ ๋ฒ๋ฆฌ๋ ๋ฐ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ๊ฒ ๋์ด ๋ค์ ์์ ํฉ๋๋ค.
#!/bin/bash
set -e
DISCORD_WEBHOOK_URL="{Discord Web Hook URL}"
USER_IP=$PAM_RHOST
USER=$PAM_USER
USERNAME=$(grep $USER /etc/passwd | cut -d':' -f5)
HOSTNAME=$(hostname)
SERVER_IP=$(hostname -I | awk '{print $1}')
SERVER_OS_INFO=$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)
ACCESS_DATE=$(date +"%Y-%m-%d %T")
LOG_DIR="/var/log/discord/webhook/accessAlarm"
LOG_FILE="${LOG_DIR}/${ACCESS_DATE}_sshAccessAlarm.log"
FOOTER="Giggal People Chat Ops use Discordโ 2023. \n ๊ธฐ๊น๋๋ ์ฌ๋๋ค(giggals.pepole@gmail.com) \n Creater: ์ฃผ๋ํ๋(junyharang8592@gamil.com) \n All Rights Reserved. \n Blog : <https://giggal-people.tistory.com>"
TOTAL_BACK_OFFICE_API_URL="http://{API URL}"
if [ -d "$LOG_DIR" ];
then
echo "[$ACCESS_DATE] Directory๊ฐ ์กด์ฌ ํฉ๋๋ค" >> "$LOG_FILE" 2>&1
else
mkdir -p $LOG_DIR
if [ $? != 0 ];
then
echo "[$ACCESS_DATE] Log ์ ์ฅ์ ์ํ Directory ๋ง๋ค๊ธฐ ์คํจ ํ์์ต๋๋ค."
exit 1
else
echo "[$ACCESS_DATE] Directory๊ฐ ์กด์ฌ ํ์ง ์์ ์์ฑ ํ์์ต๋๋ค." >> "$LOG_FILE" 2>&1
fi
fi
# ์ฌ์ฉ์๊ฐ SSH ์ ์
if [ "$PAM_TYPE" != "close_session" ];
then
TITLE="$ACCESS_DATE ์ฌ์ฉ์ SSH ์ ์ ํ์ธ!"
MESSAGE="SSH ์ ์ ์ ๋ณด ์๋ฆผ \n\n ==== ์ ์ ์ฌ์ฉ์ ์ ๋ณด ==== \n ์ ์์ ๊ณ์ : $USER \n ์ ์์ IP ์ฃผ์: $USER_IP \n ์ >์์ ์ด๋ฆ: $USERNAME \n\n ==== ์ ์ ๋์ ์๋ฒ ์ ๋ณด ==== \n ์ ์ ๋์ ์๋ฒ OS ์ ๋ณด : $SERVER_OS_INFO \n ์ ์ ๋์ ์๋ฒ: $HOSTNAME \n ์ ์ ๋์ ์๋ฒ IP: $SERVER_IP"
COLOR=16711680 # ๋นจ๊ฐ์
accessWhether="1"
echo "[$ACCESS_DATE] SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ๋ง๋ค๊ธฐ ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
# ์ฌ์ฉ์๊ฐ SSH ์ ์ ํด์ ์
if [ "$PAM_TYPE" == "close_session" ];
then
TITLE="$ACCESS_DATE ์ฌ์ฉ์ SSH ์ ์ ํด์ ํ์ธ!"
MESSAGE="SSH ์ ์ ํด์ ์ ๋ณด ์๋ฆผ \n\n ==== ์ ์ ํด์ ์ฌ์ฉ์ ์ ๋ณด ==== \n ์ ์์ ๊ณ์ : $USER \n ์ ์์ IP ์ฃผ์: $USER_IP \n ์ ์์ ์ด๋ฆ: $USERNAME \n\n ==== ์ ์ ํด์ ๋์ ์๋ฒ ์ ๋ณด ==== \n ์ ์ ๋์ ์๋ฒ OS ์ ๋ณด : $SERVER_OS_INFO \n ์ ์ ๋์ ์๋ฒ: $HOSTNAME \n ์ ์ ๋์ ์๋ฒ IP: $SERVER_IP"
COLOR=65280 # ํ๊ด ๋
น์
accessWhether="0"
echo "[$ACCESS_DATE] SSH ์ ์ ํด์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ๋ง๋ค๊ธฐ ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
# curl์ ์ด์ฉํ์ฌ ๋์ค์ฝ๋ ์นํ
๋ฉ์์ง ์ ์ก
echo "[$ACCESS_DATE] Discord๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์์
์ ์์ ํฉ๋๋ค." >> "$LOG_FILE" 2>&1
curl -H "Content-Type: application/json" -d "{
\"username\":\"๋ด๋ถ ํ
์คํธ ์๋ฒ ์ ์ ์ ๋ณด ์๋ฆผ๋ด\",
\"content\":\"$FOOTER\",
\"embeds\":[{
\"title\":\"$TITLE\",
\"description\":\"$MESSAGE\",
\"color\":$COLOR}]
}" "$DISCORD_WEBHOOK_URL"
if [ $? != 0 ];
then
echo "[$ACCESS_DATE] Discord๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์คํจํ์์ด์." >> "$LOG_FILE" 2>&1
else
echo "[$ACCESS_DATE] Discord๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
# curl์ ์ด์ฉํ์ฌ API์ ๋ด์ฉ ์ ์ก
echo "[$ACCESS_DATE] API๋ก SSH ์ ์ ์ ๋ณด ์๋ฆผ ๋ฉ์์ง ์ ์ก ์์
์ ์์ ํฉ๋๋ค." >> "$LOG_FILE" 2>&1
curl -X "POST" "$TOTAL_BACK_OFFICE_API_URL" \
-H "accept: */*" \
-H "Content-Type: application/json" \
-d "{\"inputAccessWhether\": \"$accessWhether\",
\"accessDateTime\": \"$ACCESS_DATE\",
\"accessCrewId\": \"$USER\",
\"accessCrewIp\": \"$USER_IP\",
\"actualityServerOsInfo\": \"$SERVER_OS_INFO\",
\"actualityServerHostName\": \"$HOSTNAME\",
\"actualityServerIp\": \"$SERVER_IP\"
}"
if [ $? != 0 ];
then
echo "[$ACCESS_DATE]ํตํฉ ๋ฐฑ ์คํผ์ค API๋ก SSH ์ ์ ์ ๋ณด ์ ์ก ์คํจํ์์ด์." >> "$LOG_FILE" 2>&1
else
echo "[$ACCESS_DATE]ํตํฉ ๋ฐฑ ์คํผ์ค API๋ก SSH ์ ์ ์ ๋ณด ์ ์ก ์ฑ๊ณตํ์์ด์." >> "$LOG_FILE" 2>&1
fi
echo "[$ACCESS_DATE] ==== ์ ์ ๋๋ ์ ์ ํด์ ์ฌ์ฉ์ ์ ๋ณด ====" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ์ ์์ ๊ณ์ : $USER" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ์ ์์ IP ์ฃผ์: $USER_IP" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ์ ์์ ์ด๋ฆ: $USERNAME" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ==== ์ ์ ๋๋ ์ ์ ํด์ ๋์ ์๋ฒ ์ ๋ณด ====" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ์ ์ ๋์ ์๋ฒ: $HOSTNAME" >> "$LOG_FILE" 2>&1
echo "[$ACCESS_DATE] ์ ์ ๋์ ์๋ฒ IP: $SERVER_IP" >> "$LOG_FILE" 2>&1
์ต์ด ์ ์คํฌ๋ฆฝํธ๋ ์์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋์์ด์.
์ฆ, PAM์ ์ด์ฉํ์ฌ Discord์ Web Hook์ ์ ์กํ ์ ์๊ฒ ํด ์ฃผ์์ด์.
์ ์ ์คํฌ๋ฆฝํธ๋ฅผ /etc/ssh ๋๋ ํฐ๋ฆฌ์ ์์นํ ๋ค ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ค๋๋ค.
# ์ ์คํฌ๋ฆฝํธ ์คํ ๊ถํ ๋ถ์ฌ
chmod +x /etc/ssh/userAccessDiscordAlarm.sh
# /etc/pam.d/sshd์ ์ ์คํฌ๋ฆฝํธ ๊ด๋ จ ์ค์
echo "session optional pam_exec.so seteuid /etc/ssh/userAccessDiscordAlarm.sh" >> /etc/pam.d/sshd
์์ ๊ฐ์ด ์ ์์ ์ผ๋ก ์๋ฆผ์ด ์ค๋๊ฑธ ํ์ธํ ์ ์์ด์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."