当前位置: 首页 > news >正文

如何做滴滴网站平台起名网站是怎么做的

如何做滴滴网站平台,起名网站是怎么做的,wordpress仿百度文件,wordpress打不开页面文章目录 1 audit简介2 auditctl的使用2 audit配置和规则3 工作原理4 audit接口调用4.1 获取和修改配置4.2 获取和修改规则4.3 获取审计日志 5 audit存在的问题5.1 内核版本5.2 审计日志过多造成的缓存队列和磁盘问题5.2 容器环境下同一个命令的日志存在差异 6 参考文档 1 audi… 文章目录 1 audit简介2 auditctl的使用2 audit配置和规则3 工作原理4 audit接口调用4.1 获取和修改配置4.2 获取和修改规则4.3 获取审计日志 5 audit存在的问题5.1 内核版本5.2 审计日志过多造成的缓存队列和磁盘问题5.2 容器环境下同一个命令的日志存在差异 6 参考文档 1 audit简介 audit是Linux内核提供的一种审计机制由于audit是内核提供的因此在使用audit的过程中就包含内核空间和用户空间部分 rules审计规则其中配置了审计系统需要审计的操作auditctl用户态程序用于审计规则配置和配置变更kaudit内核空间程序根据配置好的审计规则记录发生的事件auditd用户态程序通过netlink获取审计日志 通常的使用流程 用户通过auditctl配置审计规则内核的kauditd程序获取到审计规则后记录对应的审计日志用户态的auditd获取审计日志并写入日志文件。 audit的主要应用场景是安全审计通过对日志进行分析发现异常行为。 2 auditctl的使用 auditctl是用户态的控制程序可以修改audit配置以及审计规则的操作。 auditctl的选项可以分成两类。 配置类 -b配置buffer的大小-e设置enabled标记-f设置failure标记-s返回整体的状态–backlog_wait_time设置backlog_wait_time 审计规则类 -a -A l,a往某个规则表中增加需要记录的行为-d从某个规则表中删除规则-D删除所有规则-F fv设置更多监控条件-l查看规则-p在文件监控上设置权限过滤-i当从文件中读取规则时忽略错误-c出错时继续-r设置rate_limit每秒多少条消息-R从文件中读取规则-S设置要监控的系统调用名或者系统调用号-w增加监控点-W删除监控点 例如假如我们想要获取调用execve系统调用的事件可以增加下列的规则 auditctl -a always,exit -S execve -F key123456然后就可以通过ausearch查找该日志 ausearch -k 123456如果想要获取执行tail命令的事件可以增加规则 auditctl -w /usr/bin/tail -p x -k 123456然后使用tail命令查看通过ausearch命令查看日志 time-Sun Apr 23 15:47:36 2023 typePROCTITLE msgaudit(1682236056.128:4318964): proctitle7461696C002D6E0032006C756F2E7368 typePATH msgaudit(1682236056.128:4318964): item1 name/lib64/ld-linux-x86-64.so.2 inode36969 dev08:03 mode0100755 ouid0 ogid0 rdev00:00 objsystem_u:object_r:ld_so_t:s0 objtypeNORMAL cap_fp0000000000000000 cap_fi0000000000000000 cap_fe0 cap_fver0 typePATH msgaudit(1682236056.128:4318964): item0 name/usr/bin/tail inode100666597 dev08:03 mode0100755 ouid0 ogid0 rdev00:00 objsystem_u:object_r:bin_t:s0 objtypeNORMAL cap_fp0000000000000000 cap_fi0000000000000000 cap_fe0 cap_fver0 typeCWD msgaudit(1682236056.128:4318964): cwd/root typeEXECVE msgaudit(1682236056.128:4318964): argc4 a0tail a1-n a22 a3luo.sh typeSYSCALL msgaudit(1682236056.128:4318964): archc000003e syscall59 successyes exit0 a020749e0 a1218ecd0 a22179ee0 a37fffa4a99460 items2 ppid58219 pid59519 auid0 uid0 gid0 euid0 suid0 fsuid0 egid0 sgid0 fsgid0 ttypts1 ses956 commtail exe/usr/bin/tail subjunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key123456可以看到开头一行是事件发生的事件后面的若干行是执行tail命令产生的事件日志有些日志很简单例如CWD表示操作的当前路径而有些日志很复杂例如SYSCALL有接近30个字段。每行日志都有type字段和msg字段(冒号前面是时间戳可以通过date命令转换冒号后面是事件ID同一条规则产生的事件的事件ID是一样的因此如果不使用ausearch查找某条规则产生的日志就需要先用key进行查找找到对应的事件ID然后再通过事件ID查找产生的所有日志)。 这里的tail命令的监控我们只关注上面的2个事件 EXECVE这里给出了调用的参数argc和argvSYSCALLarch(架构)syscall(系统调用号可以通过ausyscall --dump查看)success(调用是否成功)exit(返回码)a0~a3为系统调用前4个参数ppid(父进程ID)pid(进程ID)comm(执行的命令)exe(执行execve的可执行文件) 2 audit配置和规则 通过auditctl -s命令可以看到当前audit的一些属性和配置 enabled表明audit是否会记录事件可以通过auditctl -e设置failure表明audit是否会记录失败事件设置为1才会记录失败事件pid占用audit的进程的pidrate_limit内核每秒发送的最大消息数如果是0表示不限制backlog_limit缓存队列长度限制lost由于缓存队列超过限制而导致的丢失的记录数backlog当前缓存队列中等待读取的记录数backlog_wait_time缓存队列满时的等待时间 其中backlog_wait_time是后面的版本提供的。 3 工作原理 除了上述的使用外audit还有一个特点独占性。实际的审计操作是由内核中的kauditd完成的auditd再通过netlink读取审计日志。而kauditd是只允许与一个用户态进程连接因此如果系统上已经有auditd进程与kauditd建立连接后续其他进程进行了抢占auditd则会断开。那么如果判断当前是哪个进程与kautid建立了连接呢可以通过auditctl -s中的pid进行判断。 另一个重要的地方是kaudit如何去应用配置的规则。在auditctl的-a l,a选项中给出的选项含义是将规则和对应的action加入到list后面。list有4种task、exit、user、excludeaction有2种never、always。 task、exit、user分别表示审计事件的三种类型user事件是指与用户相关的事件例如用户登录、注销、切换等。task是指与进程相关的事件例如进程创建、退出、切换等。exit是指与系统调用相关的事件。exclude只是一个关键字用于排除不需要审计的文件或者目录。因此这里面的事件类型与其他的某些选项有强相关 -a用于增加规则-w用于监视文件两者不能同时使用说明在实现上分别维护了以事件类型进行分类的4个列表同时还维护了需要监视的文件列表-S指定系统调用号因此只能用于-a exit 配置和规则的变更 当通过auditctl操作配置或者规则时会通过netlink将规则发送到内核内核接收到到配置后会对内部的配置或者规则进行更新 对于规则来说内核4.19.281内部会维护7个链表 AUDIT_FILTER_USER用户生成的日志AUDIT_FILTER_TASK进程创建AUDIT_FILTER_ENTRY系统调用入口AUDIT_FILTER_WATCH文件系统监控AUDIT_FILTER_EXIT系统调用退出AUDIT_FILTER_EXCLUDE审计日志排除AUDIT_FILTER_FS 4 audit接口调用 auditctl使用netlink与内核进行交互因此要想实现audit的一些能力就需要采用netlink实现一套交互接口幸运的是已经有库可以完成这项工作yum install -y audit-libs-devel然后编译时带上-laudit。 安装完成后可以查看头文件/usr/include/libaudit.h看下提供的方法。 4.1 获取和修改配置 #include iostream #include libaudit.husing namespace std;int main() {int fd audit_open();audit_request_status(fd);struct audit_reply reply;audit_get_reply(fd, reply, GET_REPLY_BLOCKING, 0);struct audit_status *status;status reply.status;cout auditctl -s return: endl;cout enabled status-enabled endl;cout failure status-failure endl;cout pid status-pid endl;cout rate_limit status-rate_limit endl;cout backlog_limit status-backlog_limit endl;cout lost status-lost endl;cout backlog status-backlog endl;return 0; }先试用audit_request_status()向内核发送请求表明要获取配置信息然后再通过audit_get_reply()接收数据数据放在struct audit_reply的结构体 // /usr/src/libaudit.h struct audit_reply {int type;int len;struct nlmsghdr *nlh;struct audit_message msg;/* Using a union to compress this structure since only one of* the following should be valid for any packet. */union {struct audit_status *status;struct audit_rule_data *ruledata;struct audit_login *login;char *message;struct nlmsgerr *error;struct audit_sig_info *signal_info;struct daemon_conf *conf; #ifdef AUDIT_FEATURE_BITMAP_ALLstruct audit_features *features; #endif}; };如果是获取配置信息此时数据放在status中 // include/uapi/linux/audit.h struct audit_status {__u32 mask; /* Bit mask for valid entries */__u32 enabled; /* 1 enabled, 0 disabled */__u32 failure; /* Failure-to-log action */__u32 pid; /* pid of auditd process */__u32 rate_limit; /* messages rate limit (per second) */__u32 backlog_limit; /* waiting messages limit */__u32 lost; /* messages lost */__u32 backlog; /* messages waiting in queue */union {__u32 version; /* deprecated: audit api version num */__u32 feature_bitmap; /* bitmap of kernel audit features */}; };因此只要读取返回的audit_reply中的status中的上述字段即可。需要注意的是如果audit_get_reply()中的第3个参数设置为GET_REPLY_NONBLOCKING可能拿不到数据因为fd可能还没有可读的数据所以这里要么设置为GET_REPLY_BLOCKING要么使用select #include iostream #include libaudit.husing namespace std;int main() {struct timeval t {.tv_sec 0, .tv_usec 500000};int fd audit_open();audit_request_status(fd);fd_set read_mask;FD_ZERO(read_mask);FD_SET(fd, read_mask);select(fd1, read_mask, NULL, NULL, t);struct audit_reply reply;audit_get_reply(fd, reply, GET_REPLY_NONBLOCKING, 0);struct audit_status *status;status reply.status;cout auditctl -s return: endl;cout enabled status-enabled endl;cout failure status-failure endl;cout pid status-pid endl;cout rate_limit status-rate_limit endl;cout backlog_limit status-backlog_limit endl;cout lost status-lost endl;cout backlog status-backlog endl;return 0; }对于修改配置的操作libaudit直接提供了对应的api函数例如设置backlog_limit可以直接调用audit_set_backlog_limit()。 4.2 获取和修改规则 #include iostream #include libaudit.husing namespace std;int main() {struct timeval t {.tv_sec 0, .tv_usec 500000};int fd audit_open();do {audit_request_rules_list_data(fd);fd_set read_mask;FD_ZERO(read_mask);FD_SET(fd, read_mask);select(fd1, read_mask, NULL, NULL, t);struct audit_reply reply;audit_get_reply(fd, reply, GET_REPLY_NONBLOCKING, 0);if(reply.type NLMSG_DONE) {break;}struct audit_rule_data *rules;rules reply.ruledata;cout auditctl -l return: endl;cout audit_flag_to_name(rules-flags) endl;cout audit_action_to_name(rules-action) endl;} while(true);return 0; }获取规则跟获取配置的区别只是发起操作的函数和数据解析不同获取规则使用audit_request_rules_list_data()发起操作解析数据时则需要解析struct audit_rule_data的数组。 #include iostream #include libaudit.h #include linux/audit.husing namespace std;int main() {int fd audit_open();struct audit_rule_data *rule new(struct audit_rule_data);audit_rule_syscall_data(rule, 57);audit_add_rule_data(fd, rule, AUDIT_FILTER_EXIT, AUDIT_NEVER);return 0; }上面的代码相当于auditctl -a exit,never -S execve。 #include iostream #include libaudit.h #include linux/audit.husing namespace std;int main() {int fd audit_open();struct audit_rule_data *rule new(struct audit_rule_data);audit_add_watch(rule, /etc/passwd);audit_add_rule_data(fd, rule, AUDIT_FILTER_EXIT, AUDIT_ALWAYS);return 0; }上面的代码相当于auditctl -w /etc/passwd -p rwxa。 4.3 获取审计日志 获取升级日志还是使用netlink的方式读取 #include iostream #include libaudit.h #include string.h #include unistd.husing namespace std;int main() {int audit_fd audit_open();if (audit_fd 0) {cout open audit fail: strerror(errno) endl;return -1;}audit_set_enabled(audit_fd, 1);struct audit_reply audit_rep;int ret;struct timeval t {.tv_sec 5, .tv_usec 0};pid_t cur_pid getpid();ret audit_set_pid(audit_fd, static_castuint32_t(cur_pid),WAIT_NO);if (ret 0) {cout audit_set_pid fail: strerror(errno) endl;return -1;}do {fd_set read_mask;FD_ZERO(read_mask);FD_SET(audit_fd, read_mask);ret select(audit_fd 1, read_mask, nullptr, nullptr, t);if (ret 0) {cout select fail: strerror(errno) endl;continue;}ret audit_get_reply(audit_fd, audit_rep,GET_REPLY_NONBLOCKING, 0);if (ret 0) {cout open audit fail: strerror(errno) endl;}printf(%s %s, __FUNCTION__, audit_rep.msg.data);cout audit_rep.msg.data endl;} while(true);return 0; }5 audit存在的问题 如果只是正常使用audit配置audit规则查看审计日志也没啥问题但是实际使用过程中还是存在一些问题。 5.1 内核版本 不同版本的内核在实现机制上有所不同因此运行表现和参数控制上也有所不同 小于3.14的内核没有提供设置backlog_wait_time的接口 5.2 审计日志过多造成的缓存队列和磁盘问题 audit_log_end将审计日志放到audit_queue的队尾如果审计日志较多可能会导致队列很长占用的资源增多因此内核也提供了一些参数进行控制 backlog_limit缓存队列长度限制backlog_wait_time缓存队列满的等待时间 // audit_log_start(linux-4.19.281)// auditd_test_task检查当前进程是否是audit daemon进程// audit_ctl_owner_current检查当前进程是否持有audit_cmd_mutex锁// 因此这里进入if的条件是当前进程不是audit daemon进程并且没有持有锁if (!(auditd_test_task(current) || audit_ctl_owner_current())) {// 获取audit_backlog_wait_time就是auditctl -s中的backlog_wait_timelong stime audit_backlog_wait_time;// audit_backlog_limit就是auditctl -s中的backlog_limit默认值是64// 因此这里进入while的条件是设置了backlog_limit并且当前缓存队列的长度大于backlog_limitwhile (audit_backlog_limit (skb_queue_len(audit_queue) audit_backlog_limit)) {// 唤醒kauditd处理队列中的日志wake_up_interruptible(kauditd_wait);/* sleep if we are allowed and we havent exhausted our* backlog wait limit */// 如果当前进程允许休眠并且backlog_wait_time大于0则进入ifbacklog_wait_time默认是60sif (gfpflags_allow_blocking(gfp_mask) (stime 0)) {// 创建等待队列的节点DECLARE_WAITQUEUE(wait, current);// 将刚才创建的等待队列的节点wait加入到队列audit_backlog_wait中add_wait_queue_exclusive(audit_backlog_wait,wait);set_current_state(TASK_UNINTERRUPTIBLE);// 让当前进程休眠一段时间stime schedule_timeout(stime);// 将wait从audit_backlog_wait队列中移除remove_wait_queue(audit_backlog_wait, wait);} else {// 如果当前进程没有休眠则先检查审计日志的生成速度是否超过rate_limitif (audit_rate_check() printk_ratelimit())pr_warn(audit_backlog%d audit_backlog_limit%d\n,skb_queue_len(audit_queue),audit_backlog_limit);// lost自增1并在审计日志中打印缓存队列超过限制audit_log_lost(backlog limit exceeded);return NULL;}}}从上面的代码可以看出当队列长度超过backlog_limit时内核会休眠一段时间backlog_wait_time(默认60秒)如果backlog_limit为0则不会休眠而是会打印backlog limit exceeded日志。 因此如果backlog_wait_time不为0而日志太多时可能导致内核频繁休眠极端情况下系统直接卡死。 如果要解决这个问题可以从几个方面入手 审计规则尽可能只配置必要的防止生成大量无用的审计日志根据机器配置增加backlog_limit例如将backlog_limit可以设置为8193或者更大backlog_wait_time设置为0当日志过多时直接丢弃防止影响日常的使用审计日志的消费者尽可能快速消费日志可能的情况下可以增加丢弃策略防止审计日志堆积 当审计日志过多还会造成磁盘占用率的问题当审计日志太多可能会占用大量磁盘空间。 需要注意的是即使没有配置审计规则日志中也可能有审计日志pam认证、服务启动等在没有规则的情况下内核也会生成审计日志。 同时从3.16.0开始内核增加了多消费者允许多个进程同时读取审计日志那么如果存在其他进程也读取审计然后写到日志文件的话磁盘占用的问题又会放大因此对于磁盘占用的问题可以从以下几个方面入手 是否有其他进程也读取了审计日志在没有配置审计规则的情况下是否也会产生大量日志 5.2 容器环境下同一个命令的日志存在差异 在容器环境下同一个命令的日志可能存在差异因为命令的实现有所不同比较典型的是有些镜像的vi是重定向到busybox有些则是跟主机一样的二进制文件那么他们产生的日志就不同就会造成分析上的困难。 6 参考文档 RHEL Audit System Reference读懂audit日志Audit framework
http://www.zqtcl.cn/news/117359/

