メインコンテンツへスキップ
検索

OpenVOSアーキテクチャは、X25通信用のNIO、ファイバーチャネルディスクアレイコントローラ、電源用のUPS、RSN over IP用のRSNインターネットコンソールサーバ、そしてこれらすべてのシステムがプライベートEthernet/IPネットワークを介して通信できるようにするメンテナンスネットワークのEthernetスイッチなど、いくつかの独立したシステムを使用しています。これらのシステムは、様々なOpenVOSプロセスによって監視され、正常に動作していることを確認しています。しかし、ユーザーログインのようないくつかのイベントは監視されていません。RSNコンソールとネットワークスイッチには、誰かがログインしたり、ログインしようとしたときに、ロギングサーバにメッセージを送信するオプションがあります。ネットワークスイッチは Stratus モジュールにしか接続されていないので、ロギングサーバを Stratus モジュール上で動作させることは理にかなっている。このサーバは、受信したメッセージを、日付とタイムスタンプ、メッセージを送信したホストの IP アドレスとともに標準出力に書き込むだけである。このサーバを起動プロセスとして実行することで、メッセージをプロセスの out ファイルに保存することができる。

ネットワークスイッチの例
権限を与えられた人がrootとしてネットワークスイッチにログインするときにrootパスワードを入力するのに問題があった可能性がありますが、パスワードを推測するのが得意なだけなのかもしれません。


2011-10-02 11:55:39 : 10.10.1.75 :>%AAA-W-REJECT.使用するための新しいtelnet接続
+r root, source 10.10.1.1 destination 10.10.1.75 REJECTED

2011-10-02 11:56:03 : 10.10.1.75 :>%AAA-W-REJECT.使用するための新しいtelnet接続
+r root, source 10.10.1.1 destination 10.10.1.75 REJECTED

2011-10-02 11:56:08 : 10.10.1.75 :>%AAA-I-CONNECT.ユーザー ro のユーザー CLI セッション
telnet経由で+ot ソース 10.10.1.1 宛先 10.10.1.75 ACCEPTED

ここでシステム管理者のユーザーIDを推測している人がいます。


2011-10-02 12:03:13 : 10.10.1.75 :>%AAA-W-REJECT.使用するための新しいtelnet接続
+r admin, source 10.10.1.1 destination 10.10.1.75 REJECTED

2011-10-02 12:03:30 : 10.10.1.75 :>%AAA-W-REJECT.使用するための新しいtelnet接続
+r sysadmin, source 10.10.1.1 destination 10.10.1.75 REJECTED

2011-10-02 12:04:39 : 10.10.1.75 :>%AAA-W-REJECT.使用するための新しいtelnet接続
+r 管理者、ソース 10.10.1.1 宛先 10.10.1.75 REJECTED

ユーザーログインの他にも、ネットワークスイッチは設定が変更されたときにレポートします。


2011-10-02 15:16:29 : 10.10.1.75 :>%COPY-I-FILECPY.ファイルのコピー - ソース URL の実行
+nning-config 宛先 URL flash://startup-config

2011-10-02 15:16:43 : 10.10.1.75 :>%COPY-N-TRAPです。コピー操作が完了しました。
正常に+EDされました

また、通信の問題をトラブルシューティングする際に非常に便利なリンクアップとダウンのメッセージも報告してくれます。


2011-10-02 15:49:17 : 10.10.1.75 :>リンク-W-ダウン: 2/e24

2011-10-02 15:49:20 : 10.10.1.75 :>リンク・アイアップです。  2/e24
  RSNインターネットコンソールサーバーからの例
モジュールの誰かがRSNコンソールに接続し、パスワードを2回間違って入力した後、rootとしてログインしました。


