精华内容
下载资源
问答
  • Linux日志分析

    千次阅读 2015-02-03 09:54:33
    Linux日志分析的实战专题 作者:刘志勇 郭聪辉 发文时间:2004.11.23 日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生...


    Linux日志分析的实战专题
    作者:刘志勇 郭聪辉 发文时间:2004.11.23
    日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件。用户可以通过日志文件 检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是:审核和监测。配置好的Linux的日志非常强大。对于 Linux系统而言,所有的日志文件都在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改 /etc/ftpacess让系统记录FTP的一切活动。

    Linux日志系统简介: 日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日 志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错 误日志。


      Linux日志系统 

      日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。 

      Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错误日志。 

      连接时间日志 

      连接时间日志由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmp。login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。 

      进程统计日志 

      进程统计日志由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。 

      错误日志 

      错误日志由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外还有许多UNIX类程序创建日志,像HTTP和FTP这样提供网络服务的服务器也有详细的日志。 





    Redhat Linux 常见的日志文件和常用命令:成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索和阅读它们。还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。 Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有root账户才可以读,不过修改文件的访问权限 就可以让其他人可读。

    成功地管理任何系统的关键之一,是要知道系统中正在 发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索和阅读它们。还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。 Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有root账户才可以读,不过修改文件的访问权限 就可以让其他人可读。

      RedHat Linux常用的日志文件

      RedHat Linux常见的日志文件详述如下
      /var/log/boot.log
      该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息。

      /var/log/cron
      该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。CMD的一个动作 是cron派生出一个调度进程的常见情况。REPLACE(替换)动作记录用户对它的cron文件的更新,该文件列出了要周期性执行的任务调度。 RELOAD动作在REPLACE动作后不久发生,这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查 到一些反常的情况。

      /var/log/maillog
      该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。下面是该日志文件的片段:

      
    Sep 4 17:23:52 UNIX sendmail[1950]: g849Npp01950: from=root, size=25,
    class=0, nrcpts=1,
    msgid=<200209040923.g849Npp01950@redhat.pfcc.com.cn>,
    relay=root@localhost
    Sep 4 17:23:55 UNIX sendmail[1950]: g849Npp01950: to=lzy@fcceec.net,
    ctladdr=root (0/0), delay=00:00:04, xdelay=00:00:03, mailer=esmtp, pri=30025,
    relay=fcceec.net. [10.152.8.2], dsn=2.0.0, stat=Sent (Message queued)
    /var/log/messages



      该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。如以下几行:


      
    Sep 3 08:30:17 UNIX login[1275]: FAILED LOGIN 2 FROM (null) FOR suying,
    Authentication failure
    Sep 4 17:40:28 UNIX -- suying[2017]: LOGIN ON pts/1 BY suying FROM
    fcceec.www.ec8.pfcc.com.cn
    Sep 4 17:40:39 UNIX su(pam_unix)[2048]: session opened for user root by suying(uid=999)



      该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号、一个冒号和一个空格,最后是消息。该文件有一个不足,就是被记 录的入侵企图和成功的入侵事件,被淹没在大量的正常进程的记录中。但该文件可以由/etc/syslog文件进行定制。由 /etc/syslog.conf配置文件决定系统如何写入/var/messages。有关如何配置/etc/syslog.conf文件决定系统日志 记录的行为,将在后面详细叙述。

      /var/log/syslog
      默认RedHat Linux不生成该日志文件,但可以配置/etc/syslog.conf让系统生成该日志文件。它和/etc/log/messages日志文件不同, 它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件。要让系统生成该日志文件,在/etc/syslog.conf文件中加上: *.warning /var/log/syslog   该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。下面是一条记录:

      
    Sep 6 16:47:52 UNIX login(pam_unix)[2384]: check pass; user unknown
    /var/log/secure
    该日志文件记录与安全相关的信息。该日志文件的部分内容如下:
    Sep 4 16:05:09 UNIX xinetd[711]: START: ftp pid=1815 from=127.0.0.1
    Sep 4 16:05:09 UNIX xinetd[1815]: USERID: ftp OTHER :root
    Sep 4 16:07:24 UNIX xinetd[711]: EXIT: ftp pid=1815 duration=135(sec)
    Sep 4 16:10:05 UNIX xinetd[711]: START: ftp pid=1846 from=127.0.0.1
    Sep 4 16:10:05 UNIX xinetd[1846]: USERID: ftp OTHER :root
    Sep 4 16:16:26 UNIX xinetd[711]: EXIT: ftp pid=1846 duration=381(sec)
    Sep 4 17:40:20 UNIX xinetd[711]: START: telnet pid=2016 from=10.152.8.2
    /var/log/lastlog


      该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件是二进制文件,需 要使用lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似如下的信息: 



    Username Port From Latest
    root tty2 Tue Sep 3 08:32:27 +0800 2002
    bin **Never logged in**
    daemon **Never logged in**
    adm **Never logged in**
    lp **Never logged in**
    sync **Never logged in**
    shutdown **Never logged in**
    halt **Never logged in**
    mail **Never logged in**
    news **Never logged in**
    uucp **Never logged in**
    operator **Never logged in**
    games **Never logged in**
    gopher **Never logged in**
    ftp ftp UNIX Tue Sep 3 14:49:04 +0800 2002
    nobody **Never logged in**
    nscd **Never logged in**
    mailnull **Never logged in**
    ident **Never logged in**
    rpc **Never logged in**
    rpcuser **Never logged in**
    xfs **Never logged in**
    gdm **Never logged in**
    postgres **Never logged in**
    apache **Never logged in**
    lzy tty2 Mon Jul 15 08:50:37 +0800 2002
    suying tty2 Tue Sep 3 08:31:17 +0800 2002



      系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录,如果发现这些账户已经登录,就说明系统可能已经被入侵了。若发现记录的时间不是用户上次登录的时间,则说明该用户的账户已经泄密了。 

      /var/log/wtmp 

      该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加 的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录 记录,last也能根据用户、终端 tty或时间显示相应的记录。 

      命令last有两个可选参数: 

      last -u 用户名 显示用户上次登录的情况。 

      last -t 天数 显示指定天数之前的用户登录情况。 

      /var/run/utmp 

      该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会 为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时 更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。 

      以上提及的3个文件(/var/log/wtmp、/var/run/utmp、/var/log/lastlog)是日志子系统 的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文 件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的 具体的数据结构可以使用man命令查询。 

      每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写 到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。 utmp文件被各种命令使用,包括who、w、users和finger。 

      下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。 

      /var/log/xferlog 

      该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。 

      该文件的格式为:第一个域是日期和时间,第二个域是下载文件所花费的秒数、远程系统名称、文件大小、本地路径名、传输类型(a: ASCII,b:二进制)、与压缩相关的标志或tar,或"_"(如果没有压缩的话)、传输方向(相对于服务器而言:i代表进,o代表出)、访问模式 (a:匿名,g:输入口令,r:真实用户)、用户名、服务名(通常是ftp)、认证方法(l:RFC931,或0),认证用户的ID或"*"。下面是该文 件的一条记录: 

     
    Wed Sep 4 08:14:03 2002 1 UNIX 275531
    /var/ftp/lib/libnss_files-2.2.2.so b _ o a -root@UNIX ftp 0 * c
    /var/log/kernlog



       RedHat Linux默认没有记录该日志文件。要启用该日志文件,必须在/etc/syslog.conf文件中添加一行:kern.* /var/log/kernlog 。这样就启用了向/var/log/kernlog文件中记录所有内核消息的功能。该文件记录了系统启动时加载设备或使用设备的情况。一般是正常的操作, 但如果记录了没有授权的用户进行的这些操作,就要注意,因为有可能这就是恶意用户的行为。下面是该文件的部分内容: 

      
    Sep 5 09:38:42 UNIX kernel: NET4: Linux TCP/IP 1.0 for NET4.0
    Sep 5 09:38:42 UNIX kernel: IP Protocols: ICMP, UDP, TCP, IGMP
    Sep 5 09:38:42 UNIX kernel: IP: routing cache hash table of 512 buckets, 4Kbytes
    Sep 5 09:38:43 UNIX kernel: TCP: Hash tables configured (established 4096 bind 4096)
    Sep 5 09:38:43 UNIX kernel: Linux IP multicast router 0.06 plus PIM-SM
    Sep 5 09:38:43 UNIX kernel: NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
    Sep 5 09:38:44 UNIX kernel: EXT2-fs warning: checktime reached, running e2fsck is recommended
    Sep 5 09:38:44 UNIX kernel: VFS: Mounted root (ext2 filesystem).
    Sep 5 09:38:44 UNIX kernel: SCSI subsystem driver Revision: 1.00
    /var/log/Xfree86.x.log



      该日志文件记录了X-Window启动的情况。另外,除了/var/log/外,恶意用户也可能在别的地方留下痕迹,应该注意以下几 个地方:root和其他账户的shell历史文件;用户的各种邮箱,如.sent、mbox,以及存放在/var/spool/mail/ 和 /var/spool/mqueue中的邮箱;临时文件/tmp、/usr/tmp、/var/tmp;隐藏的目录;其他恶意用户创建的文件,通常是以 "."开头的具有隐藏属性的文件等。 

      具体命令 

      wtmp和utmp文件都是二进制文件,它们不能被诸如tail之类的命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac等命令来使用这两个文件包含的信息。 

      who命令 

      who命令查询utmp文件并报告当前登录的每个用户。who的默认输出包括用户名、终端类型、登录日期及远程主机。例如,键入who命令,然后按回车键,将显示如下内容: 




    chyang pts/0 Aug 18 15:06
    ynguo pts/2 Aug 18 15:32
    ynguo pts/3 Aug 18 13:55
    lewis pts/4 Aug 18 13:35
    ynguo pts/7 Aug 18 14:12
    ylou pts/8 Aug 18 14:15



      如果指明了wtmp文件名,则who命令查询所有以前的记录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。 

      w命令 

      w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如,键入w命令,然后按回车键,将显示如下内容:




      
    3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
    ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05 w
    lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash
    lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/
    ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail
    ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash



      users命令 

      users命令用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如,键入users命令,然后按回车键,将显示如下内容: 

      chyang lewis lewis ylou ynguo ynguo 

      last命令 

      last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如: 

      
    chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
    cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
    chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
    lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
    lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)



      如果指明了用户,那么last只报告该用户的近期活动,例如,键入last ynguo命令,然后按回车键,将显示如下内容: 

      
    ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
    ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
    ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
    ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)
    ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)



      ac命令 

      ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间(小时),如果不使用标志,则报告总的时间。例如,键入ac命令,然后按回车键,将显示如下内容: 

      total 5177.47 

    键入ac -d命令,然后按回车键,将显示每天的总的连接时间: 

      
    Aug 12 total 261.87
    Aug 13 total 351.39
    Aug 14 total 396.09
    Aug 15 total 462.63
    Aug 16 total 270.45
    Aug 17 total 104.29
    Today total 179.02



      键入ac -p命令,然后按回车键,将显示每个用户的总的连接时间: 

      
    ynguo 193.23
    yucao 3.35
    rong 133.40
    hdai 10.52
    zjzhu 52.87
    zqzhou 13.14
    liangliu 24.34
    total 5178.24



      lastlog命令 

      lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示 **Never logged**。注意需要以root身份运行该命令,例如: 

      
    rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
    dbb **Never logged in**
    xinchen **Never logged in**
    pb9511 **Never logged in**
    xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000



    另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。 

      进程统计 

      UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它还对跟踪一个侵入者有 帮助。与连接时间日志不同,进程统计子系统默认不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。 accton命令的形式为:accton file,file必须事先存在。先使用touch命令创建pacct文件:touch /var/log/pacct,然后运行accton:accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何 参数的accton命令。 

      lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内记录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。看下面的例子: 



      
    crond F root ?? 0.00 secs Sun Aug 20 00:16
    promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
    promisc_check root ?? 0.01 secs Sun Aug 20 00:16
    grep root ?? 0.02 secs Sun Aug 20 00:16
    tail root ?? 0.01 secs Sun Aug 20 00:16
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.01 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.02 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
    sh root ?? 0.02 secs Sun Aug 20 00:15
    ping S root ?? 0.00 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.02 secs Sun Aug 20 00:15
    ping S root ?? 1.34 secs Sun Aug 20 00:15
    locate root ttyp0 1.34 secs Sun Aug 20 00:15
    accton S root ttyp0 0.00 secs Sun Aug 20 00:15



      进程统计的一个问题是pacct文件可能增长得十分迅速。这时需要交互式地或经过cron机制运行sa命令来保证日志数据在系统控制 内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和 /var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。在默认情况下sa先读它们,然后读pacct文件,使报告能包含 所有的可用信息。sa的输出有下面一些标记项。


    avio:每次执行的平均I/O操作次数。 

    cp:用户和系统时间总和,以分钟计。 

    cpu:和cp一样。 

    k:内核使用的平均CPU时间,以1k为单位。 

    k*sec:CPU存储完整性,以1k-core秒为单位。 

    re:实时时间,以分钟计。 

    s:系统时间,以分钟计。 

    tio:I/O操作的总数。 

    u:用户时间,以分钟计。 

    例如:


      
    842 173.26re 4.30cp 0avio 358k
    2 10.98re 4.06cp 0avio 299k find
    9 24.80re 0.05cp 0avio 291k ***other
    105 30.44re 0.03cp 0avio 302k ping
    104 30.55re 0.03cp 0avio 394k sh
    162 0.11re 0.03cp 0avio 413k security.sh*
    154 0.03re 0.02cp 0avio 273k ls
    56 31.61re 0.02cp 0avio 823k ping6.pl*
    2 3.23re 0.02cp 0avio 822k ping6.pl
    35 0.02re 0.01cp 0avio 257k md5sum
    97 0.02re 0.01cp 0avio 263k initlog
    12 0.19re 0.01cp 0avio 399k promisc_check.s
    15 0.09re 0.00cp 0avio 288k grep
    11 0.08re 0.00cp 0avio 332k awk



    用户还可以根据用户而不是命令来提供一个摘要报告。例如,键入命令"sa -m",将显示如下内容: 

      
    885 173.28re 4.31cp 0avk
    root 879 173.23re 4.31cp 0avk
    alias 3 0.05re 0.00cp 0avk
    qmailp 3 0.01re 0.00cp 0avk







      syslog设备 

      syslog已被许多日志函数采纳,它用在许多保护措施中。任何程序都可以通过syslog 记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。 

      syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件。习惯上, 多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的 名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。 

    每个syslog消息被赋予下面的主要设备之一: 

      
    LOG_AUTH:认证系统login、su、getty等。
    LOG_AUTHPRIV:同LOG_AUTH,但只登录到所选择的单个用户可读的文件中。
    LOG_CRON:cron守护进程。
    LOG_DAEMON:其他系统守护进程,如routed。
    LOG_FTP:文件传输协议ftpd、tftpd。
    LOG_KERN:内核产生的消息。
    LOG_LPR:系统打印机缓冲池lpr、lpd。
    LOG_MAIL:电子邮件系统。
    LOG_NEWS:网络新闻系统。
    LOG_SYSLOG:由syslogd(8)产生的内部消息。
    LOG_USER:随机用户进程产生的消息。
    LOG_UUCP:UUCP子系统。
    LOG_LOCAL0~LOG_LOCAL7:为本地使用保留。
    syslog为每个事件赋予几个不同的优先级:
    LOG_EMERG:紧急情况。
    LOG_ALERT:应该被立即改正的问题,如系统数据库被破坏。
    LOG_CRIT:重要情况,如硬盘错误。
    LOG_ERR:错误。
    LOG_WARNING:警告信息。
    LOG_NOTICE:不是错误情况,但是可能需要处理。
    LOG_INFO:情报信息。
    LOG_DEBUG:包含情报的信息,通常只在调试一个程序时使用。



      syslog.conf文件指明syslogd程序记录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个 条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab符隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一 个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成的。当指明一个优先级时,syslogd将记录一个拥有相同或更高优先级的消息。 所以如果指明"crit",那所有标为crit、alert和emerg的消息将被记录。每行的行动域指明当选择域选择了一个给定消息后应该把它发送到哪 儿。例如,如果想把所有邮件消息记录到一个文件中,如下所示: 



     
    #Log all the mail messages in one place

    mail.* /var/log/maillog






      其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如: 


     
    # Save mail and news errors of level err and higher in aspecial file.
    uucp,news.crit /var/log/spooler



      当一个紧急消息到来时,可能想让所有的用户都得到,也可能想让自己的日志接收并保存:




     
    #Everybody gets emergency messages, plus log them on anther machine
    *.emerg *
    *.emerg @linuxaid.com.cn





      alert消息应该写到root和tiger的个人账号中: 

     
    #Root and Tiger get alert and higher messages
    *.alert root,tiger



      有时syslogd将产生大量的消息。例如,内核("kernel"设备)可能很冗长。用户可能想把内核消息记录到/dev/console中。下面的例子表明内核日志记录被注释掉了: 

     
    #Log all kernel messages to the console
    #Logging much else clutters up the screen
    #kern.* /dev/console



      用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别"none"禁止一个设备: 

     
    #Log anything(except mail)of level info or higher
    #Don't log private authentication messages!
    *.info:mail.none;authpriv.none /var/log/messages



      在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志就都没有用了。通常要广泛记录日志。syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。 

    有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。


      用法:logger  

      例如:logger This is a test! 

      它将产生一个如下的syslog记录:Aug 19 22:22:34 tiger: This is a test! 

      注意,不要完全相信日志,因为攻击者很容易修改它的。 

      程序日志与其他 

      许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的日志文件为 sulog。同样的还有sudolog。另外,像Apache有两个日志:access_log和error_log。还有一些常用到的其他日志工具,我 们就不一一阐述了,有兴趣的读者可以参考下边网址的内容。 

    Chklastlog: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/chklastlog/ 

    chkwtmp: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/chkwtmp/ 

    dump_lastlog: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/dump_lastlog.Z 

    spar: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/TAMU/ 

    Swatch: 

    http://www.lomar.org/komar/alek/pres/swatch/cover.html 

    Zap: 

    ftp://caost.cs.purdue.edu/pub/tools/unix/zap.tar.gz 

    日志分类方法: 

    http://csrc.nist.gov/nissc/1998/proceedings/paperD1.pdf



    配置Linux日志文件: 日志也应该是用户注意的地方。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件,用户可以通过日志文件检查 错误产生的原因,或者在受到攻击、被入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是审核和监测。配置好的Linux的日志非常强大。对于Linux 系统而言,所有的日志文件在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改 /etc/ftpacess让系统记录FTP的一切活动。

    /etc/syslog.conf的格式 

      Linux系统的日志文件是可以配置的,在前面的章节中已经介绍了如何定制Apache、wu-ftpd、Sendmail的日志文 件。Linux系统的日志文件是由/etc/syslog.conf决定的,用户有必要花时间仔细配置一下/etc/syslog.conf。下面是 /etc/syslog.conf的范例: 

    # Log all kernel messages to the kernlog.
    # Logging much else clutters up the screen.
    kern.* /var/log/kernlog

    # Log anything (except mail) of level info or higher.
    # Don't log private authentication messages!
    *.info;mail.none;news.none;authpriv.none;cron.none
    /var/log/messages
    *.warning /var/log/syslog
    # The authpriv file has restricted access.
    authpriv.* /var/log/secure

    # Log all the mail messages in one place.
    mail.* /var/log/maillog

    # Log cron stuff
    cron.* /var/log/cron

    # Everybody gets emergency messages, plus log them on another
    # machine.
    *.emerg
    # Save mail and news errors of level err and higher in a
    # special file.
    uucp,news.crit /var/log/spooler

    # Save boot messages also to boot.log
    local7.* /var/log/boot.log

    # INN
    news.=crit /var/log/news/news.crit
    news.=err /var/log/news/news.err
    news.notice /var/log/news/news.notice


      可以看出,该配置文件的每一行的第一个字段列出要被记录的信息种类,第二个字段则列出被记录的位置。第一个字段使用下面的格式:facility.level[;facility.level…] 

      此处的faciity是产生信息的系统应用程序或工具,level则是这个信息的重要程度。level的重要程度由低到高依次是: debug(调试消息)、info(一般消息)、notice(值得注意的消息)、warning(警告)、err(一般性错误)、crit(严重错 误)、alert(或emerg,紧急情况)。facility包含有:auth(认证系统,如login或su,即询问用户名和口令)、cron(系统 执行定时任务时发出的信息)、daemon(某些系统的守护程序的syslog,如由in.ftpd产生的log)、kern(内核的信息)、lpr(打 印机的信息)、mail(处理邮件的守护进程发出的信息)、mark(定时发送消息的时标程序)、news(新闻组的守护进程的信息)、user(本地用 户的应用程序的信息)、uucp(uucp子系统的信息)和“*”(表示所有可能的facility)。 

      将日志文件记录到远程主机 

      如果有另一个Linux或UNIX系统,那么可以配置日志文件,让其把消息发到另外一个系统并记录下来。这也是为什么上面的所有日志 文件都记录了主机名的原因。要实现这个功能,在该配置文件中,指定一个记录动作,后面接一个由“@”开头的远程系统的主机名,如下例:*.warn; authpriv.notice;auth.notice @bright.hacker.com.cn 

      同时,还要将接受消息的目的系统设置为允许这种操作。此例主机bright.hacker.com.cn的syslogd守护进程 要用-r参数启动。如果不使用-r参数,则目标主机的syslogd将丢弃这个消息以避免DoS攻击使硬盘塞满虚假消息。并且确保目标主机的 /etc/service文件必须设置syslog服务所使用的UDP端口514(这也是RedHat Linux默认的设置)。如果syslogd守护进程用了-r和-h参数,那么,参数-h将允许转发消息。也就是说,如果系统B的syslogd用了-h 参数,这样,当系统A把消息转发到系统B后,系统B就把来自系统A和它自己的消息转发到系统C。 

      将警告信息发送到控制台 

      syslogd可以将任何从内核发出的重要程度为emerg或alert的信息发送到控制台。控制台是指虚拟控制台或启动时加-C参 数的xterm。要实现这一功能,在/etc/syslog.conf文件中加上下面一行:kern.emerg /dev/console 

      这样,当系统内核发生错误而发出消息时,用户能够马上知道并且进行处理。如果用了“*”,就是一旦内核发生错误,就将消息发送给所 有在线用户,但只有这个用户正在登录的时候才能看到。修改了/etc/syslog.conf文件后,必须重新启动syslogd守护进程以使配置更改生 效,请执行下面的命令:#/etc/rc.d/init.d/syslog restart



    管理Linux日志文件工具:logrotate简介: 如果服务器有大量的用户的话,这些日志文件的大小会很快地增加,在服务器硬盘不是非常充足的情况下,必须采取措施防止日志文件将硬盘撑爆。现代的 Linux版本都有一个小程序,名为logrotate,用来帮助用户管理日志文件,它以自己的守护进程工作。logrotate周期性地旋转日志文件, 可以周期性地把每个日志文件重命名成一个备份名字,然后让它的守护进程开始使用一个日志文件的新的拷贝。这就是为什么在/var/log/下看到许多诸如 maillog、maillog.1、maillog.2、boot.log.1、boot.log.2之类的文件名。它由一个配置文件驱动,该文件是 /etc/logroatate.conf

    下面是它的一个范例: 

    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    #以7天为一个周期
    # keep 4 weeks worth of backlogs
    rotate 4
    #每隔4周备份日志文件
    # send errors to root
    errors root
    #发生错误向root报告
    # create new (empty) log files after rotating old ones
    create
    #转完旧的日志文件就创建新的日志文件
    # uncomment this if you want your log files compressed
    #compress
    #指定是否压缩日志文件
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d

    # no packages own lastlog or wtmp -- we'll rotate them here
    /var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
    }

    # system-specific logs may be configured here



    Linux下常用日志分析工具:Logcheck简介: 对于拥有大量账户、系统繁忙的Linux系统而言,其日志文件是极其庞大的,很多没有用的信息会将值得注意的信息淹没,给用户分析日志带来了很大的不便。 现在有一些专门用于分析日志的工具,如Logcheck和Friends。Logcheck用来分析庞大的日志文件,过滤出有潜在安全风险或其他不正常情 况的日志项目,然后以电子邮件的形式通知指定的用户。它是由Psionic开发的(T113)

    可以到http://www.psionic.com/tools/logcheck-1.1.1.tar.gz下载。或者去http://www.psionic.com/abacus /logcheck/看看是否有新的版本。 

      该程序的安装相当方便。解压后运行make文件,按照它的提示选择操作系统的类型以后就能编译完成了。配置文件和运行脚本默认安装在/usr/local/etc/下。 

      logcheck.sh 

      这是Logcheck的shell脚本,用于分析本次的日志文件并汇报结果。 

      logcheck.hacking 

      这个文件设置在日志文件中过滤的关键字,该关键字提示了潜在安全风险的信息。用户可以定制自己的日志文件,在logcheck.hacking文件中增加或删除关键字。 

      logcheck.violations 

      这个文件设置在日志文件分析过滤系统运行时出现异常情况的关键字。 

      logcheck.violations.ignore 

      如果系统出现异常情况,但含有此文件中的关键字,则视为正常,不写入Logcheck的分析报告文件中。 

      logcheck.ignore 

      如果系统日志文件记录了可能遭遇攻击的消息,但含有logcheck.ignore文件中的关键字,则Logcheck视为正常,在分析报告文件中不包含这些消息。 

      安装完Logcheck后,还要修改logcheck.sh文件中的参数以符合用户的要求。有两点值得注意。下列命令: 

    # Person to send log activity to.
    SYSADMIN=root


      Logcheck默认将报告发给root。如果要发给指定的电子邮箱,改动这里就可以了。如果希望将报告发给多个用户,可以定义mail的别名。要检查的日志文件的设置: 

    # Linux
    $LOGTAIL /var/log/syslog > $TMPDIR/check.$$
    $LOGTAIL /var/log/messages >> $TMPDIR/check.$$

    用户可以根据需要加上要检查的日志文件,例如:
    $LOGTAIL /var/log/auth.log >> $TMPDIR/check.$$
    $LOGTAIL /var/log/deamon.log >> $TMPDIR/check.$$
    $LOGTAIL /var/log/mail.log >> $TMPDIR/check.$$


      最后用cron安排服务器自动定时重复执行logcheck.sh脚本文件。
    Linux日志分析的实战专题
    作者:刘志勇 郭聪辉 发文时间:2004.11.23
    日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件。用户可以通过日志文件 检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是:审核和监测。配置好的Linux的日志非常强大。对于 Linux系统而言,所有的日志文件都在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改 /etc/ftpacess让系统记录FTP的一切活动。

    Linux日志系统简介: 日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日 志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错 误日志。


      Linux日志系统 

      日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。 

      Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错误日志。 

      连接时间日志 

      连接时间日志由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmp。login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。 

      进程统计日志 

      进程统计日志由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。 

      错误日志 

      错误日志由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外还有许多UNIX类程序创建日志,像HTTP和FTP这样提供网络服务的服务器也有详细的日志。 





    Redhat Linux 常见的日志文件和常用命令:成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索和阅读它们。还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。 Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有root账户才可以读,不过修改文件的访问权限 就可以让其他人可读。

    成功地管理任何系统的关键之一,是要知道系统中正在 发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索和阅读它们。还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。 Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有root账户才可以读,不过修改文件的访问权限 就可以让其他人可读。

      RedHat Linux常用的日志文件

      RedHat Linux常见的日志文件详述如下
      /var/log/boot.log
      该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息。

      /var/log/cron
      该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。CMD的一个动作 是cron派生出一个调度进程的常见情况。REPLACE(替换)动作记录用户对它的cron文件的更新,该文件列出了要周期性执行的任务调度。 RELOAD动作在REPLACE动作后不久发生,这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查 到一些反常的情况。

      /var/log/maillog
      该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。下面是该日志文件的片段:

      
    Sep 4 17:23:52 UNIX sendmail[1950]: g849Npp01950: from=root, size=25,
    class=0, nrcpts=1,
    msgid=<200209040923.g849Npp01950@redhat.pfcc.com.cn>,
    relay=root@localhost
    Sep 4 17:23:55 UNIX sendmail[1950]: g849Npp01950: to=lzy@fcceec.net,
    ctladdr=root (0/0), delay=00:00:04, xdelay=00:00:03, mailer=esmtp, pri=30025,
    relay=fcceec.net. [10.152.8.2], dsn=2.0.0, stat=Sent (Message queued)
    /var/log/messages



      该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。如以下几行:


      
    Sep 3 08:30:17 UNIX login[1275]: FAILED LOGIN 2 FROM (null) FOR suying,
    Authentication failure
    Sep 4 17:40:28 UNIX -- suying[2017]: LOGIN ON pts/1 BY suying FROM
    fcceec.www.ec8.pfcc.com.cn
    Sep 4 17:40:39 UNIX su(pam_unix)[2048]: session opened for user root by suying(uid=999)



      该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号、一个冒号和一个空格,最后是消息。该文件有一个不足,就是被记 录的入侵企图和成功的入侵事件,被淹没在大量的正常进程的记录中。但该文件可以由/etc/syslog文件进行定制。由 /etc/syslog.conf配置文件决定系统如何写入/var/messages。有关如何配置/etc/syslog.conf文件决定系统日志 记录的行为,将在后面详细叙述。

      /var/log/syslog
      默认RedHat Linux不生成该日志文件,但可以配置/etc/syslog.conf让系统生成该日志文件。它和/etc/log/messages日志文件不同, 它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件。要让系统生成该日志文件,在/etc/syslog.conf文件中加上: *.warning /var/log/syslog   该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。下面是一条记录:

      
    Sep 6 16:47:52 UNIX login(pam_unix)[2384]: check pass; user unknown
    /var/log/secure
    该日志文件记录与安全相关的信息。该日志文件的部分内容如下:
    Sep 4 16:05:09 UNIX xinetd[711]: START: ftp pid=1815 from=127.0.0.1
    Sep 4 16:05:09 UNIX xinetd[1815]: USERID: ftp OTHER :root
    Sep 4 16:07:24 UNIX xinetd[711]: EXIT: ftp pid=1815 duration=135(sec)
    Sep 4 16:10:05 UNIX xinetd[711]: START: ftp pid=1846 from=127.0.0.1
    Sep 4 16:10:05 UNIX xinetd[1846]: USERID: ftp OTHER :root
    Sep 4 16:16:26 UNIX xinetd[711]: EXIT: ftp pid=1846 duration=381(sec)
    Sep 4 17:40:20 UNIX xinetd[711]: START: telnet pid=2016 from=10.152.8.2
    /var/log/lastlog


      该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件是二进制文件,需 要使用lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似如下的信息: 



    Username Port From Latest
    root tty2 Tue Sep 3 08:32:27 +0800 2002
    bin **Never logged in**
    daemon **Never logged in**
    adm **Never logged in**
    lp **Never logged in**
    sync **Never logged in**
    shutdown **Never logged in**
    halt **Never logged in**
    mail **Never logged in**
    news **Never logged in**
    uucp **Never logged in**
    operator **Never logged in**
    games **Never logged in**
    gopher **Never logged in**
    ftp ftp UNIX Tue Sep 3 14:49:04 +0800 2002
    nobody **Never logged in**
    nscd **Never logged in**
    mailnull **Never logged in**
    ident **Never logged in**
    rpc **Never logged in**
    rpcuser **Never logged in**
    xfs **Never logged in**
    gdm **Never logged in**
    postgres **Never logged in**
    apache **Never logged in**
    lzy tty2 Mon Jul 15 08:50:37 +0800 2002
    suying tty2 Tue Sep 3 08:31:17 +0800 2002



      系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录,如果发现这些账户已经登录,就说明系统可能已经被入侵了。若发现记录的时间不是用户上次登录的时间,则说明该用户的账户已经泄密了。 

      /var/log/wtmp 

      该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加 的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录 记录,last也能根据用户、终端 tty或时间显示相应的记录。 

      命令last有两个可选参数: 

      last -u 用户名 显示用户上次登录的情况。 

      last -t 天数 显示指定天数之前的用户登录情况。 

      /var/run/utmp 

      该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会 为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时 更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。 

      以上提及的3个文件(/var/log/wtmp、/var/run/utmp、/var/log/lastlog)是日志子系统 的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文 件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的 具体的数据结构可以使用man命令查询。 

      每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写 到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。 utmp文件被各种命令使用,包括who、w、users和finger。 

      下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。 

      /var/log/xferlog 

      该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。 

      该文件的格式为:第一个域是日期和时间,第二个域是下载文件所花费的秒数、远程系统名称、文件大小、本地路径名、传输类型(a: ASCII,b:二进制)、与压缩相关的标志或tar,或"_"(如果没有压缩的话)、传输方向(相对于服务器而言:i代表进,o代表出)、访问模式 (a:匿名,g:输入口令,r:真实用户)、用户名、服务名(通常是ftp)、认证方法(l:RFC931,或0),认证用户的ID或"*"。下面是该文 件的一条记录: 

     
    Wed Sep 4 08:14:03 2002 1 UNIX 275531
    /var/ftp/lib/libnss_files-2.2.2.so b _ o a -root@UNIX ftp 0 * c
    /var/log/kernlog



       RedHat Linux默认没有记录该日志文件。要启用该日志文件,必须在/etc/syslog.conf文件中添加一行:kern.* /var/log/kernlog 。这样就启用了向/var/log/kernlog文件中记录所有内核消息的功能。该文件记录了系统启动时加载设备或使用设备的情况。一般是正常的操作, 但如果记录了没有授权的用户进行的这些操作,就要注意,因为有可能这就是恶意用户的行为。下面是该文件的部分内容: 

      
    Sep 5 09:38:42 UNIX kernel: NET4: Linux TCP/IP 1.0 for NET4.0
    Sep 5 09:38:42 UNIX kernel: IP Protocols: ICMP, UDP, TCP, IGMP
    Sep 5 09:38:42 UNIX kernel: IP: routing cache hash table of 512 buckets, 4Kbytes
    Sep 5 09:38:43 UNIX kernel: TCP: Hash tables configured (established 4096 bind 4096)
    Sep 5 09:38:43 UNIX kernel: Linux IP multicast router 0.06 plus PIM-SM
    Sep 5 09:38:43 UNIX kernel: NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
    Sep 5 09:38:44 UNIX kernel: EXT2-fs warning: checktime reached, running e2fsck is recommended
    Sep 5 09:38:44 UNIX kernel: VFS: Mounted root (ext2 filesystem).
    Sep 5 09:38:44 UNIX kernel: SCSI subsystem driver Revision: 1.00
    /var/log/Xfree86.x.log



      该日志文件记录了X-Window启动的情况。另外,除了/var/log/外,恶意用户也可能在别的地方留下痕迹,应该注意以下几 个地方:root和其他账户的shell历史文件;用户的各种邮箱,如.sent、mbox,以及存放在/var/spool/mail/ 和 /var/spool/mqueue中的邮箱;临时文件/tmp、/usr/tmp、/var/tmp;隐藏的目录;其他恶意用户创建的文件,通常是以 "."开头的具有隐藏属性的文件等。 

      具体命令 

      wtmp和utmp文件都是二进制文件,它们不能被诸如tail之类的命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac等命令来使用这两个文件包含的信息。 

      who命令 

      who命令查询utmp文件并报告当前登录的每个用户。who的默认输出包括用户名、终端类型、登录日期及远程主机。例如,键入who命令,然后按回车键,将显示如下内容: 




    chyang pts/0 Aug 18 15:06
    ynguo pts/2 Aug 18 15:32
    ynguo pts/3 Aug 18 13:55
    lewis pts/4 Aug 18 13:35
    ynguo pts/7 Aug 18 14:12
    ylou pts/8 Aug 18 14:15



      如果指明了wtmp文件名,则who命令查询所有以前的记录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。 

      w命令 

      w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如,键入w命令,然后按回车键,将显示如下内容:




      
    3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
    ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05 w
    lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash
    lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/
    ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail
    ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash



      users命令 

      users命令用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如,键入users命令,然后按回车键,将显示如下内容: 

      chyang lewis lewis ylou ynguo ynguo 

      last命令 

      last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如: 

      
    chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
    cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
    chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
    lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
    lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)



      如果指明了用户,那么last只报告该用户的近期活动,例如,键入last ynguo命令,然后按回车键,将显示如下内容: 

      
    ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
    ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
    ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
    ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)
    ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)



      ac命令 

      ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间(小时),如果不使用标志,则报告总的时间。例如,键入ac命令,然后按回车键,将显示如下内容: 

      total 5177.47 

    键入ac -d命令,然后按回车键,将显示每天的总的连接时间: 

      
    Aug 12 total 261.87
    Aug 13 total 351.39
    Aug 14 total 396.09
    Aug 15 total 462.63
    Aug 16 total 270.45
    Aug 17 total 104.29
    Today total 179.02



      键入ac -p命令,然后按回车键,将显示每个用户的总的连接时间: 

      
    ynguo 193.23
    yucao 3.35
    rong 133.40
    hdai 10.52
    zjzhu 52.87
    zqzhou 13.14
    liangliu 24.34
    total 5178.24



      lastlog命令 

      lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示 **Never logged**。注意需要以root身份运行该命令,例如: 

      
    rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
    dbb **Never logged in**
    xinchen **Never logged in**
    pb9511 **Never logged in**
    xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000



    另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。 

      进程统计 

      UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它还对跟踪一个侵入者有 帮助。与连接时间日志不同,进程统计子系统默认不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。 accton命令的形式为:accton file,file必须事先存在。先使用touch命令创建pacct文件:touch /var/log/pacct,然后运行accton:accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何 参数的accton命令。 

      lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内记录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。看下面的例子: 



      
    crond F root ?? 0.00 secs Sun Aug 20 00:16
    promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
    promisc_check root ?? 0.01 secs Sun Aug 20 00:16
    grep root ?? 0.02 secs Sun Aug 20 00:16
    tail root ?? 0.01 secs Sun Aug 20 00:16
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.01 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.02 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
    sh root ?? 0.02 secs Sun Aug 20 00:15
    ping S root ?? 0.00 secs Sun Aug 20 00:15
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.01 secs Sun Aug 20 00:15
    ping S root ?? 0.01 secs Sun Aug 20 00:15
    sh root ?? 0.02 secs Sun Aug 20 00:15
    ping S root ?? 1.34 secs Sun Aug 20 00:15
    locate root ttyp0 1.34 secs Sun Aug 20 00:15
    accton S root ttyp0 0.00 secs Sun Aug 20 00:15



      进程统计的一个问题是pacct文件可能增长得十分迅速。这时需要交互式地或经过cron机制运行sa命令来保证日志数据在系统控制 内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和 /var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。在默认情况下sa先读它们,然后读pacct文件,使报告能包含 所有的可用信息。sa的输出有下面一些标记项。


    avio:每次执行的平均I/O操作次数。 

    cp:用户和系统时间总和,以分钟计。 

    cpu:和cp一样。 

    k:内核使用的平均CPU时间,以1k为单位。 

    k*sec:CPU存储完整性,以1k-core秒为单位。 

    re:实时时间,以分钟计。 

    s:系统时间,以分钟计。 

    tio:I/O操作的总数。 

    u:用户时间,以分钟计。 

    例如:


      
    842 173.26re 4.30cp 0avio 358k
    2 10.98re 4.06cp 0avio 299k find
    9 24.80re 0.05cp 0avio 291k ***other
    105 30.44re 0.03cp 0avio 302k ping
    104 30.55re 0.03cp 0avio 394k sh
    162 0.11re 0.03cp 0avio 413k security.sh*
    154 0.03re 0.02cp 0avio 273k ls
    56 31.61re 0.02cp 0avio 823k ping6.pl*
    2 3.23re 0.02cp 0avio 822k ping6.pl
    35 0.02re 0.01cp 0avio 257k md5sum
    97 0.02re 0.01cp 0avio 263k initlog
    12 0.19re 0.01cp 0avio 399k promisc_check.s
    15 0.09re 0.00cp 0avio 288k grep
    11 0.08re 0.00cp 0avio 332k awk



    用户还可以根据用户而不是命令来提供一个摘要报告。例如,键入命令"sa -m",将显示如下内容: 

      
    885 173.28re 4.31cp 0avk
    root 879 173.23re 4.31cp 0avk
    alias 3 0.05re 0.00cp 0avk
    qmailp 3 0.01re 0.00cp 0avk







      syslog设备 

      syslog已被许多日志函数采纳,它用在许多保护措施中。任何程序都可以通过syslog 记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。 

      syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件。习惯上, 多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的 名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。 

    每个syslog消息被赋予下面的主要设备之一: 

      
    LOG_AUTH:认证系统login、su、getty等。
    LOG_AUTHPRIV:同LOG_AUTH,但只登录到所选择的单个用户可读的文件中。
    LOG_CRON:cron守护进程。
    LOG_DAEMON:其他系统守护进程,如routed。
    LOG_FTP:文件传输协议ftpd、tftpd。
    LOG_KERN:内核产生的消息。
    LOG_LPR:系统打印机缓冲池lpr、lpd。
    LOG_MAIL:电子邮件系统。
    LOG_NEWS:网络新闻系统。
    LOG_SYSLOG:由syslogd(8)产生的内部消息。
    LOG_USER:随机用户进程产生的消息。
    LOG_UUCP:UUCP子系统。
    LOG_LOCAL0~LOG_LOCAL7:为本地使用保留。
    syslog为每个事件赋予几个不同的优先级:
    LOG_EMERG:紧急情况。
    LOG_ALERT:应该被立即改正的问题,如系统数据库被破坏。
    LOG_CRIT:重要情况,如硬盘错误。
    LOG_ERR:错误。
    LOG_WARNING:警告信息。
    LOG_NOTICE:不是错误情况,但是可能需要处理。
    LOG_INFO:情报信息。
    LOG_DEBUG:包含情报的信息,通常只在调试一个程序时使用。



      syslog.conf文件指明syslogd程序记录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个 条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab符隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一 个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成的。当指明一个优先级时,syslogd将记录一个拥有相同或更高优先级的消息。 所以如果指明"crit",那所有标为crit、alert和emerg的消息将被记录。每行的行动域指明当选择域选择了一个给定消息后应该把它发送到哪 儿。例如,如果想把所有邮件消息记录到一个文件中,如下所示: 



     
    #Log all the mail messages in one place

    mail.* /var/log/maillog






      其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如: 


     
    # Save mail and news errors of level err and higher in aspecial file.
    uucp,news.crit /var/log/spooler



      当一个紧急消息到来时,可能想让所有的用户都得到,也可能想让自己的日志接收并保存:




     
    #Everybody gets emergency messages, plus log them on anther machine
    *.emerg *
    *.emerg @linuxaid.com.cn





      alert消息应该写到root和tiger的个人账号中: 

     
    #Root and Tiger get alert and higher messages
    *.alert root,tiger



      有时syslogd将产生大量的消息。例如,内核("kernel"设备)可能很冗长。用户可能想把内核消息记录到/dev/console中。下面的例子表明内核日志记录被注释掉了: 

     
    #Log all kernel messages to the console
    #Logging much else clutters up the screen
    #kern.* /dev/console



      用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别"none"禁止一个设备: 

     
    #Log anything(except mail)of level info or higher
    #Don't log private authentication messages!
    *.info:mail.none;authpriv.none /var/log/messages



      在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志就都没有用了。通常要广泛记录日志。syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。 

    有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。


      用法:logger  

      例如:logger This is a test! 

      它将产生一个如下的syslog记录:Aug 19 22:22:34 tiger: This is a test! 

      注意,不要完全相信日志,因为攻击者很容易修改它的。 

      程序日志与其他 

      许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的日志文件为 sulog。同样的还有sudolog。另外,像Apache有两个日志:access_log和error_log。还有一些常用到的其他日志工具,我 们就不一一阐述了,有兴趣的读者可以参考下边网址的内容。 

    Chklastlog: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/chklastlog/ 

    chkwtmp: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/chkwtmp/ 

    dump_lastlog: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/dump_lastlog.Z 

    spar: 

    ftp://coast.cs.purdue.edu/pub/tools/unix/TAMU/ 

    Swatch: 

    http://www.lomar.org/komar/alek/pres/swatch/cover.html 

    Zap: 

    ftp://caost.cs.purdue.edu/pub/tools/unix/zap.tar.gz 

    日志分类方法: 

    http://csrc.nist.gov/nissc/1998/proceedings/paperD1.pdf



    配置Linux日志文件: 日志也应该是用户注意的地方。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件,用户可以通过日志文件检查 错误产生的原因,或者在受到攻击、被入侵时追踪攻击者的踪迹。日志的两个比较重要的作用是审核和监测。配置好的Linux的日志非常强大。对于Linux 系统而言,所有的日志文件在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改 /etc/ftpacess让系统记录FTP的一切活动。

    /etc/syslog.conf的格式 

      Linux系统的日志文件是可以配置的,在前面的章节中已经介绍了如何定制Apache、wu-ftpd、Sendmail的日志文 件。Linux系统的日志文件是由/etc/syslog.conf决定的,用户有必要花时间仔细配置一下/etc/syslog.conf。下面是 /etc/syslog.conf的范例: 

    # Log all kernel messages to the kernlog.
    # Logging much else clutters up the screen.
    kern.* /var/log/kernlog

    # Log anything (except mail) of level info or higher.
    # Don't log private authentication messages!
    *.info;mail.none;news.none;authpriv.none;cron.none
    /var/log/messages
    *.warning /var/log/syslog
    # The authpriv file has restricted access.
    authpriv.* /var/log/secure

    # Log all the mail messages in one place.
    mail.* /var/log/maillog

    # Log cron stuff
    cron.* /var/log/cron

    # Everybody gets emergency messages, plus log them on another
    # machine.
    *.emerg
    # Save mail and news errors of level err and higher in a
    # special file.
    uucp,news.crit /var/log/spooler

    # Save boot messages also to boot.log
    local7.* /var/log/boot.log

    # INN
    news.=crit /var/log/news/news.crit
    news.=err /var/log/news/news.err
    news.notice /var/log/news/news.notice


      可以看出,该配置文件的每一行的第一个字段列出要被记录的信息种类,第二个字段则列出被记录的位置。第一个字段使用下面的格式:facility.level[;facility.level…] 

      此处的faciity是产生信息的系统应用程序或工具,level则是这个信息的重要程度。level的重要程度由低到高依次是: debug(调试消息)、info(一般消息)、notice(值得注意的消息)、warning(警告)、err(一般性错误)、crit(严重错 误)、alert(或emerg,紧急情况)。facility包含有:auth(认证系统,如login或su,即询问用户名和口令)、cron(系统 执行定时任务时发出的信息)、daemon(某些系统的守护程序的syslog,如由in.ftpd产生的log)、kern(内核的信息)、lpr(打 印机的信息)、mail(处理邮件的守护进程发出的信息)、mark(定时发送消息的时标程序)、news(新闻组的守护进程的信息)、user(本地用 户的应用程序的信息)、uucp(uucp子系统的信息)和“*”(表示所有可能的facility)。 

      将日志文件记录到远程主机 

      如果有另一个Linux或UNIX系统,那么可以配置日志文件,让其把消息发到另外一个系统并记录下来。这也是为什么上面的所有日志 文件都记录了主机名的原因。要实现这个功能,在该配置文件中,指定一个记录动作,后面接一个由“@”开头的远程系统的主机名,如下例:*.warn; authpriv.notice;auth.notice @bright.hacker.com.cn 

      同时,还要将接受消息的目的系统设置为允许这种操作。此例主机bright.hacker.com.cn的syslogd守护进程 要用-r参数启动。如果不使用-r参数,则目标主机的syslogd将丢弃这个消息以避免DoS攻击使硬盘塞满虚假消息。并且确保目标主机的 /etc/service文件必须设置syslog服务所使用的UDP端口514(这也是RedHat Linux默认的设置)。如果syslogd守护进程用了-r和-h参数,那么,参数-h将允许转发消息。也就是说,如果系统B的syslogd用了-h 参数,这样,当系统A把消息转发到系统B后,系统B就把来自系统A和它自己的消息转发到系统C。 

      将警告信息发送到控制台 

      syslogd可以将任何从内核发出的重要程度为emerg或alert的信息发送到控制台。控制台是指虚拟控制台或启动时加-C参 数的xterm。要实现这一功能,在/etc/syslog.conf文件中加上下面一行:kern.emerg /dev/console 

      这样,当系统内核发生错误而发出消息时,用户能够马上知道并且进行处理。如果用了“*”,就是一旦内核发生错误,就将消息发送给所 有在线用户,但只有这个用户正在登录的时候才能看到。修改了/etc/syslog.conf文件后,必须重新启动syslogd守护进程以使配置更改生 效,请执行下面的命令:#/etc/rc.d/init.d/syslog restart



    管理Linux日志文件工具:logrotate简介: 如果服务器有大量的用户的话,这些日志文件的大小会很快地增加,在服务器硬盘不是非常充足的情况下,必须采取措施防止日志文件将硬盘撑爆。现代的 Linux版本都有一个小程序,名为logrotate,用来帮助用户管理日志文件,它以自己的守护进程工作。logrotate周期性地旋转日志文件, 可以周期性地把每个日志文件重命名成一个备份名字,然后让它的守护进程开始使用一个日志文件的新的拷贝。这就是为什么在/var/log/下看到许多诸如 maillog、maillog.1、maillog.2、boot.log.1、boot.log.2之类的文件名。它由一个配置文件驱动,该文件是 /etc/logroatate.conf

    下面是它的一个范例: 

    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    #以7天为一个周期
    # keep 4 weeks worth of backlogs
    rotate 4
    #每隔4周备份日志文件
    # send errors to root
    errors root
    #发生错误向root报告
    # create new (empty) log files after rotating old ones
    create
    #转完旧的日志文件就创建新的日志文件
    # uncomment this if you want your log files compressed
    #compress
    #指定是否压缩日志文件
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d

    # no packages own lastlog or wtmp -- we'll rotate them here
    /var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
    }

    # system-specific logs may be configured here



    Linux下常用日志分析工具:Logcheck简介: 对于拥有大量账户、系统繁忙的Linux系统而言,其日志文件是极其庞大的,很多没有用的信息会将值得注意的信息淹没,给用户分析日志带来了很大的不便。 现在有一些专门用于分析日志的工具,如Logcheck和Friends。Logcheck用来分析庞大的日志文件,过滤出有潜在安全风险或其他不正常情 况的日志项目,然后以电子邮件的形式通知指定的用户。它是由Psionic开发的(T113)

    可以到http://www.psionic.com/tools/logcheck-1.1.1.tar.gz下载。或者去http://www.psionic.com/abacus /logcheck/看看是否有新的版本。 

      该程序的安装相当方便。解压后运行make文件,按照它的提示选择操作系统的类型以后就能编译完成了。配置文件和运行脚本默认安装在/usr/local/etc/下。 

      logcheck.sh 

      这是Logcheck的shell脚本,用于分析本次的日志文件并汇报结果。 

      logcheck.hacking 

      这个文件设置在日志文件中过滤的关键字,该关键字提示了潜在安全风险的信息。用户可以定制自己的日志文件,在logcheck.hacking文件中增加或删除关键字。 

      logcheck.violations 

      这个文件设置在日志文件分析过滤系统运行时出现异常情况的关键字。 

      logcheck.violations.ignore 

      如果系统出现异常情况,但含有此文件中的关键字,则视为正常,不写入Logcheck的分析报告文件中。 

      logcheck.ignore 

      如果系统日志文件记录了可能遭遇攻击的消息,但含有logcheck.ignore文件中的关键字,则Logcheck视为正常,在分析报告文件中不包含这些消息。 

      安装完Logcheck后,还要修改logcheck.sh文件中的参数以符合用户的要求。有两点值得注意。下列命令: 

    # Person to send log activity to.
    SYSADMIN=root


      Logcheck默认将报告发给root。如果要发给指定的电子邮箱,改动这里就可以了。如果希望将报告发给多个用户,可以定义mail的别名。要检查的日志文件的设置: 

    # Linux
    $LOGTAIL /var/log/syslog > $TMPDIR/check.$$
    $LOGTAIL /var/log/messages >> $TMPDIR/check.$$

    用户可以根据需要加上要检查的日志文件,例如:
    $LOGTAIL /var/log/auth.log >> $TMPDIR/check.$$
    $LOGTAIL /var/log/deamon.log >> $TMPDIR/check.$$
    $LOGTAIL /var/log/mail.log >> $TMPDIR/check.$$


      最后用cron安排服务器自动定时重复执行logcheck.sh脚本文件。
    展开全文
  • 参考:https://www.runoob.com/linux/nginx-install-setup.html 个人用户下安装 参考:https://blog.csdn.net/YKenan/article/details/100984302 二、可能出现错误 问题解决网址:...

    一、Nginx配置安装    

    参考:https://www.runoob.com/linux/nginx-install-setup.html

    个人用户下安装

    参考:https://blog.csdn.net/YKenan/article/details/100984302

    二、可能出现错误    

    问题解决网址:https://blog.csdn.net/frankcreen/article/details/77460374

    三、配置修改   

    conf/nginx.conf

    #配置日志、pid设置修改

    error_log  /home/jsy/nginx/logs/error.log  info;
    
    pid        /home/jsy/nginx/logs/nginx.pid;

    #监听端口修改,变更为大于1024的端口

    listen       8088;

    四、访问   

       检测nginx是否安装好,输入命令:

    /home/jsy/nginx/sbin/nginx -t

        输入:服务器IP:端口访问,出现如下页面,配置成功

        

    五、访问具体路径问题

     访问具体路径配置:

         参考网址1:  https://blog.csdn.net/weixin_31913525/article/details/78319123 (截图看不了,但解决了访问时出现Ngnix.pid问题)

         参考网址2:https://blog.csdn.net/eakom/article/details/79388631 (配置较为简单,但解决了访问时出现404问题)

        参考网址3:https://blog.csdn.net/qq_27610647/article/details/80721803 (过程很详细)

               

     

    展开全文
  • Linux系统安全日志详解

    千次阅读 2020-01-05 07:48:24
    日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪...

      日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

    1. 日志简介

      日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

      在Linux系统中,有三个主要的日志子系统:

      连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

      进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

      错误日志--由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

      常用的日志文件如下:

      access-log 纪录HTTP/web的传输

      acct/pacct 纪录用户命令

      aculog 纪录MODEM的活动

      btmp 纪录失败的纪录

      lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录

      messages 从syslog中记录信息(有的链接到syslog文件)

      sudolog 纪录使用sudo发出的命令

      sulog 纪录使用su命令的使用

      syslog 从syslog中记录信息(通常链接到messages文件)

      utmp 纪录当前登录的每个用户

      wtmp 一个用户每次登录进入和退出时间的永久纪录

      xferlog 纪录FTP会话

      utmp、wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键--保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件wtmp中;最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件(lastlog通常不大)在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp.1变为wtmp.2等等,直到wtmp.7。

      每次有一个用户登录时,login程序在文件lastlog中察看用户的UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后,utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用,包括who、w、users和finger。

      下一步,login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时,具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。

      2. 具体命令

      wtmp和utmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

      who:who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如:who(回车)显示

    chyang pts/0 Aug 18 15:06 
    ynguo pts/2 Aug 18 15:32 
    ynguo pts/3 Aug 18 13:55 
    lewis pts/4 Aug 18 13:35 
    ynguo pts/7 Aug 18 14:12 
    ylou pts/8 Aug 18 14:15

      如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

      w:w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如:w(回车)显示:3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27

    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 
    chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash 
    ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05s w 
    lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash 
    lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/ 
    ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail 
    ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash

      users:users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo

      last:last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:

    chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49) 
    cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14) 
    chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40) 
    lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03) 
    lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)

      如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示:

    ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30) 
    ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44) 
    ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16) 
    ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25) 
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12) 
    ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11) 
    ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)

      ac:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47

      ac -d(回车)显示每天的总的连结时间

    Aug 12 total 261.87 
    Aug 13 total 351.39 
    Aug 14 total 396.09 
    Aug 15 total 462.63 
    Aug 16 total 270.45 
    Aug 17 total 104.29 
    Today total 179.02

      ac -p (回车)显示每个用户的总的连接时间

    ynguo 193.23 
    yucao 3.35 
    rong 133.40 
    hdai 10.52 
    zjzhu 52.87 
    zqzhou 13.14 
    liangliu 24.34 
    total 5178.24

      lastlog:lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示"**Never logged**。注意需要以root运行该命令,例如:

    rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000 
    dbb **Never logged in** 
    xinchen **Never logged in** 
    pb9511 **Never logged in** 
    xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000

      另外,可一加一些参数,例如,last -u 102将报告UID为102的用户;last -t 7表示限制上一周的报告。

      3. 进程统计

      UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton file,file必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton: accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。

      lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:

    crond F root ?? 0.00 secs Sun Aug 20 00:16 
    promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16 
    promisc_check root ?? 0.01 secs Sun Aug 20 00:16 
    grep root ?? 0.02 secs Sun Aug 20 00:16 
    tail root ?? 0.01 secs Sun Aug 20 00:16 
    sh root ?? 0.01 secs Sun Aug 20 00:15 
    ping S root ?? 0.01 secs Sun Aug 20 00:15 
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15 
    sh root ?? 0.01 secs Sun Aug 20 00:15 
    ping S root ?? 0.02 secs Sun Aug 20 00:15 
    ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15 
    sh root ?? 0.02 secs Sun Aug 20 00:15 
    ping S root ?? 0.00 secs Sun Aug 20 00:15 
    ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15 
    sh root ?? 0.01 secs Sun Aug 20 00:15 
    ping S root ?? 0.01 secs Sun Aug 20 00:15 
    sh root ?? 0.02 secs Sun Aug 20 00:15 
    ping S root ?? 1.34 secs Sun Aug 20 00:15 
    locate root ttyp0 1.34 secs Sun Aug 20 00:15 
    accton S root ttyp0 0.00 secs Sun Aug 20 00:15

      进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:

      avio--每次执行的平均I/O操作次数

      cp--用户和系统时间总和,以分钟计

      cpu--和cp一样

      k--内核使用的平均CPU时间,以1k为单位

      k*sec--CPU存储完整性,以1k-core秒

      re--实时时间,以分钟计

      s--系统时间,以分钟计

      tio--I/O操作的总数

      u--用户时间,以分钟计

      例如:

    842 173.26re 4.30cp 0avio 358k 
    2 10.98re 4.06cp 0avio 299k find 
    9 24.80re 0.05cp 0avio 291k ***other 
    105 30.44re 0.03cp 0avio 302k ping 
    104 30.55re 0.03cp 0avio 394k sh 
    162 0.11re 0.03cp 0avio 413k security.sh* 
    154 0.03re 0.02cp 0avio 273k ls 
    56 31.61re 0.02cp 0avio 823k ping6.pl* 
    2 3.23re 0.02cp 0avio 822k ping6.pl 
    35 0.02re 0.01cp 0avio 257k md5sum 
    97 0.02re 0.01cp 0avio 263k initlog 
    12 0.19re 0.01cp 0avio 399k promisc_check.s 
    15 0.09re 0.00cp 0avio 288k grep 
    11 0.08re 0.00cp 0avio 332k awk

      用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:

    885 173.28re 4.31cp 0avk 
    root 879 173.23re 4.31cp 0avk 
    alias 3 0.05re 0.00cp 0avk 
    qmailp 3 0.01re 0.00cp 0avk

      4. Syslog设备

      Syslog已被许多日志函数采纳,它用在许多保护措施中--任何程序都可以通过syslog 纪录事件。Syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。

      Syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。

      每个syslog消息被赋予下面的主要设备之一:

      LOG_AUTH--认证系统:login、su、getty等

      LOG_AUTHPRIV--同LOG_AUTH,但只登录到所选择的单个用户可读的文件中

      LOG_CRON--cron守护进程

      LOG_DAEMON--其他系统守护进程,如routed

      LOG_FTP--文件传输协议:ftpd、tftpd

      LOG_KERN--内核产生的消息

      LOG_LPR--系统打印机缓冲池:lpr、lpd

      LOG_MAIL--电子邮件系统

      LOG_NEWS--网络新闻系统

      LOG_SYSLOG--由syslogd(8)产生的内部消息

      LOG_USER--随机用户进程产生的消息

      LOG_UUCP--UUCP子系统

      LOG_LOCAL0~LOG_LOCAL7--为本地使用保留

      Syslog为每个事件赋予几个不同的优先级:

      LOG_EMERG--紧急情况

      LOG_ALERT--应该被立即改正的问题,如系统数据库破坏

      LOG_CRIT--重要情况,如硬盘错误

      LOG_ERR--错误

      LOG_WARNING--警告信息

      LOG_NOTICE--不是错误情况,但是可能需要处理

      LOG_INFO--情报信息

      LOG_DEBUG--包含情报的信息,通常旨在调试一个程序时使用

      syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明"crit",那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:

    #Log all the mail messages in one place
    mail.* /var/log/maillog

      其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如:

    # Save mail and news errors of level err and higher in aspecial file.
    uucp,news.crit /var/log/spooler

      当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

    #Everybody gets emergency messages, plus log them on anther machine
    *.emerg *
    *.emerg @Linuxaid.com.cn

      alert消息应该写到root和tiger的个人账号中:

    #Root and Tiger get alert and higher messages
    *.alert root,tiger

      有时syslogd将产生大量的消息。例如内核("kern"设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:

    #Log all kernel messages to the console
    #Logging much else clutters up the screen
    #kern.* /dev/console

      用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别"none"禁止一个设备:

    #Log anything(except mail)of level info or higher
    #Don"t log private authentication messages!
    *.info:mail.none;authpriv.none /var/log/messages

      在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。

      有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!

      它将产生一个如下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!

      注意不要完全相信日志,因为攻击者很容易修改它的。

      5. 程序日志

      许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog。同样的还有sudolog。另外,想Apache有两个日志:access_log和error_log。

    展开全文
  • 本文介绍了如何通过PostgreSQL扩展模块postgres_fdw实现跨库访问,也就是在一个数据库中访问外部的其他PostgreSQL数据库。具体步骤如下:使用CREATE EXTENSION命令安装postgres_fdw模块;使用CREATE SERVER命令创建...

    fdw

    大家好,我是只谈技术不剪发的 Tony 老师。在某些情况下,例如数据仓库的 ETL 流程中,我们可能需要从一个 PostgreSQL 服务器访问另一个远程 PostgreSQL 服务器中的数据。为此,PostgreSQL 提供了一个扩展的模块:postgres_fdw。今天我们就来介绍一下这个模块的使用方法和案例。

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    postgres_fdw 简介

    postgres_fdw 是基于 SQL/MED 标准开发的一个外部数据封装器(Foreign Data Wrapper),可以用于访问外部 PostgreSQL 服务器,对远程数据表执行 SELECT、INSERT、UPDATE 以及 DELETE 操作。

    与 postgres_fdw 类似的另一个扩展模块是 dblink。它们的功能基本相同,但是 postgres_fdw 提供了更透明且符合标准的语法来访问远程表,并且在很多情况下可以提供更好的性能。postgres_fdw 可以支持的远程服务器最低版本为 PostgreSQL 8.3,如果是只读访问则可以支持到 PostgreSQL 8.1。

    通过 postgres_fdw 访问远程数据表的步骤如下:

    1. 使用CREATE EXTENSION命令安装 postgres_fdw 模块;
    2. 使用CREATE SERVER命令创建一个外部服务器对象,该对象代表了想要连接的远程数据库;
    3. 使用CREATE USER MAPPING命令为本地用户创建一个远程用户映射;
    4. 使用CREATE FOREIGN TABLE或者IMPORT FOREIGN SCHEMA语句为每个远程数据库中的表创建一个外部表。

    然后,就可以通过查询外部表访问远程表中的数据,包括 SELECT、INSERT、UPDATE 以及 DELETE 操作(当然,用户映射时指定的远程用户必须拥有这些表上的相应权限)。接下来我们就通过一个实际案例介绍如何实现以上步骤。

    📝除了 postgres_fdw,PostgreSQL 还支持访问各种数据源的外部数据封装器,包括 Oracle、MySQL、SQL Server、SQLite 等关系型数据库,MongoDB、Redis、Neo4j、Cassandra 等 NoSQL 数据库,CSV、XML、JSON 等文件,Elasticsearch、Hive、HBase 等大数据平台等等,具体可以参考 PostgreSQL Wiki

    postgres_fdw 安装

    首先,我们需要安装 postgres_fdw 模块。对于 Linux 操作系统,可以通过 postgresql-contrib 软件包下载 PostgreSQL 扩展模块;对于 Windows 和 macOS,默认安装已经包含了扩展模块。我们只需要执行以下语句在当前数据库中安装 postgres_fdw 模块:

    CREATE EXTENSION postgres_fdw;
    

    创建外部服务器对象

    然后,使用 CREATE SERVER 语句创建一个外部服务器(foreign server)。例如:

    CREATE SERVER foreign_server
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host '192.168.56.104', port '5432', dbname 'pagila');
    

    其中,foreign_server 是我们指定的外部服务器名称;host 参数是远程服务器的地址,示例中为 192.168.56.104;port 参数是远程服务器的端口,示例中为 5432;dbname 参数是远程数据库的名称,示例中为 pagila。

    📝关于 CREATE SERVER 语句的详细介绍,可以参考官方文档

    创建用户映射

    下一步,使用 CREATE USER MAPPING 语句创建一个用户映射(user mapping),为本地用户指定一个访问远程服务器时的角色。例如:

    CREATE USER MAPPING FOR postgres
    SERVER foreign_server
    OPTIONS (user 'tony', password 'pswd123#');
    

    以上语句为本地 postgres 用户创建了一个访问远程服务器 foreign_server 时的用户映射,也就是使用用户名 tony 和密码 pswd123# 连接远程服务器。

    📝关于 CREATE USER MAPPING 语句的详细介绍,可以参考官方文档

    创建外部表

    然后,使用 CREATE FOREIGN TABLE 语句创建一个外部表(foreign table)。例如:

    CREATE FOREIGN TABLE country (
        country_id int NOT NULL,
    	country varchar(50) NOT NULL,
    	last_update timestamp NOT NULL
    )
    SERVER foreign_server
    OPTIONS (schema_name 'public', table_name 'country');
    

    以上示例在本地数据库中创建了一个名为 country 的外部表,对应的是远程服务器 foreign_server 中 public 模式下的 country 表。

    通常来说,推荐创建外部表时使用和远程表一致的数据类型以及可能的排序规则。虽然目前 postgres_fdw 支持各种类型转换,远程服务器和本地服务器解析 WHERE 子句的细微差别可能会导致意外的语义异常。

    另外,外部表的字段个数可以少于远程表,字段顺序也可以不同;因为字段的映射是通过名称而不是字段位置实现。

    📝关于 CREATE FOREIGN TABLE 语句的详细介绍,可以参考官方文档
    📝另一种创建外部表的方法是使用 IMPORT FOREIGN SCHEMA 语句实现批量导入,具体参考官方文档

    访问远程数据表

    现在,我们可以在本地数据库中通过外部表访问对应的远程表。例如:

    SELECT * 
    FROM country
    LIMIT 5;
    country_id|country       |last_update        |
    ----------|--------------|-------------------|
             1|Afghanistan   |2006-02-15 09:44:00|
             2|Algeria       |2006-02-15 09:44:00|
             3|American Samoa|2006-02-15 09:44:00|
             4|Angola        |2006-02-15 09:44:00|
             5|Anguilla      |2006-02-15 09:44:00|
    

    除了查询操作,postgres_fdw 同样可以通过 DML 语句修改远程表中的数据。对于 INSERT 语句,目前还不支持 ON CONFLICT DO UPDATE 子句;但是可以使用省略了冲突条件的 ON CONFLICT DO NOTHING 子句。例如:

    INSERT INTO country VALUES (109, 'Zambia', '2006-02-15 09:44:00')
    ON CONFLICT DO NOTHING;
    

    另外,虽然 postgres_fdw 支持对分区表执行导致数据行移动的 UPDATE 语句;但是如果远程分区既是行移动的目标分区,又是更新操作的目标分区时,UDATE 语句无法执行。

    postgres_fdw 选项

    在使用 postgres_fdw 创建外部服务器、用户映射以及外部表等对象时,可以通过 OPTIONS 指定一些选项设置不同的行为。

    连接选项

    通过 postgres_fdw 创建远程服务器时的选项和 libpq 连接字符串相同,但是不支持以下选项:

    • userpassword(这两个选项可以在创建用户映射时指定);
    • client_encoding(自动使用本地服务器编码进行设置);
    • fallback_application_name(默认设置为 postgres_fdw)。

    只有超级永远可以不通过密码认证连接远程服务器,所以为普通用户创建用户映射时不要忘记指定 password 选项。

    对象名称选项

    以下选项可以用于控制发送给远程服务器的 SQL 语句中使用的对象名称,只有当外部表定义中的名称和远程表的名称不一致时才需要指定:

    • schema_name,该选项在创建外部表时指定,表示远程表所在的模式;如果省略,默认使用外部表所在的模式名。
    • table_name,该选项在创建外部表时指定,表示远程表的名称;如果省略,默认使用外部表的名称。
    • column_name,该选项在定义外部表的字段名时指定,表示对应远程表中的字段名;如果省略,默认使用外部表的字段名称。

    例如,以下语句重新创建了外部表 country:

    DROP FOREIGN TABLE IF EXISTS country;
    
    CREATE FOREIGN TABLE country (
        id int OPTIONS (column_name 'country_id') NOT NULL,
    	country varchar(50) NOT NULL,
    	last_update timestamp NOT NULL
    )
    SERVER foreign_server;
    

    首先,外部表 country 中的 id 字段和远程表的 country_id 字段名称不同,需要使用 OPTIONS 选项指定名称映射;其次,外部表 country 定义中没有指定 schema_name 和 table_name 选项,表示使用该表在本地数据库中的模式名(public)和表名(country)访问远程表。

    成本评估选项

    postgres_fdw 通过在远程服务器中执行查询语句返回数据,因此理想情况下扫描外部表的评估成本等于远程服务器执行操作的成本加上网络传输成本。获取这个评估成本最可靠的方法就是询问远程服务器并加上一些额外的消耗,但是对于简单查询语句,没有必要为此执行一次额外的远程查询。所以 postgres_fdw 提供了以下用于成本评估的额选项:

    • use_remote_estimate,用于控制 postgres_fdw 是否提交远程 EXPLAIN 命令获取评估成本。该选项支持外部表和外部服务器级别的设置,外部表的设置优先级更高。默认设置为 false。
    • fdw_startup_cost,表示建立连接、远程服务器解析查询和创建执行计划所需的额外成本。该选项支持外部服务器级别的设置,任何外部表的扫描都需要加上这个额外的启动成本。默认值为 100。
    • fdw_tuple_cost,表示服务器之间传输一行数据所需的额外成本。该选项支持外部服务器级别的设置,可以根据网络延迟的情况设置不同的参数。默认值为 0.01。

    如果 use_remote_estimate 设置为 true,postgres_fdw 从远程服务器获取行数和成本评估,然后加上 fdw_startup_cost 和 fdw_tuple_cost;如果 use_remote_estimate 设置为 false,postgres_fdw 执行本地行数和成本评估,然后加上 fdw_startup_cost 和 fdw_tuple_cost。

    本地评估通常不太准确,除非本地存储了远程表的统计信息。诊断外部表执行 ANALYZE 命令可以更新本地统计,该命令会对远程表执行扫描并计算和存储统计信息。保存本地统计可以有效减少访问远程表时的额外成本,但是如果远程表的更新很频繁,本地统计很快就会失效。

    远程执行选项

    默认情况下,只有 WHERE 子句中的内置操作符和函数可能会在远程服务器中执行,非内置函数在返回数据之后在本地进行处理。如果远程服务器中也存在这些函数,并且可以产生相同的结果,在远程服务器中执行可以提高查询的性能。这个行为可以通过以下选项进行控制:

    • extensions,指定一个 PostgreSQL 扩展模块名称的列表,这些模块在本地和远程服务器中都需要安装并且版本兼容。这些模块中的 IMMUTABLE 函数和操作符可能发送到远程服务器执行。该选项只能在外部服务器级别进行设置,不支持表级设置。
    • fetch_size,指定每个批次返回的行数。该选项支持外部表和外部服务器级别的设置,表级设置优先级更高。默认值为 100。

    更新操作选项

    默认情况下,所有的外部表都支持 UPDATE 语句。postgres_fdw 通过以下选项控制该行为:

    • updatable,指定 postgres_fdw 是否允许外部表的 INSERT、UPDATE 以及 DELETE 操作。该选项支持外部表和外部服务器级别的设置,表级设置优先级更高。默认值为 true。

    显然,如果远程表本身不允许更新,UPDATE 语句肯定会返回错误。该选项主要用于本地检查,如果不允许更新就会返回错误,而不需要查询远程服务器。本地数据库中的 information_schema 视图将会根据该选项显示外部表是否可更新,而不会检查远程服务器。

    导入选项

    postgres_fdw 支持使用 IMPORT FOREIGN SCHEMA 语句为指定远程模式中的所有表或视图创建外部表。如果远程表中的字段使用了自定义数据类型,本地服务器中也必须创建同名的兼容类型。

    这种通过 IMPORT FOREIGN SCHEMA 导入外部模式的行为可以通过以下选项进行控制:

    • import_collate,控制导入外部表时是否包含字段的 COLLATE 属性,默认值为 true。如果远程服务器和本地服务器之间的排序规则名称不同时,可以将该选项关闭。
    • import_default,控制导入外部表时是否包含字段的 DEFAULT 表达式,默认值为 false。 如果启用了该选项,需要注意本地服务器上的默认值计算结果可能与远程服务器不同;例如 nextval() 函数的结果。如果默认值表达式使用了本地服务器中不存在的函数或者操作符,所有导入操作都将失败。
    • import_not_null,控制导入外部表时是否包含字段的 NOT NULL 约束,默认值为 true。

    除了 NOT NULL 之外的其他约束不会从远程表中导入到外部表定义。虽然 PostgreSQL 支持外部表的 CHECK 约束,但是不会自动导入该约束,因为本地和远程服务器中的约束表达式的结果可能不一致。任何 CHECK 约束行为的不一致性都可能导致难以发现的查询优化问题如果想要导入 CHECK 约束,必须手动执行操作,并且仔细验证语义的一致性。

    分区结构中的分区不会被导入;分区表会导入,除非它又是其他表的分区。因为通过分区表(分区层级中的根节点)可以访问所有的数据,这种方式可以访问表中的所有数据,不需要创建额外的对象。

    连接管理

    postgres_fdw 在第一次使用外部表时建立一个远程服务器连接,然后在同一个会话中保持并重用该连接。如果使用了多个用户映射访问远程服务器,每个用户映射都会创建一个连接。

    事务管理

    如果查询过程中引用了任何远程表,并且没有打开与本地事务对应的远程事务时,postgres_fdw 会在远程服务器中打开一个事务。远程事务随着本地事务一起提交或者中断。保存点的管理与此类似,也会在远程服务器中创建相应的保存点。

    如果本地事务使用了 SERIALIZABLE 隔离级别,远程事务也使用 SERIALIZABLE 隔离级别;否则远程事务使用 REPEATABLE READ 隔离级别。这个设置可以确保一个查询扫描多个远程表时,可以获得快照一致性的结果。在同一个事务中,多次查询远程表将会返回相同的结果,即使其他事务修改了远程表中的数据。这个行为对于本地事务使用 SERIALIZABLE 或者 REPEATABLE READ 隔离级别时是预期行为,但是对于 READ COMMITTED 隔离级别可能有些奇怪;将来的 PostgreSQL 版本中可能会修改这些规则。

    目前,postgres_fdw 还不支持远程事务的两阶段提交。

    远程查询优化

    postgres_fdw 可以尝试通过优化远程查询减少网络传输的数据量。这个功能通过将 WHERE 子句发送到远程服务器执行,以及不返回查询不需要的字段来实现。为了降低错误执行查询的风险,只有当 WHERE 子句中只涉及内置或者外部服务器 extensions 选项指定的模块中的数据类型、操作符和函数时才会发送到远程服务器。同时,操作符和函数必须指定 IMMUTABLE 属性。

    对于 UPDATE 或者 DELETE 操作,如果不存在无法发送的 WHERE 子句、本地连接查询、本地行级 BEFORE 或者 AFTER 触发器、目标表上的存储计算列、父级视图上的 CHECK OPTION 约束,postgres_fdw 可以尝试将整个语句发送到远程服务器执行。对于 UPDATE,赋值表达式中只能使用内置数据类型、IMMUTABLE 操作符或者函数,从而减少错误执行的风险。

    如果 postgres_fdw 遇到了同一个远程服务器上的外部表连接查询,会将整个连接操作发送到远程服务器,除非它认为单独返回每个表的效率更高,或者表的引用涉及了不同的用户映射。发送 JOIN 子句时,采用和上述 WHERE 子句相同的策略。

    实际发送到远程服务器的查询可以通过 EXPLAIN VERBOSE 语句进行查看。

    远程查询执行环境

    对于 postgres_fdw 打开的远程会话,search_path 参数被设置为 pg_catalog,因此默认只能看见内置的对象,除非使用模式名限定。这种行为对于postgres_fdw 提交的查询而言没有问题,因为它总是会指定模式名。不过,它可能对远程表上的触发器函数或者规则函数的执行带来问题。例如,当远程表是一个视图时,该视图中的任何函数都会在该搜索路径中查找,结果可能是不存在。推荐对于这些函数使用时加上模式名限定,或者在创建函数时使用 SET search_path 选项设置搜索路径。

    另外,postgres_fdw 还会在建立远程会话时对以下参数进行设置:

    • TimeZone 设置为 UTC;
    • DateStyle 设置为 ISO;
    • IntervalStyle 设置为 postgres;
    • extra_float_digits 设置为 (远程服务器为 PostgreSQL 9.0 以上版本) 或者 2(更早版本)。

    这些参数通常不会像 search_path 一样导致问题,但同样可以使用函数的 SET 选项进行设置。

    不推荐通过会话级别的设置覆盖这些参数的默认值,这样可能导致 postgres_fdw 运行错误。

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    展开全文
  • linux文件系统和日志分析!

    千次阅读 2021-05-17 16:55:14
    linux文件系统和日志分析一.inode和blockblock(块)inode(索引节点)stat命令二.硬链接与软链接三.恢复误删除的文件四.分析文件日志 一.inode和block 概述 文件数据包括元信息和实际数据。 文件存储在硬盘上,硬盘...
  • linux中awk进行日志文本的处理过滤

    千次阅读 2017-09-25 18:07:32
     linux日志分析很常见也很重要,看见那一片如汪洋般的日志,想死的心都有了,过滤出关键日志,查看重要信息,定位分析问题也是必须要掌握的一门技能;  因此coding的时候对日志格式的设计规范很重要,直接决定...
  • 文章目录引言 引言 在上文中,我们已经详细介绍linux三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在Tomcat和Nginx日志的统计分析。 ...
  • 1、所需要的环境:Linux系统、Tomcat、WinSCP(本人使用的是CenterOS7+Tomcat8.5.34) 2、下载Tomcat8 下载tomcat的链接 https://tomcat.apache.org/download-80.cgi 3、用WinSCP 把下载好的Tomcat拷贝到Linux,...
  • linux查看日志的几种方法

    千次阅读 2020-06-18 11:25:15
    作为开发项目出了bug想要最快速定位到问题所在,查看日志是最好不过的了~(当然,也要习惯在业务关键点设置日志). 最常用查看日志方法: ·实时日志:tail -f XXX.log ·搜索关键字附近日志:cat -n filename | ...
  • Linux 查看访问 IP

    万次阅读 2018-09-19 15:02:26
    Linux查看访问IP Linux 系统有很多用于快速处理数据的工具如 grep , awk , cut , sort , uniq , sort 可以帮助我们分析网络情况 , 他们非常非常地好用 , 如果你熟练掌握他们的使用技巧 , 他们则可以帮你快速定位...
  • Linux服务器部署egg,日志

    千次阅读 2018-11-08 16:53:12
    如果Linux服务器node,mysql环境还不会配置,请先看https://blog.csdn.net/bocongbo/article/details/83788950 1、将项目git clone到服务器目录,目录自定 2、进入项目目录,npm install安装依赖包 3、npm start...
  • Linux统计日志相关命令

    千次阅读 2017-09-27 10:34:02
    对于运维或者开发人员来源,对于日志的统计和搜索是必会的技能,甚至在面试的时候是必问的问题,对此,做一下总结。 一、常用到的命令 1、cat 2、awk 具体见 http://man.linuxde.net/awk 一、...
  • ... 我们日常应用中都离...但是日志并不是写了就好了,当你想查看日志的时候,你会发现线上日志堆积的长度已经超越了你一行行浏览的耐性的极限了。于是,很有必要通过一些手段来高效地辅助你来快速的从日志中找
  • Linux中常见的日志文件和命令

    千次阅读 2007-09-25 14:16:00
    Linux中常见的日志文件和命令 成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索...
  • Linux日志以及网络的管理

    万次阅读 2017-10-19 20:44:37
    1.系统日志 (1)系统日志默认分类 /var/log/messages 系统服务及日志,包括服务的信息,报错等等 /var/log/secure 系统认证信息日志 /var/log/maillog 系统邮件服务信息 /var/log/cron 系统定时任务信息 /var/log/...
  • [转]Linux日志分析的实战专题

    千次阅读 2004-12-16 16:17:00
    Linux日志分析的实战专题 作者:刘志勇 郭聪辉 发文时间:2004.11.23from: http://tech.ccidnet.com/pub/article/c322_a180627_p1.html 日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,...
  • Linux学习日志(三)

    千次阅读 2016-04-28 00:40:34
    bash特性之七:补全功能 命令补全:在PATH中搜索补全 shell命令:内部,外部 外部:在系统某路经下有一个可执行程序 PATH,一组以冒号分隔的路径 路径补全:在给出的打头路径下补全,如果没有打头路径,则为当前目录...
  • Apache访问日志详解

    千次阅读 2017-04-13 03:38:16
    想要知道什么人在什么时候浏览了网站的哪些内容吗?查看Apache的访问日志就可以知道。...这个《Apache日志》系列文章介绍的就是Apache的访问日志、错误日志,以及如何分析日志数据,如何定制Apache日志,如何从日志数据
  • linux查看日志的命令总结

    万次阅读 2018-05-04 18:50:57
    下面的列表就是在Linux使用不同 “find”命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用find命令的方式是很多的,find命令查找文件只要灵活应用,丝毫不比在WINDOWS中查找能力差。 1 2 3 4 5 6 7 8...
  • 环境描述 安装环境:VMware5.5.3 build-34685 虚拟机内资源:1G内存 7G硬盘空间 CPU 2核  OS: ... 1 熟悉Linux安装 ... 2 熟悉Linux启动顺序 ...启动日志 ---------------------Power On--------
  • nginx自动切割访问日志

    千次阅读 2016-04-04 12:28:53
    Web 访问日志 (access_log) 记录了所有外部客户端对Web服务器的访问行为,包含了客户端IP,访问日期,访问的URL资源,服务器返回的HTTP状态码等重要信息。 一条典型的Web访问日志如下: 112.97.37.90 - - [14/...
  • 搭建samba服务器实现windows访问Linux共享文件夹   1、安装Samba服务搭建samba服务器实现windows访问Linux共享文件夹 yum -y install samba samba-client 2、创建共享文件夹 mkdir /databackup/share 3、设置...
  • Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所以用户不需要特殊的工具就可以搜索和阅读它们。还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。 Linux ...
  • IBM HTTP Server 访问日志的格式

    千次阅读 2018-06-06 11:47:45
    定义日志的格式我们可以在 IBM HTTP Server 的配置文件中,使用预定义的经典格式,或者自定义访问日志的格式。下文中如无特别说明,将假设日志使用名称为 combined的经典格式。 LogFormat "%h %l %u %t \"...
  • windows访问不了VMWare的docker映射的端口 问题排查: 防火墙问题 服务没有真正启动 端口映射错误 其它问题 防火墙检查 Centos7 服务启动?端口映射? 而且在linux 可以正常请求服务 以上排查都没...
  • 安装好tomcat后外部window机可以ping通服务器但是无法方位tomcat首页,tomcat日志看了,没有报错,服务器的防火墙也关了。输入http://***.*.*.*:8080登录不上。
  • 考虑一种网络拓扑应用情景,一个内部局域网中有多台服务器提供不同的服务,如web服务、FTP服务、ssh、telnet等,通过服务器(或网关、防火墙)连接外部网络,如果外部网络上的主机需要访问这些服务器,则需要在网关上...
  • 进程访问外部接口的超时设置

    千次阅读 2009-12-22 22:18:00
    早上发现WEB SRV上的FCGI进程全部挂住了,查看日志才发现是访问一个外部接口的时候因为失败率比较高,导致FCGI进程都堵在接收回包上了,因为超时设了500ms,结果每个进程每秒只能处理2个请求,大量用户请求失败,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,700
精华内容 24,680
关键字:

linux访问外部日志

linux 订阅