SpringBoot应用安全停止

SpringBoot的启动我们可以在打包后用如下命令启动:

nohup java -jar springapplication.jar --spring.profiles.active=prod &

更多关于启动的参数请自行查阅。

SpringBoot的停止有两种方式,一种是通过http发送shutdown信号,另一种是通过service stop的方式来停止服务。

方式一:通过http发送shutdown信号
该方式主要依赖SpringBoot Actuator的endpoint特性,具体步骤如下:
添加依赖:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-actuator</artifactId> 
</dependency>

application.properties中添加:

#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false

执行关闭命令:

curl -X POST host:port/shutdown
例如:$ curl -X POST http://localhost:8080/shutdown

如果需要配置路径,则需要在application.properties中添加

management.context-path=/manage

则关闭命令变为

curl -X POST host:port/manage/shutdown

接下来说一下安全设置相关,远程执行命令的时候需要借助spring-boot-starter-security进行身份认证。
首先,添加security依赖:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-security</artifactId> 
</dependency>

接着在application.properties中添加安全属性:

#开启shutdown的安全验证 
endpoints.shutdown.sensitive=true 
#验证用户名 
security.user.name=abswolf
#验证密码 
security.user.password=123456
#角色 
management.security.role=SUPERUSER

指定IP和端口

#指定管理端口和IP 
management.port=8080
management.address=127.0.0.1

执行命令

curl -u abswolf:123456 -X POST http://127.0.0.1:8081/shutdown

方式二:部署为Unix/Linux Service
该方式主要借助官方的spring-boot-maven-plugin创建”Fully executable” jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:
引入插件:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
        <executable>true</executable> 
    </configuration> 
</plugin>

设置为系统服务:
将你的应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:

sudo ln -s /var/app/app.jar /etc/init.d/app

赋予可执行权限:

chmod u+x app.jar

以系统服务的方式管理:

service foo start|stop|restart
默认PID文件路径:/var/run/appname/appname.pid
默认日志文件路径:/var/log/appname.log

自定义参数:
在这种方式下,我们还可以使用自定义的.conf文件来变更默认配置,方法如下:
1、在jar包相同路径下创建一个.conf文件,名称应该与.jar的名称相同,如appname.conf
2、在其中配置相关变量,如:

JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log

安全设置:
作为应用服务,安全性是一个不能忽略的问题,如下一些操作可以作为部分基础设置参考:
为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
1、赋予最小范围权限:

chmod 500 app.jar

2、阻止修改:

sudo chattr +i app.jar

3、对.conf文件做类似的工作:

chmod 400 app.conf,sudo chown root:root app.conf

参考:正确、安全地停止SpringBoot应用服务