百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux趣玩之自建跳板机

nanshan 2025-01-08 16:17 16 浏览 0 评论


运维人员管理服务器基本上都是先统一登录到跳板机上,然后再由跳板机登录到服务器上进行操作。跳板机会对用户进行身份认证、账户管理、授权控制及安全审计等。

在实际工作中,我们一般会使用开源组件来部署跳板机,但是今天通过介绍下使用自建跳板机管理Linux服务器的过程,来了解Linux服务器不光可以只跑服务,如果运用得当,也可以作为我们日常使用的管理工具。

跳板机工作方式

1.用户先ssh登录到跳板机;

2.在跳板机上,通过ssh登录到目标服务器;

以上两步需要输入两遍账户,第一遍登录跳板机时输入,第二遍在登录目标服务器时输入。

注意:

所有的目标服务器需要通过防火墙或tcp wrapper只允许跳板机ssh,其他默认禁止。

跳板机功能

1.跳板机只提供ssh、ls等基本命令,禁止scp、sftp、管道等以防数据传输到本地,但是可以自行添加;

2.跳板机将其登录用户锁定在特定的目录下,防止用户浏览服务器数据;

3.磁盘限额,设置用户的空间,防止用户回传数据,保证跳板机只可用跳转;

4.目标服务器端操作日志审计;

跳板机实现思路

1.磁盘限额及锁定用户目录

(1)磁盘限额可以限制用户传输数据大小,因此磁盘限额必须是针对独立的适合的额定大小的新磁盘分区,而不是根目录或其他,否则配置磁盘限额没有效果;

(2)ssh的chroot功能:"ChrootDirectory"定义了用户通过认证以后的chroot目录(此目录及其所有子目录的属主必须是root,且这些目录只有root帐号可以进行写操作,其他任何组和帐号都不可写);chroot以后,sshd会将用户的工作目录转到chroot目录中用户自己的主目录。如果ChrootDirectory定义的目录下没有相应的/home/username目录,则会直接转到chroot的/目录下。

我们利用ssh的chroot及独立的磁盘分区,可以将用户限制在独立分区下,防止用户切换到其他目录操作。

2.基础命令

默认情况下的chroot目录是没有命令的,需要拷贝有限基础命令到相应的目录下,来实现不同命令的开放。

3.操作日志审计

使用logger及rsyslog,将每台服务器上的每个用户执行的命令、执行时间、登录时间、主机ip、当前切换用户等信息保存到本地文件并实时传输至日志服务器进行异地备份。

跳板机实现

一、chroot环境

1.建立chroot目录中用户主目录

mkdir -p /var/chroot/home/test
chown -R test.test /var/chroot/home/test
chmod 700 /var/chroot/home/test

2.创建用户

useradd -d /var/chroot/home/test test
passwd test

3.chroot环境配置

chroot环境至少需要一个shell(例如sh,bash)和一些必要的系统设备文件(例如/dev/null,/dev/zero),如果要允许用户执行一些命令,那么还要准备相应的命令可执行文件和命令依赖的库文件。

mkdir -p /var/chroot
cd /var/chroot
mkdir {bin,dev,lib64,etc,home}
mknod dev/null c 1 3
mknod dev/zero c 1 5
#ssh命令需要,如缺少会报告:PRNG is not seeded
mknod dev/random c 1 8
mknod dev/urandom c 1 9
#ssh命令需要,如缺少会报告:Host key verification failed
mknod dev/tty c 5 0
#修改/var/chroot及其子目录的属主,并修改权限
chown -R root.root /var/chroot
chmod -R 755 /var/chroot
#允许用户写这些设备文件,不可写会有些命令报错
chmod 0666 dev/{null,zero,tty}
#复制/etc/passwd和/etc/group文件到/var/chroot/etc中,并删除用户自己和root以外的所有帐号。如果没有这两个文件,用登录以后会报“I have no name!”
cp -p /etc/passwd  /var/chroot/etc/
cp -p /etc/group  /var/chroot/etc/
cat /var/chroot/etc/group
root:x:0:
test:x:516:
cat /var/chroot/etc/passwd 
root:x:0:0:root:/root:/bin/bash
test:x:516:516::/home/test:/bin/bash

