Setting a random password for guest wifi - XIYO/asuswrt-merlin.ng-kr GitHub Wiki

저희 큰 λ”Έμ—κ²Œ 게슀트 μ™€μ΄νŒŒμ΄λ₯Ό μ‚¬μš©ν•˜κ²Œ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ…€κ°€ μ§‘μ•ˆμΌμ„ ν•˜μ§€ μ•ŠμœΌλ©΄ κ·Έλ‚ μ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ•Œλ €μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

맀일 μˆ˜λ™μœΌλ‘œ μ μ ˆν•œ λ¬΄μž‘μœ„ λΉ„λ°€λ²ˆν˜Έλ₯Ό μƒμ„±ν•˜λŠ” λŒ€μ‹ , μžλ™μœΌλ‘œ μ„€μ •λ˜κ³  μƒμ„±λœ 랜덀 문ꡬ가 저와 제 μ•„λ‚΄μ—κ²Œ μ΄λ©”μΌλ‘œ μ „μ†‘λ˜μ–΄, 딸이 그것을 받을 자격이 μžˆμ„ λ•Œ μ œκ³΅ν•  수 μžˆλŠ” 방법을 μ›ν–ˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” μ™„λ²½ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€(μŠ€ν¬λ¦½νŒ…μ„ ν•œ μ§€ μ˜€λž˜λ˜μ—ˆμœΌλ‹ˆκΉŒμš”), ν•˜μ§€λ§Œ optwareλ‚˜ entware μ„€μΉ˜ 없이 μ„€μ •ν•  수 μžˆλŠ” 것을 ν™•μ‹€νžˆ ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

λΉ„λ°€λ²ˆν˜ΈλŠ” ν…μŠ€νŠΈ νŒŒμΌμ—μ„œ μ„ νƒν•œ 문ꡬ(μ €λŠ” μ—¬λŸ¬ λ°΄λ“œ 이름을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€)와 λ¬΄μž‘μœ„ μ„Έ 자리 수둜 κ΅¬μ„±λ©λ‹ˆλ‹€. μ €λŠ” ν•˜λ‚˜μ˜ 게슀트 λ„€νŠΈμ›Œν¬λ§Œ μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, μ„Έ 개의 λ‹€λ₯Έ λ„€νŠΈμ›Œν¬μ— λŒ€ν•΄ μ„Έ 개의 λ‹€λ₯Έ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„ νƒν•˜κ±°λ‚˜ 심지어 μ—¬μ„― 개λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμœΌλ‘œ μ‰½κ²Œ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 단지 getrandomphrase 절차λ₯Ό μ‹€ν–‰ν•œ 후에 phrasepwd에 μƒˆ λ³€μˆ˜λ₯Ό ν• λ‹Ήν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν¬λŸΌμ—μ„œμ˜ λŒ“κΈ€μ„ λ°˜μ˜ν•˜μ—¬, λ¬΄μž‘μœ„ λΉ„λ°€λ²ˆν˜Έλ₯Ό μƒμ„±ν•˜λŠ” λ‹€λ₯Έ 방법을 μ œκ³΅ν•˜λŠ” λͺ‡ κ°€μ§€ λŒ€μ²΄ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. getrandopenssl은 openssl rand μ˜΅μ…˜μ„ μ‚¬μš©ν•˜κ³ , getpasswdme은 https://passwd.me API에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ curl을 μ‚¬μš©ν•©λ‹ˆλ‹€. 이듀은 κΈ°λ³Έ busy box μ„€μΉ˜ μ΄μƒμ˜ μΆ”κ°€ μ†Œν”„νŠΈμ›¨μ–΄ μ„€μΉ˜κ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¨Όμ € λ‹€μŒμ„ /jffs/scripts/rpg-passgen.sh둜 μƒμ„±ν•˜κ³  μ‹€ν–‰ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œμ„Έμš”:

#!/bin/sh

FROM="[email protected]"
AUTH="[email protected]"
PASS="password"
FROMNAME="Asus Router"
TO="[email protected] [email protected]"

# default password based on date if we cannot create one elsewhere
datepasswd=`date +"%A%B%d"`


############################################################################
#
#   getrandomphrase - uses a list of known phrases in a file
#                   - phrase needs to be min 7 chars long
#                   - combines this with a random number between 0 and 999
#
############################################################################

