セキュアSMSコマンダー

会社の設備を何らかの方法で監視するほとんどのシステム管理者は、インフラストラクチャの状態に関するSMSメッセージを送信するためにのみ使用されることが多いsmstoolsパッケージに精通しています。 コインの裏側は、VPN接続が利用できない場合、またはインターネットアクセスゾーンの外にいる場合、エンタープライズインフラストラクチャをリモートで制御する必要があることです。 前述の管理方法には確かに生命権がありますが、単一のサーバーを管理するように設計されており、コマンドを安全に実行する機能は提供されません。 以下のテキストでは、ローカルネットワーク内でsmsコマンドの実行を安全に確認するための動作メカニズムに注目します。



まず、「なぜこれが必要なのですか?」



「適切に構成されたシステムはメンテナンスが不要」というルールに従って、正しいシステム管理者は安定したオペレーティング機器を再構成せず、更新プログラムのインストールのみに制限します。

しかし、サーバーの作業では、ネットワークボールとRPCの動作を保証するスレッドがハングアップする場合があります(LanManServer(一般ユーザーサーバー内))。ハングアップするのはプロセス自体ではなく、何らかのスレッドです。 その結果、リモートコントロールを介して再起動したり、正しく返済できないサーバーがあります。



この問題で何ができますか?



ほとんどすべての最新サーバーには、IPMIと電源管理が搭載されています。 ここから機能を構築します。 サーバーがnagiosまたは同様のパッケージを介してさらに監視されている場合、ほとんどの場合、nrpe- Nagios Remote Plugin Executorを使用します。これは、システムサービスに依存しないサーバー管理メカニズムがあることを意味します。 再起動、シャットダウン、stop_server、start_serverなどのNSClient ++設定で頻繁に使用されるコマンドを指定し、サーバーで必要なアクションをリモートで実行するだけで十分です。

古いクライアント設定では、外部スクリプトの呼び出しは、新しい[[/ settings / external scripts / scripts] "の[[External Scripts] "セクションにあります 。 テキストはどちらの場合も同じです。



reboot=scripts\s_reboot.cmd shutdown=scripts\s_shutdown.cmd stop_server=scripts\stop_server.cmd start_server=scripts\start_server.cmd
      
      







スクリプティング

s_reboot.cmd

 @echo "Reboot initiated" @start cmd /c shutdown -r -f -t 00 @exit 0
      
      







s_shutdown.cmd

 @echo "Shutdown initiated" @start cmd /c shutdown -s -f -t 00 @exit 0
      
      







start_server.cmd

 @start cmd /c net start server @if %ERRORLEVEL% EQU 0 goto ok @echo Some problem with service start @exit 1 :ok @echo Service started @exit 0
      
      







stop_server.cmd

 @start cmd /c net stop server /y @if %ERRORLEVEL% EQU 0 goto ok @echo Some problem with service stop @exit 1 :ok @echo Service stopped @exit 0
      
      







これは、リモートで使用できるコマンドの基本リストです。 同様のスクリプトに引数を渡すことにより、サービスを停止または発生させることができます。 たとえば、IISを歪めます。



通常、チームの呼び出しは簡単で、次のようになります。

 /usr/local/libexec/nagios/check_nrpe2 -H <HOST> -c <command> -a <arguments>
      
      







これはnrpeで整理されているようで、IPMIを提供する必要があります。

IPMIサーバーシステムとの対話には、 ipmitoolパッケージを使用できます。これは、コマンドラインからipmi管理にアクセスするためのインターフェイスです。



必要なコマンドの主なセットは、「power」セクションに関連しています。つまり、

 ipmitool -H <host> -U <username> -P <password> power status -      ipmitool -H <host> -U <username> -P <password> power up -   ipmitool -H <host> -U <username> -P <password> power off -   ipmitool -H <host> -U <username> -P <password> power reset -    reset
      
      







温度センサー、ファンの速度は引き続き読み取ることができますが、実際には必要ありません。

チームのメインセットを整理しました。



管理セキュリティを確保する方法は?



最近、SMS送信者番号の偽造を許可する多くのサービスが登場したという事実により、送信者番号の通常の検証は十分に信頼できなくなりました。

メッセージで直接パスワードを転送することも信頼性の低いことです。 メッセージの傍受により、制御システムへのフルアクセスが可能になります。 どうする?



解決策は驚くほど簡単です。 OTP(ワンタイムパスワード)。 使いやすさと、生成されたパスワードの時間依存性がないという観点から、最適な解決策はOPIEを使用することです。



OPIEを選ぶ理由



複数のシステム管理者またはサーバーサービスエンジニアがいる場合、全員にパスワードと初期初期化ベクトルを与えることは完全には正しくありません。 サーバーのメンテナンスのために、さまざまなブロックのパスワードのリストを全員に提供することが適切です。



 # opiekey -5 -n 5 5 habrahabr Using the MD5 algorithm to compute response. Reminder: Dont use opiekey from telnet or dial-in sessions. Enter secret pass phrase: 1: JIG RIFT BODE OLGA RICK JAG 2: RIM HIVE BANG LIMA HELL OMEN 3: BULB MOD CARR BANK MOS SET 4: GARB BAWL MANY HAL GLOW FEED 5: FAWN EDGY MEET SHUT LIKE TIME # opiekey -5 -n 5 25 habrahabr Using the MD5 algorithm to compute response. Reminder: Dont use opiekey from telnet or dial-in sessions. Enter secret pass phrase: 21: MAIN HOFF JAM OATH SMOG LIED 22: FUND DENY BYTE BOLT NIBS EASY 23: SLY COAT FLEA CAGE MAE COAL 24: SURE LEFT HULK CLAN SHUN DAR 25: GRAB LIE CLAN FLAK MEL ROSE
      
      







また、パスワードブロックを使用する場合は、サーバーの電源を切った、または再起動した人の手で正確に確認できます。 「1人の」システムを使用するという観点から、Androidの携帯電話では、オンラインパスワード生成のためにOTPDroidパッケージをインストールする方が適切です。 生成されたパスワードの値がすぐにクリップボードにコピーされ、3回クリックするだけでパスワードをsmsでコピーできるという点で素晴らしいです。



「同じパスワードの二重使用はどうですか?」と尋ねます。

答えは簡単です:「SMSで到着した使用済みシーケンスのリストを制御し、維持するだけです」



これをすべて一緒に機能させるには


smsd構成ファイルの最初のステップは、イベントハンドラー呼び出しを追加することです。

 eventhandler = /usr/local/etc/smshandlers/smsevent
      
      







処理プログラムは、通常のシェルスクリプトです。



次に、多くのシェルコードsmseventを実行します
 #!/bin/sh NRPETOOL="/usr/local/libexec/nagios/check_nrpe2" IPMITOOL="/usr/local/bin/ipmitool" FPINGTOOL="/usr/local/sbin/fping" PARAMFILE="/usr/local/etc/smshandlers/param.list" OPIEKEYBIN="/usr/bin/opiekey" OPIESEED="HABROPIEProc" OPIEPASS="StrongOPIEPassword" OPIEUSEDSEED="/var/tmp/used.opie" SMSDOUTSPOOL="/var/spool/sms/outgoing" if [ ! -f ${OPIEUSEDSEED} ]; then echo "#USED SEEDS FILE. Do not EDIT" > ${OPIEUSEDSEED} fi if [ ! -w ${OPIEUSEDSEED} ]; then echo "file ${OPIEUSEDSEED} is not writable" exit fi if [ ! -r ${PARAMFILE} ]; then echo "file ${PARAMFILE} is not readable" exit fi IFS=" " FOUNDNUM="" NUMBER="" # search any properties search (){ # $1 - section [name] from param.list # $2 - search string in section SECTION=$1 SEARCHSTR=$2 shift shift OLDIFS=${IFS} IFS=" " [ "X"${SEARCHSTR} == "X" ] && exit for i in ${PARAMS}; do # search section definition if [ `echo ${i} | grep -e "^\["` ]; then CURSECTION=${i} continue fi if [ "${CURSECTION}" == "["${SECTION}"]" ]; then if [ `echo ${i} | grep -e "^\b${SEARCHSTR}\b:"` ]; then echo ${i} break fi fi done IFS=${OLDIFS} } cut_message_body (){ # split sms file to parts # BSD buggy "grep -m 1 -A 10 -e '^$'" replacement # FILE=$1 NULLSTR=0 for i in `cat -e $1`; do if [ "X"${i} == "X\$" ]; then NULLSTR=1 continue fi if [ ${NULLSTR} -eq 1 ]; then echo ${i} fi done } process_command () { CMD=$1 shift CMDPARAM=$* oIFS=$IFS IFS=" " for host in ${CMDPARAM}; do HOSTACCOUNT=$( search hosts "${host}" ) if [ "X"${HOSTACCOUNT} != "X" ]; then ACCOUNT=`echo ${HOSTACCOUNT} | cut -d ":" -f 2-` LOGINPW=$( search logins "${ACCOUNT}" ) if [ "X"${ACCOUNT} != "X" ]; then if [ "${ACCOUNT}" != "null" ]; then USER=`echo ${LOGINPW} | cut -d ":" -f 2` PASSWORD=`echo ${LOGINPW} | cut -d ":" -f 3` else USER="USER" PASSWORD="PASSWORD" fi else echo "ACCOUNT ${ACCOUNT} NOT FOUND!" break fi else echo "HOST ${host} NOT FOUND!" continue fi opierequired=$( search commands_template "${CMD}" | cut -d ":" -f 2 ) commandtemplate=$( search commands_template "${CMD}" | \ cut -d ":" -f 3- | sed \ -e "s@\%HOST\%@${host}@g" \ -e "s@\%FPING\%@${FPINGTOOL}@g" \ -e "s@%IPMITOOL%@${IPMITOOL}@g" \ -e "s@%CHECK_NRPE%@${NRPETOOL}@g" \ -e "s@%USER%@${USER}@g" \ -e "s@%PASSWORD%@${PASSWORD}@g" ) if [ "${opierequired}" -eq "1" ]; then if [ "${OPIERES}" == "True" ]; then echo "OPIE Success" res=$( eval ${commandtemplate} ) sendsms ${NUMBER} ${host} ${res} else echo "OPIE Failed" sendsms ${NUMBER} ${host} "OPIE Challenge failed" fi else res=$( eval ${commandtemplate} ) sendsms ${NUMBER} ${host} ${res} fi done IFS=$oIFS } sendsms () { NM=$1 shift TMPFILE=`mktemp ${SMSDOUTSPOOL}/smscmd.XXXXXX` || exit 1 echo "To: ${NM}" >> ${TMPFILE} echo >> ${TMPFILE} echo "$*" >> ${TMPFILE} } opiecheck () { OPIESEQ=`echo $* | cut -d " " -f 1 | sed -e 's/[^0-9]//g'` OPIESTR=`echo $* | cut -d " " -f 2-` if [ "X"${OPIESEQ} == "X" ]; then echo "OPIE SEQUENCE FOR NUMBER ${NUMBER} IS NOT SET!" OPIERES="False" break fi if [ `grep "^${OPIESEQ}$" ${OPIEUSEDSEED}` ]; then echo "USED OPIE SEQUENCE ${OPIESEQ} DETECTED" OPIERES="False" sendsms ${NUMBER} "OPIE SEQUENCE ${OPIESEQ} ALREADY USED" exit 1 else echo ${OPIESEQ} >> ${OPIEUSEDSEED} fi OPIEGEN=`echo ${OPIEPASS} | ${OPIEKEYBIN} -5 -a ${OPIESEQ} ${OPIESEED} 2>/dev/null` if [ "X"${OPIESTR} != "X"${OPIEGEN} ]; then OPIERES="False" else OPIERES="True" fi } parse_commands () { for command in $*; do command=`echo ${command} | sed -e 's/\$$//g' -e 's/^\#//g'` CURCOMMAND=`echo ${command} | cut -d " " -f 1` CMDPARAM=`echo ${command} | cut -d " " -f 2-` case "${CURCOMMAND}" in "OPIE") opiecheck ${CMDPARAM} continue ;; *) if [ `echo ${FOUNDNUM} | cut -d : -f 2 | grep "\b${CURCOMMAND}\b"` ]; then TMPMSG="ALLOWED COMMAND FOR NUMBER "${NUMBER}" - COMMAND: "${CURCOMMAND}" ARGS "${CMDPARAM} echo ${TMPMSG} process_command ${CURCOMMAND} ${CMDPARAM} else TMPMSG="DISALLOWED COMMAND FOR NUMBER "${NUMBER}" - COMMAND: "${CURCOMMAND}" ARGS "${CMDPARAM} echo ${TMPMSG} fi ;; esac done } PARAMS=`cat ${PARAMFILE} | grep -E -v '^#'` if [ $1 == "RECEIVED" ]; then FILENAME=$2 NUMBER=`grep 'From:' ${FILENAME} | sed -e 's/^From\:\ //g' -e 's/[^0-9]//g;'` FOUNDNUM=$( search phones ${NUMBER} ) if [ "X"${FOUNDNUM} != "X" ]; then commands=$( cut_message_body ${FILENAME} ) parse_commands ${commands} fi elif [ $1 == "SENT" ]; then echo $@ else echo "UNKNOWN STATUS $@" fi
      
      







smseventハンドラファイルに関するいくつかのコメント



ファイルの先頭には、構成ファイル、検証および管理プログラムを見つけるための基本変数、およびパスワード検証のためのOPIEパラメーターが設定されています。



少しのparam.list構成ファイル
 # --------------------------------------- # # ALLOWED PHONES # PHONENUMBER:COMMAND,COMMAND,COMMAND # --------------------------------------- [phones] 79030000000:RESET,PWROFF,PWRON,REBOOT,SHUTDOWN,STOPSERVER,STARTSERVER,ALIVE,PWRSTAT 79160000000:ALIVE,PWRSTAT 79020000000:PWRON,STARTSERVER,ALIVE # --------------------------------------- # # HOST LIST # REAL_IP:IPMI_USER # --------------------------------------- [hosts] 192.168.55.2:ADMSM 192.168.54.2:null 192.168.55.5:ADMDEF 192.168.54.5:null # --------------------------------------- # # IPMI LOGINS # IPMI_ACCOUNT:IPMI_NAME:IPMI_PASSWORD # --------------------------------------- [logins] ADMSM:ADMIN:PW1234 ADMDEF:ADMIN:ADMIN ADMIBM:USERID:USERID # --------------------------------------- # # COMMANDS TEMPLATE # COMMAND:OPIE_CHECK:COMMAND_TEXT # --------------------------------------- [commands_template] RESET:1:%IPMITOOL% -H %HOST% -U %USER% -P %PASSWORD% power reset PWROFF:1:%IPMITOOL% -H %HOST% -U %USER% -P %PASSWORD% power off PWRON:0:%IPMITOOL% -H %HOST% -U %USER% -P %PASSWORD% power on PWRSTAT:0:%IPMITOOL% -H %HOST% -U %USER% -P %PASSWORD% power status REBOOT:1:%CHECK_NRPE% -H %HOST% -p 5666 -c reboot SHUTDOWN:1:%CHECK_NRPE% -H %HOST% -p 5666 -c shutdown STOPSERVER:1:%CHECK_NRPE% -H %HOST% -p 5666 -c stop_server STARTSERVER:0:%CHECK_NRPE% -H %HOST% -p 5666 -c start_server ALIVE:0:%FPING% %HOST%
      
      







設定ファイルでは、電話機とそれらに使用できるコマンドのリスト、サーバーアドレスのリスト、さまざまなホストのIPMIログインとパスワード、およびコマンドを実行するためのテンプレートを指定します。



コマンドテンプレートブロックでは、2番目の引数は0または1であり、コマンドのOPIEチェックをスキップするか、OPIEをチェックします。



最も簡単なSMS要求は、ホストの可用性を確認した結果とともに2つのSMSを交互に返送します。



 ALIVE 192.168.54.2 192.168.54.5
      
      







フォームのリクエストは、リセットボタンをエミュレートすることにより、ホスト192.168.55.2を再起動し、ホスト192.168.54.5は正常にシャットダウンします:



 OPIE 1 COT NORM TILL JILL MOST MESH RESET 192.168.55.2 SHUTDOWN 192.168.54.5
      
      







smsを介して実行されるすべてのアクションは、拡張smsdログに書き込まれます。



一般に、それですべてです。 自分で設定を編集し、コマンドを受信するようにサーバーを設定すると、電話で休暇を取ることができます。 突然何かがハングした場合、SMSを介した直接射撃がトリックを行います。



PS:スクリプトは少し湿っていますが、彼らが言うように、「完璧に制限はありません!」。



All Articles