2011-10-02 12:11:03 : 10.10.1.200 : in.telnetd[2942]: 10.10.1.1 (10) から接続します。
+.10.1.1)
2011-10-02 12:11:03 : 10.10.1.1.200 : telnetd[2942]: doit: getaddrinfo.一時的に
+名前解決の失敗
2011-10-02 12:11:07 : 10.10.1.200 : login[2943]: invalid password for `root' on `root'
10.10.1.1.1' からの +`ttyp0'
2011-10-02 12:11:15 : 10.10.1.1.200 : login[2943]: invalid password for `root' on
10.10.1.1.1' からの +`ttyp0'
2011-10-02 12:11:35 : 10.10.1.1.200 : login[2945]: root login on `ttyp0' from `10
+.10.1.1'

RSNコンソールは、無効なユーザーIDで試行が行われた場合、UNKNOWNのユーザーIDを報告することに注意してください。


2011-10-02 12:12:31 : 10.10.1.200 : in.telnetd[2946]: 10.10.1.1 (10) から接続します。
+.10.1.1)
2011-10-02 12:12:32 : 10.10.1.1.200 : telnetd[2946]: doit: getaddrinfo.一時的に
+名前解決の失敗
2011-10-02 12:12:37 : 10.10.1.200 : login[2947]: `UNKNOWN' のパスワードが無効です。
+10.10.1.1.1' から `ttyp0' をオンにした場合
2011-10-02 12:12:45 :10.10.10.1.1.200 : login[2947]: `UNKNOWN' のパスワードが無効です。
+10.10.1.1.1' から `ttyp0' をオンにした場合
2011-10-02 12:12:54 : 10.10.1.1.200 : login[2947]: `UNKNOWN' のパスワードが無効です。
+10.10.1.1.1' から `ttyp0' をオンにした場合

RSN コンソールでは、有効なユーザー ID rsn_admin がログインに使用されている場合は報告されません。ただし、接続は表示されます。rsn_adminユーザIDはシステム設定ファイルを変更することはできません。rsn_admin ユーザが su コマンドで root に変更しようとした場合はログに記録されます。


2011-10-02 12:15:37 : 10.10.1.200 : in.telnetd[2957]: 10.10.1.1 (10) から接続します。
+.10.1.1)
2011-10-02 12:15:38 : 10.10.1.1.200 : telnetd[2957]: doit: getaddrinfo.一時的に
+名前解決の失敗
2011-10-02 12:15:54 : 10.10.1.200 : su[2959].+ ttyp0 rsn_admin-root
2011-10-02 12:15:54 : 10.10.1.200 : PAM_unix[2959].(su) セッションがユーザ
+ root by rsn_admin(uid=500)

失敗した試みと同じように


2011-10-02 12:19:50 : 10.10.1.200 : PAM_unix[2972]: 認証に失敗しました。
+admin(uid=500) -> su サービスの root
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: pam_authenticate.認証 f
+しっぱい
2011-10-02 12:19:52 : 10.10.1.200 : su[2972]: - ttyp0 rsn_admin-root

 

OpenVOSモジュールにログメッセージを送信するようにネットワークスイッチを設定するには、rootとしてスイッチにログインし、loggingコマンドを実行し、新しい設定を保存する必要があります。

telnet 10.10.1.75          
試してみると・・・。
10.10.10.1.75に接続しました。
エスケープ文字は「^」です。]

ユーザー名:ルート
パスワード:************。

console# config
console(config)# logging 10.10.1.1
コンソール(config)#

console# copy running-config startup-config

 

RSN コンソールが OpenVOS モジュールにログメッセージを送信するように設定するには、root としてコンソールにログインし、"syslogd -R 10.10.1.1:514" コマンドで syslogd プロセスを起動する必要があります。再起動後に syslogd プロセスが起動するようにするには、/etc/tc.d/rc.local ファイルを変更する必要があります。

telnet 10.10.1.200
Trying...
Connected to 10.10.1.200.
Escape character is '^]'.

Moxa Embedded Linux, Professional Edition
Linux/armv5teb 2.4.18_mvl30-ixdp425

azvos login: root
Password:
Welcome to

    ___  _____  __        _______    _____                   __
   / _ / __/ |/ / ____  /  _/ _   / ___/__  ___  ___ ___  / /__
  / , _/ /    / /___/ _/ // ___/ / /__/ _ / _ (_-</ _ / / -_)
 /_/|_/___/_/|_/       /___/_/     ___/___/_//_/___/___/_/__/ 

 Authorized Users Only!

root@azvos:~# syslogd -R 10.10.1.1:514
root@azvos:~# 
root@azvos:~# 
root@azvos:~# 
root@azvos:~# cd /etc/rc.d
root@azvos:/etc/rc.d# cp rc.local rc.local.bak
root@azvos:/etc/rc.d# echo syslogd -R 10.10.1.1:514 >> rc.local
root@azvos:/etc/rc.d# tail rc.local
fi
/etc/init.d/ssh start
/etc/init.d/apache stop
/etc/init.d/portmap stop
rm -f /rsn/call.log
/rsn/callhome &
lcmmessage -c -m "   Welcome to   " -l
lcmmessage -m " RSN-IP Console " -l
cat /etc/motd
syslogd -R 10.10.1.1:514
root@azvos:/etc/rc.d#

 

上記と同じ出力が得られたら、rc.local.bakファイルを"rm rc.local.bak"で削除してください。

デバイスのロギングが設定されたら、Stratus モジュール上で logd プログラムを実行する必要があります。 以下のコマンドマクロでプログラムを起動することをお勧めする。ログファイルの名前は logd.(date).....(time).out とする。何らかの理由で既に同名のファイルが存在する場合は、logd.(date).(time).old.out という名前に変更される。.old.outという接尾辞を持つファイルが既に存在する場合は削除されます。タイムスタンプが2番目にあることを考えると、これはありそうもありません。outファイルには暗黙のロックが設定されているので、いつでもファイルを読むことができます。outファイルは永遠に成長するので、あなたの側でのメンテナンスが必要になることに注意してください。



& start_logd.cmはここから始まります。
&
&バージョン1.00 11-11-02
[email protected]
&
このスクリプトは、ログファイルを作成し、暗黙のロックを設定し、logdを起動します。
&プロセスを実行します。プロセスは正常に終了せず、ログファイルには
&非常に大きく成長する可能性を秘めています。
&
&
本ソフトウェアは「現状有姿」で提供されており、いかなる保証もなく、また、本ソフトウェアを使用していない場合は、本ソフトウェアを使用していないことになります。
また、いかなる種類のサポートも行いません。著者は、いかなる黙示のものであっても明示的に否認します。
また、商品性や特定目的への適合性の保証もありません。
& この免責事項は、いかなる口頭での表明にもかかわらず適用されます。
& kind provided by author or anyone else.
&
セット DT (日付)...(時間)
if (logd.&DT&.outが存在する場合)
その時は !logd.&DT&.outの名前を変更します。
!create_file logd.&DT&.out
!set_implicit_locking logd.&DT&.out
start_process logd -output_path logd.&DT&.out -privileged -process_name logd
&
& start_logd.cmはここで終了

 

任意の最後にここにプログラムです。



/* logd.c starts here

   Version 1.00 11-11-02
   [email protected]

   This software is provided on an "AS IS" basis, WITHOUT ANY WARRANTY OR
   ANY SUPPORT OF ANY KIND. The AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE.
   This disclaimer applies, despite any verbal representations of any
   kind provided by the author or anyone else.
*/

#define _POSIX_SOURCE

#include <sys/select.h>
#include <prototypes/inet_proto.h>
#include <stdlib.h>
#include <string.h>
#include <c_utilities.h>
#include <errno.h>
#include <time.h>

#define BUFFERLEN 10000
#define bzero(s, len)             memset((char *)(s), 0, len)

int errno;