getrandomphrase () {
    if [ -f /jffs/scripts/rpg-phrases.txt ]; then
        phrasecount=`wc -l /jffs/scripts/rpg-phrases.txt | cut -d " " -f 1`
        if [ $phrasecount == 0 ]; then
            # file is empty
            phrasepasswd=$datepasswd
        else
            randomnumber=`tr -cd 0-9 </dev/urandom | head -c 7 | sed 's/^0*//'`
            if [ $randomnumber == "" ]; then
                # cannot get a random number, bailing
                phrasepasswd=$datepasswd
            else
                phrasetext=`sed -n $(( $randomnumber % $phrasecount + 1 ))p /jffs/scripts/rpg-phrases.txt`
                if [ $phrasetext == "" ]; then
                    # blank lines in file, bailing  
                    phrasepasswd=$datepasswd 
                else
                    if [ ${#phrasetext} -lt 7 ]; then
                        # phrase is too short to make a valid password 
                        phrasepasswd=$datepasswd
                    else
                        # we have a phrase now get the three digit number
                        randomnumber=`tr -cd 0-9 </dev/urandom | head -c 7 | sed 's/^0*//'`
                        if [ $randomnumber == "" ]; then
                            # cannot get a random number, bailing
                            phrasepasswd=$datepasswd
                        else
                            phrasenum=`printf "%03d" $(( $randomnumber % 1000 ))`
                            phrasepasswd=$phrasetext$phrasenum
                        fi
                    fi
                fi
            fi
        fi
    else
        # file does not exist 
        phrasepasswd=$datepasswd
    fi
}


############################################################################
#
#   getrandopenssl - uses openssl rand function to create a password
#
############################################################################

getrandopenssl () {
    phrasepasswd=`openssl rand -base64 8`
    if [ $phrasepasswd == "" ]; then
        # we were unable to get something from openssl 
        phrasepasswd=$datepasswd
    fi
}


############################################################################
#
#   getpasswdme - uses passwd.me api to get random password
#               - needs curl to be installed 
#
############################################################################

getpasswdme () {
    ping -c 1 8.8.8.8
    if [ $? == 0 ]; then
        phrasepasswd=`curl -k "https://passwd.me/api/1.0/get_password.txt?type=pronounceable&length=12&charset=LOWERCASEALPHANUMERIC"`
        if [ $phrasepasswd == "" ]; then
            # we were unable to get something from passwd.me
            phrasepasswd=$datepasswd
        fi
    else
        # no network access at this time
        phrasepasswd=$datepasswd
    fi
}


# Now call the function we want to use 

getrandomphrase

# getrandopenssl

# getpasswdme


# log what we have done
logger -t $(basename $0) "Today's Guest1 password is :" $phrasepasswd

# nvram settings for the three guest 2.4 networks
nvram set wl0.1_wpa_psk=$phrasepasswd
nvram set wl0.2_wpa_psk=$datepasswd
nvram set wl0.3_wpa_psk=$datepasswd

# nvram settings for the three guest 5.0 networks
nvram set wl1.1_wpa_psk=$phrasepasswd
nvram set wl1.2_wpa_psk=$datepasswd
nvram set wl1.3_wpa_psk=$datepasswd

# passwords have been changed but we need to restart the wifi for it to pick them up
service restart_wireless

# now send out the email
echo "Subject: Guest network password notification" >/tmp/mail.txt
echo "From: \\"$FROMNAME\\"<$FROM>" >>/tmp/mail.txt
echo "Date: `date -R`" >>/tmp/mail.txt
echo "" >>/tmp/mail.txt
echo "Today's guest network password is : $phrasepasswd" >>/tmp/mail.txt
echo "" >>/tmp/mail.txt

cat /tmp/mail.txt | sendmail -H"exec openssl s_client -quiet \
-CAfile /jffs/configs/Equifax_Secure_Certificate_Authority.pem \
-connect smtp.gmail.com:587 -tls1 -starttls smtp" \
-f"$FROM" \
-au"$AUTH" -ap"$PASS" $TO 

rm /tmp/mail.txt

쒋은 문ꡬλ₯Ό μ–»μ–΄ λΉ„λ°€λ²ˆν˜Έλ₯Ό 생성할 수 μ—†λŠ” 경우, λ‚ μ§œλ₯Ό 기반으둜 ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜λ―€λ‘œ 적어도 맀일 λΉ„λ°€λ²ˆν˜Έκ°€ λ³€κ²½λ˜λ”λΌλ„ 예츑 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€! :)

슀크립트λ₯Ό κ΅¬μ„±ν•˜μ—¬ Gmail을 μ‚¬μš©ν–ˆμ§€λ§Œ, ISP SMTP μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μˆ˜μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. Gmail은 /jffs/configs/에 λ³΄μ•ˆ μΈμ¦μ„œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이것이 μ—†λ‹€λ©΄ λ‹€μŒ κ²Œμ‹œλ¬Όμ„ ν™•μΈν•˜μ„Έμš”. μœ„ν‚€μ— μ–ΈκΈ‰λœ wget λͺ…령이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€:

[http://forums.smallnetbuilder.com/showpost.php?p=149473&postcount=95](/XIYO/asuswrt-merlin

.ng-kr)

λ‹€μŒμœΌλ‘œ, /jffs/scripts/rpg-phrases.txt둜 λ‹€μŒμ„ μƒμ„±ν•˜μ„Έμš”:

greenday
alicecooper
ledzeppelin
aerosmith
ironmaiden
metallica
foofighters
blacksabbath
defleppard

이 문ꡬ듀은 λΉ„λ°€λ²ˆν˜Έμ˜ κΈ°μ΄ˆκ°€ λ©λ‹ˆλ‹€. μ €λŠ” λ°΄λ“œ 이름을 μ„ νƒν–ˆμ§€λ§Œ, μžλ…€λ“€μ˜ μ΄λ¦„μ΄λ‚˜ μž₯μ†Œ λ˜λŠ” μ›ν•˜λŠ” 것을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 문ꡬ가 μ΅œμ†Œ 7자(+λ¬΄μž‘μœ„ 수 3자 = μ΅œμ†Œ 길이 10자) 이상이고 빈 쀄이 없도둝 ν•˜μ„Έμš”. 여기에 합리적인 수의 ν•­λͺ©μ„ λ„£μœΌμ„Έμš”. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ μ •κΈ°μ μœΌλ‘œ 같은 문ꡬ가 선택될 κ²ƒμž…λ‹ˆλ‹€. μ €μ˜ 전체 문ꡬ νŒŒμΌμ€ 이제 μ•½ 70κ°œλ‚˜ 80개의 λ‹€λ₯Έ λ°΄λ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€! :)

맀일 μ˜€μ „ 4μ‹œμ— 이 과정이 μ‹€ν–‰λ˜λ„λ‘ /jffs/scripts/init-start에 λ‹€μŒμ„ μΆ”κ°€ν•˜κ³  μ‹€ν–‰ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œμ„Έμš”:

#!/bin/sh
cru a ResetGuestPassword "0 4 * * * /jffs/scripts/rpg-passgen.sh"

λ§ˆμ§€λ§‰μœΌλ‘œ, λ‹€μŒ λ‚  μ˜€μ „ 4μ‹œκΉŒμ§€ 기닀리지 μ•Šκ³  각 λΆ€νŒ… μ‹œ 이것이 μ‹€ν–‰λ˜λ„λ‘ /jffs/scripts/services-start에 λ‹€μŒμ„ μΆ”κ°€ν•˜κ³  μ‹€ν–‰ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œμ„Έμš”:

#!/bin/sh
sh /jffs/scripts/rpg-passgen.sh

λΌμš°ν„°λ₯Ό μž¬λΆ€νŒ…ν•˜λ©΄ μ™„λ£Œλ©λ‹ˆλ‹€!

이에 λŒ€ν•΄ μ˜κ²¬μ„ λ‚˜λˆ„κ±°λ‚˜ κ°œμ„  사항을 μΆ”κ°€ν•˜κ±°λ‚˜ 문제 μžˆλŠ” μ²­μ†Œλ…„μ— λŒ€ν•΄ λ…Όμ˜ν•˜κ³  μ‹Άλ‹€λ©΄, 여기에 μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€:

http://forums.smallnetbuilder.com/showthread.php?t=22700

⚠️ **GitHub.com Fallback** ⚠️