#执行完毕后,test目录需重新授权
chown -R test.test /var/chroot/home/test
chmod 700 /var/chroot/home/test

4.配置ssh

vim /etc/ssh/sshd_config
#在最后添加如下行,否则会报错
Match User test
ChrootDirectory /var/chroot

#重启ssh
service sshd restart

重启ssh后,ssh仍会登录不成功。因为用户登陆后必须有一个可用的shell,因此我们需要拷贝基础命令/bin/bash,还有其他命令如ls、mkdir等。

二、拷贝基础命令

1.基础命令

 #通过一下方式查看基础命令所用的库文件
 ldd /bin/ls | awk '{ print $3 }' | grep "/lib" | sort | uniq
/lib64/libacl.so.1
/lib64/libattr.so.1
/lib64/libcap.so.2
/lib64/libc.so.6
/lib64/libdl.so.2
/lib64/libpcre.so.1
/lib64/libpthread.so.0
/lib64/libselinux.so.1

通过上述方式查询,我们可以将相关基础命令拷贝到用户目录下。

2.拷贝基础命令

此处拷贝bash、ls、cp、mkdir、rm、ssh、id等基础命令

#执行拷贝命令脚本
#!/bin/bash
#comment:用于ssh登陆chroot后,给用户添加命令
 # 要允许执行的文件列表
 cmdlist="/bin/bash /usr/bin/ls /usr/bin/cp /usr/bin/mkdir /usr/bin/mv /usr/bin/rm /usr/bin/rmdir /usr/bin/ssh /usr/bin/id"
 # chroot路径
 chroot_path="/var/chroot"
 # 判断依赖的库文件
 lib_1=`ldd $cmdlist | awk '{ print $1 }' | grep "/lib" | sort | uniq`
 lib_2=`ldd $cmdlist | awk '{ print $3 }' | grep "/lib" | sort | uniq`
 # 复制命令文件
 for i in $cmdlist
 do
   if [ ! -d `dirname ${chroot_path}$i` ];then
        mkdir -p `dirname ${chroot_path}$i`
   fi
   cp -a $i ${chroot_path}$i && echo "$i done"
 done
 # 复制依赖的库文件(因为是i386,所以是lib,如果是x86_64,则是lib64,)
 for j in $lib_1
 do
   if [ ! -d `dirname ${chroot_path}$j` ];then
        mkdir -p `dirname ${chroot_path}$j`
   fi
   cp -f $j ${chroot_path}$j && echo "$j done"
 done

 for k in $lib_2
 do
   if [ ! -d `dirname ${chroot_path}$k` ];then
        mkdir -p `dirname ${chroot_path}$k`
   fi
   cp -f $k ${chroot_path}$k && echo "$k done"
 done

拷贝完命令后,我们就可以登录了。如下:

ssh test@10.16.2.100
test@110.16.2.100's password: 
Last login: Mon Mar 16 15:04:53 2020 from 10.16.2.102
-bash-4.2$ ls
#没有ll命令
-bash-4.2$ ll
-bash: ll: command not found
-bash-4.2$ ssh root@10.16.2.133
No user exists for uid 1005

此时ssh命令却无法使用,报这个错意味着系统无法通过用户数据库(可能的类型有 /etcp/passwd, /etc/group,/etc/shadow,/etc/gshadow)校验用户名是否正确。通常的解决方法是复制对应的文件到chroot目录中,将/lib64/libnss_* 等文件复制到chroot目录下的对应目录。

解决方法:

cp /lib64/libnss_* /var/chroot/lib64

另外通过以上我们看到test用户登陆后默认为”bash-4.2$”,这是由于环境配置文件导致,我们可以通过以下更改:

cp /etc/bashrc /var/chroot/etc/
#复制其他用户的.bashrc 和 .bash_profile
cp /home/xxx/.bashrc /var/chroot/home/test/
cp /home/xxx/.bash_profile /var/chroot/home/test/

三、操作日志审计

1.配置PROMP_COMMAND

vim /etc/bashrc 
readonly PROMPT_COMMAND='logger -p local3.notice -t bash "$(ifconfig | grep -E "eth|em|ens" -A 1 | grep "10.16" | grep -oP "(?<=inet )[\d\.]+")  $(who am i |awk "{print \$1\" \"\$2\" \"\$3\" \"\$4\" \"\$5}") [`pwd`] currentuser=$(whoami) command=$(history 1 | { read x cmd; echo "$cmd"; })"'
source /etc/bashrc

其中:

#使我们自定义的设备,用于rsyslog调用;
local3.notice 
#每行打印的信息打印的tag;
bash 
#获取服务器的ip
ifconfig | grep -E "eth|em|ens" -A 1 | grep "10.16" | grep -oP "(?<=inet )[\d\.]+"
#获取我们当前用户的登录信息
who am i |awk "{print \$1\" \"\$2\" \"\$3\" \"\$4\" \"\$5}"
#列出当前所在的目录
pwd
#用于获取当前切换的执行命令的用户,例如我们从test 用户 sudo -i,执行命令的用户为root,但是登录的用户test,方便我们区分;
whoami
#用户执行的命令
command

注意:

1.在/etc/bashrc或/etc/profile中添加环境变量,将应用于所有用户;

2.如果将PROMPT_COMMAND导出到用户工作区,那么对于有经验的用户就可以做赋值操作 export PROMPT_COMMAND="",这将导致记录功能当前session端不可用,所以PROMPT_COMMAND必须设置成只读的属性,readonly PROMPT_COMMAND;

2.配置rsyslog客户端

记录操作日志到本地文件

vim /etc/rsyslog.conf
#添加如下行
#添加local3.none
*.info;mail.none;authpriv.none;cron.none;local3.none                /var/log/messages
#通过local3保存到本地的文件
local3.notice /var/log/audit.log
#远程日志服务器,可用于同步备份
#local3.notice @10.16.99.1
#重启
service rsyslog restart

其中:

1.local3.notice 是在logger中定义的设备,rsyslog调用并将打印信息输出至指定文件;

2.添加local3.none是避免日志写入/var/log/messages;

3.配置轮储日志

vim /etc/logrotate.d/rsyslog
/var/log/audit.log{
    daily
    rotate 4
    missingok
    notifempty
    nocompress
    create
    dateext
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

#强制轮转
logrotate -vf /etc/logrotate.d/rsyslog
#查看
ls /var/log|grep audit
audit.log  audit.log-20200316 
vim /var/log/audit.log
Mar 16 16:13:11 test100 bash: 10.16.2.100  root pts/0 2020-03-16 14:23 (10.16.2.102) [/var/chroot/home] currentuser=root command=logrotate -vf /etc/logrotate.d/rsyslog
Mar 16 16:13:42 test100 bash: 10.16.2.100  root pts/0 2020-03-16 14:23 (10.16.2.102) [/var/chroot/home] currentuser=root command=vim /etc/logrotate.d/rsyslog
Mar 17 07:25:33 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=vim /etc/logrotate.d/rsyslog
Mar 17 07:25:34 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=ls
Mar 17 07:25:34 test100 bash: 10.16.2.100  root pts/0 2020-03-17 07:25 (10.16.2.102) [/root] currentuser=root command=ls

如果我们审计日志需要异地备份,可以设置rsyslog远程日志服务器即可,在此不多做介绍。

总结

从上述部署过程中我们可以看到,整个过程非常繁琐而且为了适配各种版本操作系统还需要修改脚本,明显已经不能作为当前运维工具的实现方式了。但是我们可以通过本次部署了解到Linux系统中的一些小操作,如chroot、磁盘限额、操作审计、日志轮储等,或许会在我们以后的运维道路上用到。

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: