以下是摘自宝塔释放内存的脚本:

if [ -f "/etc/init.d/php-fpm-74" ];then
    /etc/init.d/php-fpm-74 reload
fi

if [ -f "/etc/init.d/mysqld" ];then
    /etc/init.d/mysqld reload
fi

if [ -f "/etc/init.d/nginx" ];then
    /etc/init.d/nginx reload
fi

if [ -f "/etc/init.d/httpd" ];then
    /etc/init.d/httpd graceful
fi

if [ -f "/etc/init.d/pure-ftpd" ];then
    pkill -9 pure-ftpd
    sleep 0.3
    /etc/init.d/pure-ftpd start 2>/dev/null
fi

sync
sleep 2
sync
echo 3 > /proc/sys/vm/drop_caches

sync 命令:sync 指令会将存于 buffer 中的资料强制写入硬盘中
Linux 系统中欲写入硬盘的资料有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了。

/proc/sys/vm/drop_caches的值,默认为0
来自官方的解释:

/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory to become
free.

To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >
/proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects
are not freeable, the user should run sync first.

写入此文件会导致内核丢弃内存中的 dentry 和 inode缓存的数据,导致内存被释放。
释放页面缓存,请使用

echo 1 > /proc/sys/vm/drop_caches

释放 dentries 和 inode,使用

echo 2 > /proc/sys/vm/drop_caches

释放 pagecache、dentries 和 inode,请使用

echo 3 > /proc/sys/vm/drop_caches

使用前,请执行sync命令,将 buffer 中的数据写入磁盘

什么是vulhub?
Vulhub是一个基于docker和docker-compose的漏洞环境集,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。Vulhub的官方地址为 www.vulhub.org。

我在今天搭建靶场的时候遇到了几个问题:

系统时间问题。
kali安装docker的时候需要证书。
kali源修改后,显示的签名错误(参考1修改时间即可)。
docker安装pip,compose。
kali在虚拟机状态下不能自己拉伸屏幕。
如何更新docker源
一.系统时间问题:
先更新系统时间

二 、 安装docker
因为Vulhub是一个基于docker和docker-compose的漏洞环境集。

安装https协议、CA证书

apt-get install -y apt-transport-https ca-certificates

安装docker

apt install docker.io

查看版本,是否安装成功。

docker -v

显示docker运行状态

docker  ps 

暂时未运行所以是空的。

安装pip

apt-get install python3-pip

安装docker-compose

pip3 install docker-compose

查看docker-compose版本

docker-compose -v

git vulhub
git clone https://github.com/vulhub/vulhub.git

下载成功后,进入到vulhub目录( cd vulhub ),通过 ls 命令查看漏洞靶场。

下面,随便进入一个目录,

cd  /vulhub/weblogic/CVE-2018-2628

启动环境

docker-compose build //可选
docker-compose up -d //自动生成漏洞环境

查看启动环境,发现端口是7001

docker-compose ps

docker-compose会默认根据当前目录下的配置文件启动容器,在关闭及移除环境的时候,也需要在对应目录下。我们执行docker-compose up -d后,不要离开当前目录即可,漏洞测试结束后,执行如下命令移除环境:

docker-compose down

三、安装open-vm-tool

apt-get install open-vm-tools-desktop fuse

四、更新docker源
阿里云: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce
配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户
下面的https://xxx.mirror.aliyuncs.com,其中的XXX是我的用户名,为了隐私 我设置成了xxx,你们要用自己的哦。
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

git@xxxx访问 git@xxxx访问其实就是使用的ssh服务

搭建步骤:以 root 用户执行,服务器地址 192.168.1.100

#创建git用户
adduser git

#切换到git用户
su git
cd
mkdir .ssh && chmod 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

#创建git仓库
mkdir test.git
cd test.git
git init

#设置git用户的登录密码
passwd
#退出,回到root用户环境
exit

#在客户端创建ssh密匙
ssh-keygen -t rsa
#将对应的公钥添加到服务器git用户ssh认证文件中
ssh-copy-id git@192.168.1.100

#测试能不能访问服务器上的仓库,如果不报错即可访问了
git ls-remote -h git@192.168.1.100:test.git HEAD

#尝试clone仓库到本地
git clone git@192.168.1.100:test.git