getCurrentDateTime (char * szDT)
{
time_t tTime;
struct tm *tmLT;

tTime = time ((time_t *) 0);
tmLT = localtime (&tTime);

sprintf (szDT, "%4ld-%02ld-%02ld %02ld:%02ld:%02ld",
          tmLT -> tm_year+1900,
          tmLT -> tm_mon,
          tmLT -> tm_mday,
          tmLT -> tm_hour,
          tmLT -> tm_min,
          tmLT -> tm_sec);
}

main (argc, argv)
int    argc;
char   *argv [];

{
 struct sockaddr_in serv_addr;
 struct sockaddr_in cli_addr;
 int clilen = sizeof (cli_addr);

 int zeroCount = 0;
 int socks0;
 int recvBytes;

 char szSender [16];
 char  szDateTime [32];
 char szMessage [BUFFERLEN];
 short portNumber;

 if (argc == 1)  /* no arguments - use the default of 514 */
    {
    portNumber = 514;
    }
 else
 if (argc == 2) /* one argument, must be the expected port number */
    {
    portNumber = atoi (argv [1]);
    if (portNumber == 0)
       {
       printf ("nn%s argument was not the expected port number", argv [1]);
       printf ("nUsage: logd [port number, default = 514]n");
       exit (-1);
       }
    }
 else /* more than one argument gets a usage message */
    {
    printf ("nnToo many arguments");
    printf ("nUsage: logd [port number, default = 514]n");
    exit (-1);
    }

/* Leting you know what argument values will actually be used */

 printf ("logd %dnn", portNumber);

 if ((socks0 = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
    {
    perror ("logd: can't create dgram socket");
    exit (errno);
    }

/* build a sockaddr structure holding the address we will bind to. The IP
   address is INADDR_ANY meaning we will listen on all active IP addresses */

 bzero ( (char *) &serv_addr, sizeof (serv_addr));
 serv_addr.sin_family        = AF_INET;
 serv_addr.sin_addr.s_addr   = htonl (INADDR_ANY);
 serv_addr.sin_port          = htons (portNumber);

/* now bind to the address and port */

 if (bind (socks0, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
    {
    perror ("logd: can't bind local address");
    exit (errno);
    }

/* main loop just does a recv, blocking until something is available to read.
   Assuming we receive at least 1 byte we get the current date-time,
   convert the senders IP address to a printable string and print the
   date-time, address and message starting at the 5th character position.
   The first four characters of a syslog message are <NN> where NN is a
   severity and facility code. These can be used for message filtering. Since
   this program doesn't do any filtering I just skip them. */
 while (1)
   {
    recvBytes=recvfrom(socks0,szMessage, BUFFERLEN, 0,
          (struct sockaddr *) &cli_addr, &clilen);
    if (recvBytes > 0)
       {
       getCurrentDateTime ((char *) &szDateTime);
       strcpy (szSender, inet_ntoa ((struct in_addr) cli_addr.sin_addr));
       szMessage [recvBytes] = 0;
       printf ("%s : %s : %sn", szDateTime, szSender, &szMessage[4]);
       zeroCount = 0;
       }
    else
    if (recvBytes < 0) /* in the event of an error report it and exit */
       {
       getCurrentDateTime ((char *) &szDateTime);
       printf ("%s : Error %d returned - exitingn", szDateTime, errno);
       exit (errno);
       }
    else  /* I can't think of any reason we would be getting null messages */
       {  /* but if we get a stream of them we would silently loop. This */
       zeroCount++;          /* forces out a message if we get 100 null */
       if (zeroCount > 99)   /* messages in a row */
          {
          getCurrentDateTime ((char *) &szDateTime);
          strcpy (szSender, inet_ntoa ((struct in_addr) cli_addr.sin_addr));
          printf ("%s : %s %sn", szDateTime,
               "We have received 100 null messages, the last one from",
               szSender);
          zeroCount = 0;
          }
       }
   }
}

/* logd.c ends here */

 

メニューを閉じる

© 2024 Stratus Technologies.