[TOC]

0x00 系统配置

locale 命令

描述:查看或者设置系统语言的环境变量

1
2
3
4
5
6
7
8
#参数
系统信息:
-a, --all-locales 写出可用区域的名称
-m, --charmaps 写出可用字符映射的名称

修改输出格式:
-c, --category-name 写出选中范畴的名称
-k, --keyword-name 写出选中关键字的名称

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#示例1.系统语言环境变量设置查看
$locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"

#示例2.查看可用的字符集
$locale -a | egrep -n -i "en_US"
233:en_US
234:en_US.iso88591
235:en_US.iso885915
236:en_US.utf8
export LANG=en_US.utf8 #临时生效

#示例3.大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义
echo $LC_CTYPE
C.UTF-8

补充说明:

  • Debian 9 语系中文支持安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    /app# locale -a
    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_COLLATE to default locale: No such file or directory
    C
    C.UTF-8
    POSIX

    cat > /etc/apt/sources.list <<'END'
    deb http://mirrors.aliyun.com/debian stretch main contrib non-free
    deb-src http://mirrors.aliyun.com/debian stretch main contrib non-free
    deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free
    deb-src http://mirrors.aliyun.com/debian stretch-updates main contrib non-free
    deb http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free
    deb-src http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free
    END

    $ apt clean && apt update

    $ apt install -y locales
    # Reading package lists... Done
    # Building dependency tree
    # Reading state information... Done
    # The following additional packages will be installed:
    # libc-l10n
    # The following NEW packages will be installed:
    # libc-l10n locales
    # 0 upgraded, 2 newly installed, 0 to remove and 100 not upgraded.
    # Need to get 4108 kB of archives.
    # After this operation, 13.8 MB of additional disk space will be used.
    # Do you want to continue? [Y/n] y
    # Get:1 http://mirrors.aliyun.com/debian stretch/main amd64 libc-l10n all 2.24-11+deb9u4 [820 kB]
    # Get:2 http://mirrors.aliyun.com/debian stretch/main amd64 locales all 2.24-11+deb9u4 [3289 kB]
    # Fetched 4108 kB in 1s (3481 kB/s)
    # perl: warning: Setting locale failed.
    # perl: warning: Please check that your locale settings:
    # LANGUAGE = (unset),
    # LC_ALL = "zh_CN.GB18030",
    # LANG = "zh_CN.GB18030"
    # are supported and installed on your system.

    $ sed -i 's/# zh_CN.GB18030/zh_CN.GB18030/g' /etc/locale.gen

    $ locale-gen
    # $ echo -e "466 \n 3 \n" | dpkg-reconfigure locales
    # Locales to be generated: dpkg-reconfigure locales
    # Locales to be generated: 466
    # Many packages in Debian use locales to display text in the correct language for the user. You can choose a default locale for the system from the generated locales.
    # This will select the default language for the entire system. If this system is a multi-user system where not all users are able to speak the default language, they will experience difficulties.
    # 1. None 2. C.UTF-8 3. zh_CN.GB18030
    # Default locale for the system environment: 3
    # Generating locales (this might take a while)...
    # zh_CN.GB18030... done

    $ locale -a
    # C
    # C.UTF-8
    # POSIX
    # zh_CN.gb18030


localectl 命令

描述: 查询或更改系统区域设置和键盘设置。

基础语法&参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Query or change system locale and keyboard settings.
localectl [OPTIONS...] COMMAND ...

# Commands:
status Show current locale settings
set-locale LOCALE... Set system locale
list-locales Show known locales
set-keymap MAP [MAP] Set console and X11 keyboard mappings
list-keymaps Show known virtual console keyboard mappings
set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]]
Set X11 and console keyboard mappings
list-x11-keymap-models Show known X11 keyboard mapping models
list-x11-keymap-layouts Show known X11 keyboard mapping layouts
list-x11-keymap-variants [LAYOUT]
Show known X11 keyboard mapping variants
list-x11-keymap-options Show known X11 keyboard mapping options

# Options:
-h --help Show this help
--version Show package version
--no-pager Do not pipe output into a pager
--no-ask-password Do not prompt for password
-H --host=[[email protected]]HOST Operate on remote host
-M --machine=CONTAINER Operate on local container
--no-convert Don't convert keyboard mappings

使用案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# (1) 查看当前区域配置
~$ localectl status
# System Locale: LANG=en_US.UTF-8
# VC Keymap: n/a
# X11 Layout: cn
# X11 Model: pc105

# (2) 查看系统支持的汉语区域语言
~$ localectl list-locales
# C.UTF-8
# en_US.UTF-8

# (3) 设置区域语言
~$ localectl set-locale LANG=zh_CN.utf8


getconf 命令

描述:它是个ELF可执行文件,该命令将系统配置变量值写入标准输出用于获取系统信息,在进行LINUX编程中可以提供其帮忙;

基础语法:

1
2
3
4
5
6
#语法
Usage: getconf [-v specification] variable_name [pathname]
getconf -a [pathname]

#参数
-a 标志调用,并写入全部系统配置变量值到标准输出。

系统范围配置变量
描述:系统范围配置变量包含系统各部分中的最小值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
_CS_PATH 	PATH 环境变量值,用以查找命令。
---|---
ARG_MAX 用于一个 exec 子例程的参数的最大长度(以字节为单位),包含环境数据。
BC_BASE_MAX bc 命令使用的 obase 变量允许的最大值。
BC_DIM_MAX bc 命令所允许的一个数组中的最大元素数。
BC_SCALE_MAX bc 命令使用的 scale 变量允许的最大值。
BC_STRING_MAX bc 命令可接受的字符串常量的最大长度。
CHARCLASS_NAME_MAX 字符类名中的最大字节数。
CHAR_BIT 类型 character 的位数。
CHAR_MAX 类型 character 的最大值。
CHAR_MIN 类型 character 的最小值。
CHILD_MAX 每个真实用户标识同时打开进程的最大数量。
CLK_TCK 由 time 子例程返回的每秒钟时钟计数。
COLL_WEIGHTS_MAX 配给在一个语言环境定义文件的 LC_COLLATE 语言环境节中条目的最大权重。
CS_PATH PATH 环境变量值,用以查找命令。
EXPR_NEST_MAX 圆括号内可嵌套的最大表达式数,用于 expr 命令。
INT_MAX 类型的最大值,类型为 int。
INT_MIN 类型的最小值,类型为 int。
LINE_MAX 当实用程序被描述成为处理文本文件时,命令输入行(标准输入或者是其它文件)的最大长度(以字节为单位)。长度包含换行字符的空间。
LONG_BIT 类型中的位数,类型为 long int。
LONG_MAX 类型的最大值,类型为 long int。
LONG_MIN 类型的最小值,类型为 long int。
MB_LEN_MAX 在所有支持的语言环境中一个字符的最大字节数。
NGROUPS_MAX 每个进程中同时补充的最大组标识数。
NL_ARGMAX 在 printf 和 scanf 子例程调用中的数字最大值。
NL_LANGMAX 在一个 LANG 名中最大字节数。
NL_MSGMAX 最大消息数。
NL_NMAX 一个从 N 到 1 整序映射中最大字节数。
NL_SETMAX 最大设置数。
NL_TEXTMAX 一个消息字符串中最大字节数。
NZERO 缺省进程优先级。
OPEN_MAX 在进程中可同时打开的最大文件数。
PATH 用以查找命令的以冒号相隔的路径前缀的序列。
RE_DUP_MAX 当使用间隔符号参数时允许正则表达式重复出现次数的最大值,正如 ed 命令使用的 m 和 n 参数。
SCHAR_MAX 类型的最大值,类型为 signed char。
SCHAR_MIN 类型的最小值,类型为 signed char。
SHRT_MAX 类型的最大值,类型为 short。
SHRT_MIN 类型的最小值,类型为 short。
SSIZE_MAX 一个类型为 ssize_t 的对象的最大值。
STREAM_MAX 一个进程可同时打开的流数。
TMP_MAX 由 tmpnam 子例程生成的唯一路径名的最小数量。一个应用程序可靠调用 tmpnam 子例程的最多次数。
TZNAME_MAX 一个时区名支持的最大字节数(非 TZ 环境变量的长度)。
UCHAR_MAX 类型的最大值,类型为 unsigned char。
UINT_MAX 类型的最大值,类型为 unsigned int。
ULONG_MAX 类型的最大值,类型为 unsigned long int。
USHRT_MAX 类型的最大值,类型为 unsigned short int。
WORD_BIT 字或类型 int 中的位数。
KERNEL_BITMODE 内核的位方式,32 位或 64 位.
REAL_MEMORY 真实内存大小。
HARDWARE_BITMODE 计算机硬件的位方式,32 位或 64 位。
MP_CAPABLE 计算机微处理器容量。


系统标准配置变量
描述:系统标准配置变量包含由一个特殊系统标准所要求的最小值。

  • POSIX、POSIX2_ 和 XOPEN 前缀显示变量包含分别由 POSIX 1003.1、POSIX 1003.2 和 X/Open 系统标准要求的系统特性最小值。
  • 系统标准是系统满足的用来支持特定系统标准的全系统最小值。实际配置值可能超出这些标准。

基础信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
_POSIX_ARG_MAX 	用于 exec 子例程的参数的最大长度(以字节为长度),包含环境数据。
_POSIX_CHILD_MAX 每个真实用户标识同时打开进程的最大数量。
_POSIX_JOB_CONTROL 如果系统支持作业控制,则值为 1。
_POSIX_LINK_MAX 到单个文件的最大链接数。
_POSIX_MAX_CANON 在终端规范输入队列中的最大字节数。
_POSIX_MAX_INPUT 在终端输入队列中允许的最大字节数。
_POSIX_NAME_MAX 文件名中的最大字节数(不包含终止空字符)。
_POSIX_NGROUPS_MAX 每个进程中同时补充的最大组标识数。
_POSIX_OPEN_MAX 在进程中可同时打开的最大文件数。
_POSIX_PATH_MAX 路径名中的最大字节数。
_POSIX_PIPE_BUF 写入管道时保证成为原子的最大字节数。
_POSIX_SAVED_IDS 值为1。每个进程具有保存的 set-user-ID 和保存的 set-group-ID。
_POSIX_SSIZE_MAX 可存进一个类型为 ssize_t 对象的最大值。
_POSIX_STREAM_MAX 一个进程可同时打开的流数。
_POSIX_TZNAME_MAX 一个时区名支持的最大字节数(非 TZ 环境变量的长度)。
_POSIX_VERSION 操作系统遵守的 POSIX 1 标准(C 语言绑定)的版本。
_XOPEN_CRYPT 如果系统支持 X/Open 加密功能组则值为 1。
_XOPEN_ENH_I18N 如果系统支持 X/Open 增强国际化功能组则值为 1。
_XOPEN_SHM 如果系统支持 X/Open 共享内存功能组则值为 1。
_XOPEN_VERSION 操作系统所遵守的 X/Open 可移植性指南的版本。
_XOPEN_XCU_VERSION 操作系统所遵守的 X/Open 命令和实用程序规范的版本。
_XOPEN_XPG2 如果系统支持 1987 年 1 月卷 2 的 X/Open 可移植性指南,XVS 系统调用和库,则值为 1,否则为未定义。
_XOPEN_XPG3 如果系统支持 1992 年 2 月 的 X/Open 规范,系统接口和头第三版,则缺省值为 1,否则为未定义。
_XOPEN_XPG4 如果系统支持 1992 年 7 月 的 X/Open CAE 规范,系统接口和头第 4 版,则值为 1,否则为未定义。
POSIX2_BC_BASE_MAX 允许的最大值,用于 obase 变量并使用 bc 命令。
POSIX2_BC_DIM_MAX bc 命令允许数组中的最大元素数。
POSIX2_BC_SCALE_MAX 允许的最大值,用于 scale 变量,执行 bc 命令。
POSIX2_BC_STRING_MAX 可被 bc 命令接受的字符串常量的最大长度。
POSIX2_CHAR_TERM 系统支持至少一个终端类型则值为 1;否则值为 -1。
POSIX2_COLL_WEIGHTS_MAX 配给一个条目的最大权重数目,条目在一个语言环境定义文件中的 LC_COLLATE 语言环境变量中。
POSIX2_C_BIND 如果系统支持 POSIX 2 中的 C 语言绑定选项,则值为 1;否则,值为-1。
POSIX2_C_DEV 如果系统支持 POSIX 2 中的 C 语言开发实用程序则值为 1;否则,值为 -1。
POSIX2_C_VERSION 操作系统所遵守的 POSIX 2 标准(C 语言绑定)的版本。
POSIX2_EXPR_NEST_MAX 圆括号内可嵌套的最大表达式数,用于 expr 命令。
POSIX2_FORT_DEV 如果系统支持 POSIX 2 中的 FORTRAN 开发实用程序选项则值为 1;否则,值为 -1。
POSIX2_FORT_RUN 如果系统支持 POSIX 2 中的 FORTRAN 运行时实用程序选项则值为 1;否则,值为 -1。
POSIX2_LINE_MAX 当命令被描述成处理文本文件时,一个命令输入行(标准输入或其他文件)的最大字节长度。长度包含换行字符空间。
POSIX2_LOCALEDEF 如果系统支持由 localedef 命令创建语言环境,则值为 1;否则值未定义。
POSIX2_RE_DUP_MAX 当使用间隔计数参数时正则表达式所允许重复出现的最大值,例如带 m 和 n 参数使用 ed 命令。
POSIX2_SW_DEV 系统支持软件开发实用程序选项则值为 1;否则,值为 -1。
POSIX2_UPE 如果系统支持 POSIX 2 中用户可移植实用程序选项,则值为 1;否则,值为 -1。
POSIX2_VERSION 系统支持的 POSIX 2 标准的最新版本的批准日期。这个日期是一个六位数字,前四位数字表示年份后两位数字表示月份。POSIX 2 标准的不同版本由 IEEE 标准委员会定期批准,批准日期用于区分不同版本。


系统路径配置变量:
该变量值包含在系统中的路径和路径结构信息;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
_POSIX_CHOWN_RESTRICTED 	chown() 子例程以适当的特权限制在进程,并且将文件的组标识只更改为进程的有效组标识或辅助组标识之一。如果 PathName 参数引用目录,其返回值应用于除在目录中已存在的或可被创建的目录外的所有文件。
_POSIX_NO_TRUNC 路径名长于变量 NAME_MAX 指定的限定值就会产生错误。如果 PathName 参数引用目录,其返回值应用于目录中的文件名。
_POSIX_VDISABLE 终端特殊字符,定义在 termios.h 文件中,可使用这一字符值禁用。
LINK_MAX 链接一个文件的最大链接数。如果 PathName 参数引用目录,则返回值应用于该目录。
MAX_CANON 在终端规范输入行中的最大字节数。
MAX_INPUT 在终端输入队列有可用空间的最大字节数。
NAME_MAX 文件名中的最大字节数(不包含终止空字符)。如果 PathName 参数引用目录,返回值应用于目录内的文件名。
PATH_MAX 路径名中的最大字节数,包含终止空字符。如果 PathName 参数引用目录,返回值为当指定目录是工作目录时的相对路径名的最大长度。
PIPE_BUF 当写入管道时保证成为原子的最大字节数。如果这个 PathName 参数指向先进先出或是管道,其返回值应用于引用对象。如果 PathName 参数引用目录,返回值应用于任何已存在的或可在目录内创建的先进先出。
DISK_PARTITION 磁盘的物理分区大小。
注:
对于 DISK_PARTITION 路径配置变量,这个 PathName 参数必须指定为之查询信息的磁盘的完整路径。
DISK_SIZE 磁盘大小以兆字节为单位。
注:
对于 DISK_SIZE 路径配置变量,这个 PathName 参数必须指定为之查询信息的磁盘的完整路径。

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#获取系统所有变量信息

#查看系统内存分页大小
getconf PAGE_SIZE

#linux是32位还是64位最简单的方法
getconf LONG_BIT

#获取系统类型所占
getconf CHAR_BIT
8

#参数关键配置文件
/usr/bin/getconf #包含一个 getconf 命令。
/usr/include/limits.h #定义系统配置变量。
/usr/include/unistd.h #定义系统配置变量。


chsh 命令

描述:切换当前shell终端为zsh/或者其他shell

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#查看shell列表
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh

#切换shell为zsh,重启后,查看当前shell
$ chsh -s /bin/zsh
Changing shell for root.
Shell changed.

WeiyiGeek# echo $SHELL
/bin/zsh


0x01 系统运行安全

1.selinux 相关

getenforce 命令
setenforce 命令

描述:SELinux是Linux系统上一个常见的安全软件,如果熟悉它的规则,可以用它来为Linux系统新增一道保障;
SELinux一共有3种状态,分别是Enforcing,Permissive和Disabled状态。

  • 第一种是默认状态,表示强制启用,
  • 第二种是宽容的意思,即大部分规则都放行。
  • 第三种是禁用,即不设置任何规则

操作实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#方式1.---------------通过图像进行管理----------------------
#我们需要安装SELinux的图形管理工具,命令是:
yum install policycoreutils-gui -y
#安装完成后,执行一个命令启动gui管理工具,命令是:
system-config-selinux


#方式2.临时生效
$getenforce #查看一下SELinux的状态,默认情况下一般都是Enforcing状态,也就是强制启用的意思
Enforcing

usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
#只能通过setenforce命令来设置前面两种状态,而如果想修改为disable状态,需要修改配置文件,同时重启系统
$setenforce 2

#方式3.通过修改设置文件,让某个配置永久生效,配置文件的位置是:
vim /etc/selinux/config
SELINUX = disable
#或者
sed -i "s#SELINUX=enforcing#SELINUX = disable#g" /etc/selinux/config


semanage 命令

描述:默认目录的安全上下文查询与修改,简单得说是用来查询与修改SELinux默认目录的安全上下文。
SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
semanage {import,export,login,user,port,ibpkey,ibendport,interface,module,node,fcontext,boolean,permissive,dontaudit} -l

#usage: usage: semanage fcontext
[-h] [-n] [-N] [-S STORE] [ --add ( -t TYPE -f FTYPE -r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) | --delete ( -t TYPE -f FTYPE | -e EQUAL ) FILE_SPEC ) | --deleteall | --extract | --list -C | --modify ( -t TYPE -f FTYPE -r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) ]

#usage: semanage port
[-h] [-n] [-N] [-S STORE] [ --add -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) | --delete -p PROTOCOL ( port_name | port_range ) | --deleteall | --extract | --list -C | --modify -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) ]

```

选项:
```bash
#fcontext:主要用在安全上下文方面。
-l:查询。
-a:增加,你可以增加一些目录的默认安全上下文类型设置。
-m:修改。
-d:删除。

#port:主要用在的端口方面。
-a:增加
-t:指定SELinux 端口类型(ssh_port_t )
-p: 端口协议

实例:

  • fcontext
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # 示例1.查询一下/var/www/html的默认安全性本文的设置:
    $ semanage fcontext -l |grep "/var/www"
    SELinux fcontext 类型 上下文
    ....(前面省略)....
    /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
    ....(後面省略)....

    # 如上面例子所示,我们可以查询的到每个目录的安全性本文!而目录的设定可以使用正则表达式去指定一个范围。那么如果我们想要增加某些自定义目录的安全性本文呢?
    # 示例2.举例来说,我想要设置/srv/samba成为 public_content_t的类型时,应该如何设置呢?
    # 答:用semanage命令设置/srv/samba目录的默认安全性本文为public_content_t:
    mkdir /srv/samba && ll -Zd /srv/samba
    drwxr-xr-x root root root:object_r:var_t /srv/samba
    # 如上所示,默认的情况应该是var_t这个咚咚的!
    semanage fcontext -l | grep '/srv'
    /srv/.* all files system_u:object_r:var_t:s0
    /srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0
    /srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
    /srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0
    /srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
    /srv directory system_u:object_r:var_t:s0 //看这里!
    #上面则是默认的/srv底下的安全性本文资料,不过并没有指定到/srv/samba。
    semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
    semanage fcontext -l | grep '/srv/samba'
    /srv/samba(/.*)? all files system_u:object_r:public_content_t:s0


    # 示例3.在selinux中进行写入
    $cat /etc/selinux/targeted/contexts/files/file_contexts.local
    # This file is auto-generated by libsemanage,Please use the semanage command to make changes
    /srv/samba(/.*)? system_u:object_r:public_content_t:s0 #写入这个档案默认账
    $restorecon -Rv /srv/samba* #尝试恢复默认值
    $ll -Zd /srv/samba
    drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ #有默认值以后用restorecon命令来修改比较简单!

补充说明:

  • 如上所示你可以使用semanage来查询所有的目录默认值,也能够使用它来增加默认值的设置!


实际案例: Port-SElinux系统端口更改

1
2
3
4
5
6
7
8
9
# 示例0.查看指定
$ semanage port -l | grep "ssh"
SELinux 端口类型 协议 端口号
ssh_port_t tcp 22

# 示例1.如果希望更改SELinux系统上的端口,则必须将此更改告知SELinux。
$ semanage port -a -t ssh_port_t -p tcp 62222
$ semanage port -l | grep "ssh"
ssh_port_t tcp 62222, 22


restorecon 命令

描述:该命令用来恢复SELinux文件属性即恢复文件的安全上下文。

假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的SELinux配置信息是继承原来那个目录的,与/var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,如何解决?

此时便需要采用restorecon命令进行恢复文件安全上下文,具体如何操作请看下面得基础示例;

基础语法选项:

1
2
3
4
5
6
7
8
9
10
11
#语法
restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
#选项
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R/-r:递归处理目录。
-n:不改变文件标签。
-o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#示例1.使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)
# * 这个时候我们使用firefox浏览器输入127.0.0.1/index.html发现打不开,
# * 查看一下SELinux的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出,
# * 进程httpd访问网页主目录中的index.html时被SELinux阻止,原因是因为SELinux配置信息不正确,
# * 正确的SELinux配置信息应该是scontext=后面的部分,
# * 而index.html文件的SELinux配置信息却是tcontext=后面的部分,
# * 从tcontext=的第三段“admin_home_t”不难看出,这个文件的SELinux配置信息是root用户家目录的。
type=AVC msg=audit(1378974214.610:465): avc: denied { open } for pid=2359 comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=1317685 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
#/*使用ls -Z也可以看出文件和目录的SELinux信息不匹配*/
ls -Z /var/www/html/
#.... unconfined_u:object_r:admin_home_t:s0 index.html #文件
ls -Zd /var/www/html/
#.... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ #目录
restorecon -vR /var/www/html/ #恢复该目录下得所有文件得SELinux配置信息;


0x02 系统内核管理

ulimit 命令

描述:Ulimit 用于限制当前shell内进程的资源使用,并发线程限制;
ulimit到底有怎样的运用
假设:有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

用途:用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时它支持硬资源和软资源的限制。

  • 作为临时限制:ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。
  • 长期的固定限制:ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的shell 用户。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#语法:
ulimit(选项)

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
#全局配置文件 :/etc/security/limits
<domain><type><item><value>

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#示例1.查看系统资源进程使用限制
ulimit -a #查看默认值
# core file size (blocks, -c) 0
# data seg size (kbytes, -d) unlimited
# scheduling priority (-e) 0
# file size (blocks, -f) unlimited
# pending signals (-i) 7962
# max locked memory (kbytes, -l) 64
# max memory size (kbytes, -m) unlimited
# open files (-n) 1024 #此种参数
# pipe size (512 kbytes, -p) 8
# POSIX message queues (kbytes, -q) 819200
# real-time priority (-r) 0
# stack size (kbytes, -s) 8192
# cpu time (seconds, -t) unlimited
# max user processes (-u) 7962
# virtual memory (kbytes, -v) unlimited
# file locks (-x) unlimited


#示例2.限制系统参数设置
ulimit -s 100 #限制堆栈大小
ulimit -m 5000 -v 5000 #限制shell内存使用
ulimit -n 900000 #限制文件90万

性能优化

  1. linux 修改open files 数
    概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够,修改ulimit和file-max,特别是提供大量静态文件访问的web服务器缓存服务器(如squid), 更要注意这个问题。
    设置ulimit和file-max两者之间的关系差别:
  • file-max:/proc/sys/fs/file-max,是设置系统所有进程一共可以打开的文件数量,同时一些程序可以通过setrlimit调用,设置每个进程的限制,如果得到大量使用完文件句柄的错误信息,是应该增加这个值也就是说这项参数是系统级别的。
  • ulimit:即设置当前shell以及由它启动的进程的资源限制。
    显然,对服务器来说file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题;

修改方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.修改file-max文件或者内核 
#下面面2种重启机器后会恢复为默认值
echo 6553560 > /proc/sys/fs/file-max
sysctl -w "fs.file-max=6553560"

# vim /etc/sysctl.conf, 加入以下内容,重启生效
fs.file-max = 6553560


#2. 修改ulimit的open file,系统默认的ulimit对文件打开数量的限制是1024
ulimit -HSn 102400 #这只是在当前终端有效退出之后,open files又变为默认值。当然也可以写到/etc/profile中,因为每次登录终端时,都会自动执行/etc/profile
# vim /etc/security/limits.conf #加入以下配置,重启即可生效
* soft nofile 65535
* hard nofile 65535

补充:

  • 附录1.为了让一个程序的open files数目扩大,可以在启动脚本前面加上ulimit -HSn 102400命令。但当程序是一个daemon时,可能这种方法无效因为没有终端。
  • 附录2.如果某项服务已经启动,再动态调整ulimit是无效的,特别是涉及到线上业务就更麻烦了,这时可以考虑通过修改/proc/程序pid/limits来实现动态修改!
WeiyiGeek.ssh服务limit设置

WeiyiGeek.ssh服务limit设置


udevadm 命令

描述:它控制 systemd-udevd 的运行时行为,请求内核事件、管理事件队列并且提供简单的调试机制,udevadm 需要命令和命令特定的操作。

语法基础:

1
2
3
4
5
6
7
udevadm info [OPTIONS] [DEVPATH|FILE] #查询sysfs或udev数据库
-q --query=TYPE Query device information:
name Name of device node
symlink Pointing to node
path sysfs device path
property The device properties
all All values

基础示例:

1
2
3
4
5
6
7
#示例:查询sysfs或udev数据库中的硬件信息
$udevadm info -q all -n /dev/sda2
P: /devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
N: sda2
S: disk/by-id/lvm-pv-uuid-WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ
S: disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part2
E: DEVLINKS=/dev/disk/by-id/lvm-pv-uuid-WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part2