相关文章:

  • 游戏网站开发找什么人可建智慧园区设计方案
  • 重庆网站设计公司推荐福州移动网站建设
  • 移动网站功能做网站fjfzwl
  • 食品网站建设的目的中级经济师考试成绩查询
  • 普宁建设局网站免费的网站开发平台
  • 网站域名主机空间区别网站上传系统
  • 建设高端网站公司的目的淮南房产网
  • 网站建设 中山网站建设新得体会
  • 快速搭建网站视频教程看想看的做想做的电影网站好
  • 网站聊天怎么做2345网址导航智能主版
  • 如何优化网站加载速度做推广公司
  • 网站下载不了视频php网站 数据库链接
  • 制作网页网站教程wordpress建立扁平化
  • 网站建设小知识郑州网站建设找伟置
  • 苏中建设官方网站旅游做攻略用什么网站好
  • 信息门户网站制作wordpress改商城
  • 企业类网站有哪些甘肃省和住房建设厅网站
  • 嘉兴市住房和城乡建设局网站wordpress nodejs版本
  • 做网站 百度推广深圳外贸招聘
  • 网站留言板功能网站建设 核对流程
  • WordPress输出当前网址郑州官网seo厂家
  • c 网站开发框架wordpress建站的教程
  • 营销 推广 网站王烨演的电视剧
  • 阳泉营销型网站建设网站360做的标记如何取消
  • win7 iis asp网站配置文件注册建设网站的公司网站
  • 品牌网站建设预算网站制作过程内容
  • 石河子建设网站网站开发参考资料
  • 网站开发招标参数wordpress个性化友情链接页面
  • 建设企业网站有哪些wordpress进入中国市场
  • 大学社团网站建设虚拟主机如何做网站