应该注意,目前所有这些用户也可以登录服务器并以git用户身份获得 shell 。如果你想限制它,你必须将用户的 shell 更改为git-shell

# 查看现有shell
cat /etc/shells

# 确保在您的系统上安装了git-shell,一般是 /usr/bin/git-shell
which git-shell

# 将上面输出的git-shell的路径添加到/etc/shells最后,保存
sudo -e /etc/shells  

#将git用户的登录shell改成git-shell
sudo chsh git -s $(which git-shell)

现在192.168.1.100将得到这个结果了,这样就不能远程登录了,但是可以正常使用git命令推送和拉取代码,同时也不能使用ssh-copy-id来复制用户公钥,需要手动去服务器上添加

ssh git@192.168.1.100
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

此时,用户仍然可以使用 SSH 端口转发来访问 git 服务器能够访问的任何主机。如果您想防止这种情况发生,您可以编辑该authorized_keys文件并将以下选项添加到您要限制的每个公钥之前:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

结果应如下所示:

cat ~/.ssh/authorized_keys

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

现在 Git 网络命令仍然可以正常工作,但用户将无法获得 shell。正如输出所述,您还可以在git用户的主目录中设置一个目录,git-shell以稍微自定义命令。例如,您可以限制服务器将接受的 Git 命令,或者您可以自定义用户在尝试 SSH 时看到的消息。运行git help shell以获取有关自定义 shell 的更多信息。

实现HTTP访问
apache 实现
让我们来看看一个非常基本的设置。我们将使用 Apache 作为 CGI 服务器进行设置。如果您没有 Apache 设置,您可以在 Linux 机器上使用以下内容进行设置:

sudo apt-get install apache2 apache2-utils
a2enmod cgi alias env

这也使得mod_cgi,mod_alias和mod_env模块,这些都需要这正常工作。

将仓库存放的目录(以/srv/git为例)的用户组设置为 www-data以便 Web 服务器可以读取和写入访问存储库,因为运行 CGI 脚本的 Apache 实例(默认情况下)将作为该用户运行:

chgrp -R www-data /srv/git

接下来,我们需要向 Apache 配置添加一些内容,以将其git-http-backend作为处理程序运行,以处理进入/gitWeb 服务器路径的任何内容。

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

如果您省略GIT_HTTP_EXPORT_ALL环境变量,那么 Git 将只为未经身份验证的客户端提供包含git-daemon-export-ok文件的存储库,就像 Git 守护程序(git-daemon-export-ok)所做的那样。

最后,您将要告诉 Apache 允许请求git-http-backend并以某种方式对写入进行身份验证,可能使用像这样的 Auth 块:

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

这将要求您创建一个.htpasswd包含所有有效用户密码的文件。以下是将“schacon”用户添加到文件的示例:

$ htpasswd -c /srv/git/.htpasswd schacon

有很多方法可以让 Apache 对用户进行身份验证,您必须选择并实现其中之一。这只是我们能想到的最简单的例子。您几乎肯定还想通过 SSL 进行设置,以便对所有这些数据进行加密。

我不想在 Apache 配置细节讲太多,因为您很可能使用不同的服务器或有不同的身份验证需求。
这里只是说明 Git 带有一个 CGI 处理程序 git-http-backend,当调用它时将完成所有协商以通过 HTTP 发送和接收数据。
它本身不实现任何身份验证,但可以在调用它的 Web 服务器层轻松控制。
您几乎可以使用任何支持 CGI 的 Web 服务器来执行此操作,因此请选择您最了解的服务器。

有关在 Apache 中配置身份验证的更多信息,请在此处查看 Apache 文档:https://httpd.apache.org/docs/current/howto/auth.html

nginx实现
nginx配置

# 配置以 /git 开始的虚拟目录
server {
    listen               80;
    server_name          git.example.com;

    auth_basic           "Git Access";
    auth_basic_user_file /etc/nginx/.htpasswd_git;
    error_log            /var/log/nginx-git-error.log;
    access_log           /var/log/nginx-git-access.log;
    client_max_body_size 0;

    root /srv/git/;

    location ~ /git(/.*) {

        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        include       fastcgi_params;
        fastcgi_param SCRIPT_FILENAME     /usr/libexec/git-core/git-http-backend;
        fastcgi_param GIT_PROJECT_ROOT    /srv/git;
        fastcgi_param REMOTE_USER         $remote_user;
        fastcgi_param PATH_INFO           $1;
        fastcgi_read_timeout              600;
        client_max_body_size 100M;
    }
}

参考 nginx ngx http auth basic module , 用户认证文件格式如下:
/etc/nginx/.htpasswd_git

# comment
name1:password1
name2:password2:comment
name3:password3

可以使用 htpasswd 命令创建用户, 如果服务器上没有这个命令的话, 可以输入命令 apt-get install apache2-utils 来安装这个命令, 安装了这个命令之后, 就可以使用它来创建认证用户了, 比如要创建用户 user1, 输入命令如下:

htpasswd /etc/nginx/.htpasswd_git user1

支持以下密码类型:
使用 crypt() 函数加密; 可以使用 Apache HTTP Server 发行版中的“htpasswd”实用程序或“openssl passwd”命令生成;
使用基于 MD5 的密码算法 (apr1) 的 Apache 变体进行散列; 可以使用相同的工具生成;
由 RFC 2307 中描述的“{scheme}data”语法(1.0.3+)指定; 当前实现的方案包括 PLAIN(一个示例,不应使用)、SHA(1.3.13)(不应使用纯 SHA-1 散列)和 SSHA(一些软件包使用的加盐 SHA-1 散列,特别是 OpenLDAP 和 Dovecot)。

创建 git 代码库
上面配置的 git 跟目录是 /srv/git , 我们在这个目录下初始化一个空的代码库, 命令如下:

cd /srv/git
git init --bare test.git
将test.git用户和用户组设置为nginx进程可以读写的用户

重启 nginx 并测试
输入命令重启 nginx 并测试 git 服务:

nginx -s reload
git clone https://192.168.1.100/git/test.git

问题
来自这个网友遇到的问题:https://stackoverflow.com/questions/58437697/multiple-simultaneous-requests-with-git-http-backend-on-nginx-fastcgi-proxy
未经验证:
从测试来看,如果一次有多个请求,代理将失败(代码为 504)
它为每个新的 http 请求生成一个新的 git-http-backend 实例。编译它(需要安装 go 语言)通过

go build git-http-multi-backend.go

并运行它

./git-http-multi-backend -r /Path/To/Repos

这将使它监听 :80(端口可以更改)。您现在只需将 nginx 配置更改为类似

location ~ /git(/.*) {
    proxy_pass http://localhost:80;
}

这不是最优雅的解决方案,因为完全可以通过摆弄 nginx 配置来实现相同的效果。
git-http-multi-backend 工具的作者甚至谈到了它。

您需要增加可以生成的 FCGI_CHILDREN 的最大数量。就我而言,我编辑了 /etc/init.d/fcgiwrap 并将 FCGI_CHILDREN 设置为例如 3。现在,我可以一次检出/克隆/推送 3 个存储库。
哦顺便说一句:虽然编辑这个脚本可能被认为不是一个好习惯。我只是想,将脚本放入 /etc/default/fcgiwrap 并使用FCGI_CHILDREN=3也可以完成这项工作,并且单独保留启动脚本

问题
工作中经常发现一些第三方写的docker容器运行有问题,这时我们会通过docker logs命令观察容器的运行日志。很可惜,有时容器中运行的程序仅从日志很难查明问题。这时我们会通过docker exec在目标容器中执行某些命令以探查问题,有时却发现一些镜像很精简,连基本的sh、bash、netstat等命令都没包含。这时就很尴尬了,诊断问题很困难。

docker-debug工具,这个工具的使用方法也很简单,参考以下命令:

# Suppose the container below is a container which should be checked
docker run -d --name dev -p 8000:80 nginx:latest
# Enter a shell where we can access the above container's namespaces (ipc, pid, network, etc, filesystem)
docker-debug dev bash -l

docker-debug的实现原理
简单说执行docker-debug命令也会使用一个包含了常用诊断命令的镜像启动一个诊断容器,该诊断容器将在目标容器相关的命名空间中运行,这样在这个容器中就可以访问目标容器的ipc, pid, network, etc, filesystem,然后使用docker exec命令在诊断容器运行命令,并将docker exec运行命令的输入输出pipe到docker-debug命令的输入输出上。

另外,还发现类似的工具kube-debug,以后诊断pod中的问题方便多了。