0%

一、介绍

/etc/profile

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从 /etc/profile.d 目录的配置文件中收集 shell 的设置。如果你有对 /etc/profile 有修改的话必须得 source 一下你的修改才会生效,此修改对每个用户都生效。

/etc/bashrc(ubuntu为 /etc/bash.bashrc)

为每一个运行 bash shell 的用户执行此文件。当 bash shell 被打开时,该文件被读取。如果你想对所有的使用 bash 的用户修改某个配置并在以后打开的 bash 都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个 bash 即可生效。
Ubuntu没有此文件,与之对应的是/ect/bash.bashrc。

~/.bash_profile(ubuntu为 ~/.profile)

每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的~/ .bashrc 文件。 此文件类似于 /etc/profile,也是需要需要 source 才会生效,/etc/profile 对所有用户生效,~/.bash_profile 只对当前用户生效。~/.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。

阅读全文 »

PROBLEM

While migrating a portion of my Java code to Groovy code, I got bitten by the Groovy operator loading feature that I should have known better… and my pride hurts, but hey, I admit I write shitty code.

Consider this simple POGO with custom equals() and hashCode(), both implemented using Google Guava libraries:-

@Canonical
class Person {
    String firstName
    String lastName
    String email

    @Override
    boolean equals(Object o) {
        if (this == o) {
            return true
        }
        if (o == null || getClass() != o.getClass()) {
            return false
        }

        final Person other = (Person) o

        return Objects.equal(email, other.email)
    }

    @Override
    int hashCode() {
        return Objects.hashCode(email)
    }
}

What is wrong with the above code? Well, if you are mostly a Java developer like me, this look pretty much correct. However, when I perform an equality check, I get java.lang.StackOverflowError exception. I tend to see this exception when I write my too-smart-for-production recursion API that couldn’t seem find its way to end the recursion, causing the JVM stack to blow up.

SOLUTION

The reason we are getting java.lang.StackOverflowError exception is because Groovy overloads == with equals(). So, if (this == o) { ... } becomes if (this.equals(o)) { ... }. When we perform an equality check, it will call itself again and again until it chokes itself and dies.

To fix this, we have to use if (this.is(o)) { ... } to perform an identity check:-

@Canonical
class Person {
    String firstName
    String lastName
    String email

    @Override
    boolean equals(Object o) {
        if (this.is(o)) {
            return true
        }
        if (o == null || getClass() != o.getClass()) {
            return false
        }

        final Person other = (Person) o

        return Objects.equal(email, other.email)
    }

    @Override
    int hashCode() {
        return Objects.hashCode(email)
    }
}

原文地址:https://zhuanlan.zhihu.com/p/384752564

作者:chrootliu,腾讯 QQ 音乐前端开发工程师

本文将会从:安装 -> 全局配置 -> 常用的各种配置 来书写,其中常用配置写的炒鸡详细,需要的童鞋可以直接滑倒相应的位置查看。

安装 nginx

下载 nginx 的压缩包文件到根目录,官网下载地址:https://nginx.org/download/

yum update #更新系统软件
cd /
wget nginx.org/download/nginx-1.17.2.tar.gz

解压 tar.gz 压缩包文件,进去 nginx-1.17.2

tar -xzvf nginx-1.17.2.tar.gz
cd nginx-1.17.2

进入文件夹后进行配置检查

./configure

通过安装前的配置检查,发现有报错。检查中发现一些依赖库没有找到,这时候需要先安装 nginx 的一些依赖库

yum -y install pcre* #安装使nginx支持rewrite
yum -y install gcc-c++
yum -y install zlib*
yum -y install openssl openssl-devel

再次进行检查操作 ./configure 没发现报错显示,接下来进行编译并安装的操作

# 检查模块支持
./configure  --prefix=/usr/local/nginx  --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-threads --user=www --group=www

这里得特别注意下,你以后需要用到的功能模块是否存在,不然以后添加新的包会比较麻烦。

查看默认安装的模块支持

命令 ls nginx-1.17.2 查看 nginx 的文件列表,可以发现里面有一个 auto 的目录。

在这个 auto 目录中有一个 options 文件,这个文件里面保存的就是 nginx 编译过程中的所有选项配置。

通过命令:cat nginx-1.17.2/auto/options | grep YES就可以查看

nginx 编译安装时,怎么查看安装模块

编译并安装

make && make install

这里需要注意,模块的支持跟后续的 nginx 配置有关,比如 SSL,gzip 压缩等等,编译安装前最好检查需要配置的模块存不存在。

查看 nginx 安装后在的目录,可以看到已经安装到 /usr/local/nginx 目录了

whereis nginx
$nginx: /usr/local/nginx

启动 nginx 服务

cd /usr/local/nginx/sbin/
./nginx

服务启动的时候报错了:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) ,通过命令查看本机网络地址和端口等一些信息,找到被占用的 80 端口 netstat -ntpl 的 tcp 连接,并杀死进程 (kill 进程 pid)

netstat -ntpl
kill 进程PID

继续启动 nginx 服务,启动成功

./nginx

在浏览器直接访问 ip 地址,页面出现 Welcome to Nginx! 则安装成功。

阅读全文 »

DPI/pt/px 单位的含义 DPI(Dots Per Inch) 每英寸像素数。

DPI/pt/px 单位的含义

DPI(Dots Per Inch)

每英寸像素数。Windows 系统默认是 96dpi,Apple 系统默认是 72dpi。

pt (point,磅)

是一个物理长度单位,指的是 72 分之一英寸。

px (pixel,像素)

一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果 px 要换算成物理长度,需要指定精度 DPI,在扫描打印时一般都有 DPI 可选。常见浏览器的默认字体大小都是 16px。

由于屏幕大小的差异性,相同大小的字体在不同屏幕下显示的效果差异比较大。那么动态的放大 / 缩小字体就变得比较重要。显然针对每一处的字体设置都去做兼容是复杂的,于是就有了后面的 em 和 rem。

em (相对长度)

相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

由于浏览器的默认字体大小是 16px,所以未经调整默认字体大小的浏览器都符合: 1em = 16px。

em 会继承父级元素的字体大小。由此,只需要改变父元素的字体大小,就可以同步放大或缩小子元素的字体。

但是也因此需要注意几点:

1、body 选择器中声明 Font-size=62.5% (10 ÷ 16 × 100% = 62.5%);

2、将你的原来的 px 数值除以 10,然后换上 em 作为单位;

3、重新计算那些被放大的字体的 em 数值。避免字体大小的重复声明。

rem (font size of the root element)

由于 em 存在对父元素继承的问题,当改变字体大小时涉及的继承关系就变得复杂起来。

rem 是相对于根元素 字体尺寸的大小。如 文本大小设为 font-size: 10px,则 1rem = 10px。使用 rem 设置字体则简单了很多。

px 与 pt 的换算

px = pt * DPI / 72

像素与毫米的转换

象素数 / DPI = 英寸数
英寸数 * 25.4 = 毫米数

一英寸等于 25.4mm。那么毫米换算成像素的公式为:

水平方向的换算: x * px /25.4
垂直方向的换算: y * py /25.4
像素换算为毫米: x * 25.4 / px

pt/px/em/percent 换算参考

以 Windows 下的 96dpi 作参考,则有:pt = px_72/96 = px_3/4。
再考虑浏览器的默认字体大小是 16px,我们可以得到如下的换算参考:

html {font-size: 62.5%;  /*10 ÷ 16 × 100% = 62.5%*/}
body {font-size: 1.4rem; /*1.4 × 10px = 14px */}
h1 { font-size: 2.4rem;  /*2.4 × 10px = 24px*/}

一个经典的简单示例:

html {font-size: 62.5%;  /*10 ÷ 16 × 100% = 62.5%*/}
body {font-size: 1.4rem; /*1.4 × 10px = 14px */}
h1 { font-size: 2.4rem;  /*2.4 × 10px = 24px*/}

原文:https://lzw.me/a/pt-px-em-rem.html

原文地址 https://www.jianshu.com/p/86a7f506d1d2

ZooKeeper 默认开启在 2181 端口,在未进行任何访问控制情况下,攻击者可通过执行 envi 命令获得系统大量的敏感信息,包括系统名称、Java 环境。

0x00 ZooKeeper 安装:

Zookeeper 的默认开放端口是 2181

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

tar -zxvf zookeepre-3.4.10.tar.gz
cd zookeeper-3.4.10/
cd conf/
vi zoo.cfg
### 配置单机模式
tickTime=2000
dataDir=/tmp/zookeeper/data
dataLogDir=/tmp/zookeeper/logs
clientPort=2181

bin/zkServer.sh start   //启动
### 启动client连接server
bin/zkCli.sh -server localhost:2181

0x01 漏洞验证:

执行以下命令即可远程获取该服务器的环境:
echo envi|nc 192.168.15.74 2181

直接连接:
./zkCli.sh -server ip:port

其他攻击获取信息

stat:列出关于性能和连接的客户端的统计信息。
echo stat |ncat 127.0.0.1 2181

ruok:测试服务器是否运行在非错误状态。
echo ruok |ncat 127.0.0.1 2181

reqs:列出未完成的请求。
echo reqs |ncat 127.0.0.1 2181

envi:打印有关服务环境的详细信息。
echo envi |ncat 127.0.0.1 2181

dump:列出未完成的会话和临时节点。
echo dump |ncat 127.0.0.1 2181

0x02 漏洞修复

禁止把 Zookeeper 直接暴露在公网
添加访问控制,根据情况选择对应方式(认证用户,用户名密码)

zookeeper 有三个端口(可以修改),默认端口作用:

1、2181:对 cline 端提供服务
2、3888:选举 leader 使用
3、2888:集群内机器通讯使用(Leader 监听此端口)

修复办法 1 绑定指定 IP 访问 (推荐):

1、登陆 zookeeper

./zkCli.sh -server <IP>:<port>

2、查看当前权限:

getAcl /

3、添加可访问 IP

setAcl / ip:192.168.1.xx:cdrwa,ip:192.168.1.xx:cdrwa

4、查看是否正常添加

getAcl /

未授权也可以连接,但是查看节点时会报错 "KeeperErrorCode = NoAuth for /",localhost 都不行,必须填可访问 IP,才能访问。

[zk: localhost:2181(CONNECTED) 0] ls /
KeeperErrorCode = NoAuth for /
[zk: localhost:2181(CONNECTED) 1]

回退办法:
使用之前设置的 IP 进行访问:

./zkCli.sh -server <IP>:<port>

设置为所有人可访问:

setAcl / world:anyone:cdrwa

修复办法 2 添加防火墙访问控制:

配置防火墙策略,只允许指定 IP 访问 2181 端口。
Linux 6:

iptables -I INPUT -p tcp --dport 2181 -j DROP
iptables -I INPUT -s 172.16.65.xx -p tcp --dport 2181 -j ACCEPT
iptables -I INPUT -s 172.16.65.xx -p tcp --dport 2181 -j ACCEPT
iptables -I INPUT -s 172.16.65.xx -p tcp --dport 2181 -j ACCEPT
service iptables save
service iptables restart
iptables -L

Linux 7:

firewall-cmd --zone=public --remove-port=2181/tcp --permanent
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.0.2.181" port protocol="tcp" port="2181" accept"
firewall-cmd --reload
firewall-cmd --list-all

修复办法 3 设置身份验证(需要改程序):

为 ZooKeeper 配置相应的访问权限。

1)增加一个认证用户
addauth digest 用户名: 密码明文

addauth digest user1:password1

2)设置权限
setAcl /path auth: 用户名: 密码明文: 权限
setAcl /path digest: 用户名: 密码密文: 权限

setAcl /test auth:user1:password1:cdrwa

3)查看 Acl 设置

getAcl /path

0x03 参考链接:

ZooKeeper 未授权访问漏洞
Linux 系统安全加固 - ZooKeeper 未授权访问漏洞处理
ZooKeeper 未授权访问