分类 运维 下的文章

Linux服务器安全配置之SSH

上篇我们讲了服务器用户管理方面的安全配置,接下来这篇讲解下SSH的安全配置。

1、修改默认端口:默认Port为22,并且已经注释掉了;修改是把注释去掉,并修改成其它的端口,1024-65535并且未被使用的。

2、禁止root从ssh登陆

PermitRootLogin no
StrictModes yes

3、禁止空密码登录

PermitEmptyPasswords no

4、仅允许SSH协议版本2

SSH协议有两个版本,仅使用SSH协议版本2会更安全,SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。

编辑/etc/ssh/sshd_config文件并查找下面这样的行:

Protocol 2,1 修改为 Protocol 2

5、SSH高级配置——使用RSA公钥认证登录

使用RSA公钥认证可以预防你的系统遭受字典攻击,因为你不需要用登录名和密码登录SSH服务,而是一对RSA密钥,一个公钥和一个私钥。在本地机器上生成并保存私钥,将公钥传到服务器上。当你发起一个SSH登陆会话时,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接登录shell,不再要求密码。如果它们不匹配,你的连接将会被自动断开。

服务器端配置如下

vi /etc/ssh/sshd_config
# 确认以下设置
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

完成后保存退出。接着在登录用户home目录下创建文件夹(.ssh)和文件(authorized_keys)

mkdir ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys

将需要登录远程服务器的主机(就是你自己电脑)生成的公钥复制到里面。可以有多个公钥,一行一个。公钥中含有空格时,请注意不要让编辑器自动换行。保存退出后,设置文件权限:

chmod 600 ~/.ssh/authorized_keys

然后,重启 sshd

sudo service ssh restart

接下来重点讲解下客户端(就是我们自己电脑)如何生成RSA密钥对。

1、Linux——用ssh-keygen生成

root@kali:/home# ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ec:a6:0e:f7:d2:f3:e6:19:d5:6e:1a:ae:xx:xx:xx:xx root@kali
The key's randomart image is:
+--[ RSA 1024]----+
|                 |
|                 |
|                 |
|       .     .   |
|        S.  E .  |
|       .. .o .   |
|    . ..ooo.. o  |
|     o.++.++ +   |
|     .ooo==oo    |
+-----------------+

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),不建议设置口令。如果担心私钥的安全,可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
这时再输入下面的命令,将公钥传送到远程主机host上面:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

如果更改过SSH监听端口,则使用命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10022 user@server"

好了,从此你再登录服务器,就不需要输入密码了。

如果执行后显示

Permission denied (publickey).

,则需要修改服务器/etc/ssh/sshd_config文件

PasswordAuthentication no
# no改为yes

2、windows系统客户端——用puttygen生成

win下远程登录linux服务器需要使用putty这个工具,为了免密码登录需要先用puttygen工具生成公私钥对。(文末提供工具下载链接

1).设置密钥类型和密钥位数

设置密钥类型和密钥位数

2).点击“生成”开始生成密钥对

点击“生成”开始生成密钥对

3).保存生成的密钥对

保存生成的密钥对

至此成功生成公私钥对,接下来要手动操作把公钥发给服务器管理员,让其把公钥加到登录用户home下的authorized_keys末尾。

4).在putty中载入ppk结尾的私钥

在putty中载入ppk结尾的私钥

来张图,成功登录。

成功登录

参考文章:

SSH原理与运用(一):远程登录

Linux ssh 使用深度解析(key登录详解)

Linux 服务器与 PuTTY 客户端配置指南

Linux服务器安全配置之用户管理

以 Debian/Ubuntu 系统为例说明,使用 CentOS/RedHat 系统会有差异

添加用户、用户组

首先,添加一个用户组(这里假定为admin用户组)。

addgroup admin

然后,添加一个新用户(假定为bill)。

useradd -d /home/bill -s /bin/bash -m bill 

上面命令中,参数d指定用户的主目录,参数s指定用户的shell,参数m表示如果该目录不存在,则创建该目录。

接着,设置新用户的密码。

passwd bill 

将新用户(bill)添加到用户组(admin)。

usermod -a -G admin bill 

接着,为新用户设定sudo权限。

visudo 
如果提示命令未找到,则执行

apt-get install sudo

进行安装。

visudo命令会打开sudo设置文件/etc/sudoers 找到下面这一行。

root    ALL=(ALL:ALL) ALL

在这一行的下面,再添加一行。

root    ALL=(ALL:ALL) ALL
bill    ALL=(ALL) NOPASSWD: ALL

上面的NOPASSWD表示,切换sudo的时候,不需要输入密码,我喜欢这样比较省事。如果出于安全考虑,也可以强制要求输入密码。

root    ALL=(ALL:ALL) ALL
bill    ALL=(ALL:ALL) ALL

然后,先退出root用户的登录,再用新用户的身份登录,检查到这一步为止,是否一切正常。

exit
ssh bill@128.199.209.xxx

sudo配置

一定要禁用 root 账号,使用 sudo 代替。

接下来讲下配置步骤

1.安装sudo(如果安装过则跳过)

apt-get install sudo

一般来说 ubuntu 系统会默认安装好 sudo 并配置好第一个用户账号为 sudoer。一些 VPS 定制版本可能未设置这一步。请立即安装 sudo 提升系统安全。

2.检查/etc/sudoers文件

cat /etc/sudoers

请确保有下列行:

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

即 admin 组账号有 sudo 权限。

不同系统默认sudo权限组不同(即不一定是admin),检查方法:cat /etc/group

然后将指定的用户,比如 username 加入 admin 组:

usermod -a -G admin username

完成后,可以使用 id username 查看用户组。然后,退出 root 账号,使用 username 登录,使用 sudo -i 升权为 root。

确认无误后,请立即删除 root 账号的密码

sudo passwd -d root

要再次启用root,重新设置其密码即可:

sudo passwd root
passwd命令详解
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。

下篇:Linux服务器安全配置之SSH

Linux服务器安全配置之MySQL

1、设置root用户的安全口令

  • 法1 用mysqladmin命令来改root用户口令

# mysqladmin -uroot password newpassword

  • 用set password修改口令

mysql> set password for root@localhost=password('ecan5com');

  • 直接修改user表的root用户口令

mysql> use mysql;
mysql> update user set password=password('ecan5com') where user='root';
mysql> flush privileges;

2、删除默认的数据库和用户

我们的数据库是在本地,并且也只需要本地的php脚本对mysql进行读取,所以很多用户不需要.mysql初始化后会自动生成空用户和test库,这会对数据库构成威胁,我们全部删除.

mysql> use mysql;  
mysql> delete from db;  
mysql> delete from user where not(host="localhost" and user="root");  
mysql> flush privileges;

3、改变默认mysql管理员的名称(仅为建议)

因为默认的mysql的管理员名称是root,所以如果能够修改的话,能够防止一些脚本小子对系统的穷举.我们可以直接修改数据库,把root用户改为"admin".

mysql> use mysql;  
mysql> update user set user="admin" where user="root";  
mysql> flush privileges;

4.设置web应用专用mysql用户并控制权限

use mysql;
INSERT INTO user(Host,User,Password) VALUES('localhost','username',PASSWORD('yourpass'));

web应用一般只要有create,insert,select,update,delete,drop等权限就可以。有需要特殊数据库 特殊权限的可以单独赋予权限。

mysql权限管理 grant&revoke

一、GRANT 语句语法

GRANT privileges (columns)  ON what TO user IDENTIFIEDBY "password" WITH GRANT OPTION

语句各部分含义解释如下:

  1. privileges 分配给用户的权限。下表列出了可在GRANT 语句中使用的权限说明符;
    privileges权限说明符
  2. columns 权限适用的列。这是可选的,只来设置列专有的权限。如果命名多于一个列,则用逗号分开。
  3. what 权限应用的级别。权限可以是全局的(适用于所有数据库和所有的表)、数据库专有的(适用于某个数据库中的所有表),或表专有的。可以通过指定一个columns子句将权限授予特定的列。
  4. user 使用权限的用户。它由用户名和主机名组成。如:root@localhost
  5. password 分配给该用户的口令。这是可选的。如果您不给新用户指定IDENTIFIEDBY子句,该用户不分配口令(是非安全的)。对于已有的用户,任何指定的口令将替代旧口令。如果不指定新口令,用户的旧口令仍然保持不变。当您确实要使用IDENTIFIEDBY时,该口令串应该是直接量,GRANT 将对口令进行编码。当用SET PASSWORD语句时,不要使用PASSWORD() 函数。
  6. WITH GRANT OPTION 子句是可选的。如果包含该子句,该用户可以将GRANT 语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户。

二、REVOKE 语句

为了收回某个用户的权限,可使用REVOKE 语句。除了要用FROM 替换TO 并且没有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的语法与GRANT 语句非常相似:

REVOKE privileges (columns) ON what FROM user

user 部分必须与您想要取消其权限的用户的原始GRANT 语句的user 部分相匹配。priv i l e g e s 部分不需要匹配,您可用GRANT 语句授权,然后用REVOKE 语句取消其中的一部分。

REVOKE 语句只删除权限,不删除用户。用户的项仍然保留在user 表中,即使您取消了该用户的所有权限也是如此。这意味着该用户仍然可连接到服务器上。要想删除整个用户,必须用DELETE 语句将该用户的记录从user 表中直接删除。

更多相关内容请点击

5.mysql安全配置

  • file_priv 权限不付给管理员以外的用户,防止出现load data '/etc/passwd'到表中再用select 显示出来的问题
  • 不要将process或super权限付给非管理用户,该mysqladmin processlist可以列举出当前执行的查询文本;super权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器
  • 禁止远程访问方法 1.Host=localhost 2.在my.ini或my.cnf中添加bind-address=127.0.0.1
  • 确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限
  • 关闭phpmyadmin空密码登录:
    config.inc.php(根目录)或者config.default.php(根目录)
    再则:libraries\config.default.php
    (由于版本不一样可能涉及的文件不同,基本为这三个文件)
    中的$cfg['Servers'][$i]['AllowNoPassword'] = false;
    改为$cfg['Servers'][$i]['AllowNoPassword'] = true;
  • phpmyadmin不自动登录
    $cfg['Servers'][$i]['auth_type'] = 'cookie'; //原始设置为config
    $cfg['blowfish_secret'] = '这里输入一串字符';
    $cfg['Servers'][$i]['user'] = 'username';
    $cfg['Servers'][$i]['password'] = 'yourpass';

实例笔记:

mysql> use mysql;
mysql> INSERT INTO user(Host,User,Password) VALUES('localhost','username',PASSWORD('yourpass'));
mysql> flush privileges;
mysql> GRANT [CREATE,]SELECT,INSERT,DELETE,UPDATE,DROP ON db_name.* TO dbUser@localhost IDENTIFIED BY "password";
mysql> flush privileges;
参考文章

数据库与服务器安全选项拾遗

Mysql数据库的用户帐号管理

如何提高MySql的安全性?

Linux下vsftpd的安装、用户管理和SSL安全配置

一、安装

Debian下使用apt-get命令安装vsftp
#apt-get install vsftpd -y

二、ftp用户配置

1.先检查一下nologin的位置,通常是/usr/sbin/nologin或者/sbin/nologin。

2.接着创建系统账户

#useradd -d /home/www/ftproot -s /usr/sbin/nologin ftpuser
/home/www/ftproot 为该系统用户家(home)目录,ftpuser为用户名
为该帐户设置密码:
#passwd ftpuser
输入两次相同密码即可

3.然后修改指定目录的权限

#chown -R ftpuser.ftpuser /home/www/ftproot

chown -R命令改变文档/目录所有者。详解

4.配置vsftp

编辑vsftp配置文件,命令如下:
#vi /etc/vsftpd.conf
将配置文件中”anonymous_enable=YES “改为 “anonymous_enable=NO”
删除如下配置前的注释符号(#):
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
:wq 保存退出

接着创建vsftpd.chroot_list文件,并将ftp用户名添加进去
#touch /etc/vsftpd.chroot_list && echo ftpuser > /etc/vsftpd.chroot_list

5.修改shell配置

vi编辑/etc/shells,如果该文件里没有/usr/sbin/nologin或者/sbin/nologin(具体看当前系统配置)则追加进去

6.重启vsftp服务并测试登录

#service vsftpd restart
然后用帐号ftpuser测试下是否可以登陆ftp。目录是/home/www/ftproot

三、vsftp安全配置

前面配置了用户访问权限管理中的使用nologin禁止FTP帐户登录Linux服务器,现在再配置些更安全的。

1.限制恶意占有带宽的用户

在vsftp中,匿名用户和本地用户的速度限制是分开的。前者是anon_max_rate,后者是local_max_rate。 它们的单位都是byte(字节)。

如果让匿名用户和本地的用户都以最高300KB的速度下载,那么这个数字应该是1024×300=307200。在vsftpd.conf文件末尾中加入下面的两行即可:

anon_max_rate=307200
local_max_rate=307200

然后重启vsftpd服务即可。

另外,还可以限制FTP的最大连接数和每个IP的最大连接数。这两个参数分别是Max_clients和Max_per_ip。和上面一样,也只需要在vsftpd.conf文件末尾添加参数即可,如下设成了最大连接数100,每个IP的最大连接数5个:

max_clients=100
max_per_ip=5

2.防止FTP密码被恶意嗅探

由于vsftpd发送的数据是以明文方式传输,尤其是密码容易被恶意的嗅探(Sniffering)到,所以通常需要采用SSL(Secure Sockets Layer,安全套接字层)技术,使得vsftpd支持SSL加密传输,以此来抵御恶意嗅探攻击。

使用SSL技术,依赖于另外一个软件:OpenSSL,它是一个可以自由使用的SSL实现,首先需要安装这个软件。用户可以从网站 http://www.openssl.org/source/上下载Linux下OpenSSL的稳定版本,编译安装,然后执行命令生成密钥。

#wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
#tar -xvzf openssl-1.0.1f.tar.gz
#cd openssl-1.0.1f
#./config
#make
#make install

安装成功!
success

接下来开始生成密钥

1.检查

/etc/ssl/private

目录是否存在,不存在就创建

mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private

2.执行命令生成密钥

#openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

3.修改vsftpd配置文件

#vi /etc/vsftpd.conf
在末尾增加如下代码

# Turn on SSL
ssl_enable=YES

# Allow anonymous users to use secured SSL connections
allow_anon_ssl=YES

# All non-anonymous logins are forced to use a secure SSL connection in order to
# send and receive data on data connections.
force_local_data_ssl=YES
force_anon_data_ssl=YES

# All non-anonymous logins are forced to use a secure SSL connection in order to send the password.
force_local_logins_ssl=YES
force_anon_logins_ssl=YES

# Permit TLS v1 protocol connections. TLS v1 connections are preferred
ssl_tlsv1=YES

# Permit SSL v2 protocol connections. TLS v1 connections are preferred
ssl_sslv2=NO

# permit SSL v3 protocol connections. TLS v1 connections are preferred
ssl_sslv3=NO

# Disable SSL session reuse (required by WinSCP)
require_ssl_reuse=NO

# Select which SSL ciphers vsftpd will allow for encrypted SSL connections (required by FileZilla)
ssl_ciphers=HIGH

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/private/vsftpd.pem

然后重启vsftp
#service vsftpd restart

打开FTP工具(我用的是FlashFXP),连接类型选择“FTP使用公开SSL(验证TLS)” 如下图
类型选择

连接,会弹出是否接受证书,选择“接受并保存”之后我们即可登入远程的ftp服务器。
连接成功!
连接成功

若使用不支持SSL的客户端工具访问时有可能会出现:530 Non-anonymous sessions must use encryption.的错误提示。所以提醒用户尽量选择flashfxp或CoreFtp这类的多功能客户端。

到这里为止,采用SSL机制保护下的vsftpd就算配置完成了。用户使用FTP登录和上传下载数据的过程都将是加密传输的,其中AES256-SHA是默认的加密方式,用户可以修改“ssl_ciphers=xxx”的方式来选择想要的加密方式。

参考文章

《linux下vsftpd的安全设置方法》
《Setting Up vsftpd + TLS On Debian Squeeze》