赞
踩
之前在工作中自己手动搭建过堡垒机,那时候是因为维护的环境硬盘资源有限,经常被测试人员上传的“大数据包”撑爆,导致系统无法正常登录或者是命令无法正常执行,而且他们传包用完是不自己删除的,这导致我清理的时候畏手畏脚的,有的时候一刀切将三十天之内没有使用的文件都删除了之后,就会有“同事”过来找你了,“为啥删了我的数据,我们还要用,云云!!!”,被喷的多了我也不耐烦了,直接独立给他们搭建了一个Ubuntu操作系统的KVM虚机,分给他们使用,和其他环境分开了,自己玩坏了自己删,
最近回顾堡垒机的知识点,发现有个开源的软件jumpserver,感兴趣,安装下玩玩。
首先上官方文档:jumpserver官方中文文档
本文内容都是从官方文档中获取,一切以官方文档为主。
JumpServer 是全球首款完全开源的堡垒机, 使用 GNU GPL v2.0 开源协议,也就是说是免费的,JumpServer 使用 Python / Django 语言进行开发, JumpServer 现已支持管理 SSH、 Telnet、 RDP、 VNC 协议资产。
先来一张jumpserver架构图,
Jumpserver 默认端口为 8080/tcp
Coco 默认 SSH 端口为 2222/tcp, 默认 Web Terminal 端口为 5000/tcp
Guacamole 默认端口为 8081/tcp,
Nginx 默认端口为 80/tcp
Redis 默认端口为 6379/tcp
Mysql 默认端口为 3306/tcp
安装文档:极速部署
官方文档提供了两种方法部署jumpserver,
——》我这里使用的是极速部署,直接一个脚本我完事;
环境介绍:
curl -sSL https://github.com/jumpserver/jumpserver/releases/download/v2.6.1/quick_start.sh | sh
极速部署的时候对虚机的资源要求为:内存8G+CPU 2个
手动调整虚机的内存和CPU个数,
检查硬件资源,用户、系统、CPU个数、内存都是OK;
安装wget软件用来将网上的安装脚本下载到本地;
下载安装脚本并通过sh进行执行;
3.1. 脚本执行内容检查配置文件、配置nginx证书、备份jumpserver配置文件、不配置ipv6网络、自动生成加密秘钥、配置docker持久化目录、不使用外置mysql、不使用外置Redis;
安装docker,下载压缩包和docker-compose;
4.1. 配置docker指定存储目录;
4.2.启动docker
下载容器镜像
5.1. [jumpserver/redis:6-alpine]
5.2. [jumpserver/mysql:5]
5.3. [jumpserver/nginx:alpine2]
5.4. [jumpserver/luna:v2.6.1]
5.5. [jumpserver/core:v2.6.1]
5.6. [jumpserver/koko:v2.6.1]
5.7. [jumpserver/guacamole:v2.6.1]
5.8. [jumpserver/lina:v2.6.1]
[root@vlinx144011 ~]# ping www.baidu.com PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data. 64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=1 ttl=54 time=6.69 ms 64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=2 ttl=54 time=5.69 ms 64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=3 ttl=54 time=5.47 ms ^C --- www.a.shifen.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 5.470/5.951/6.694/0.540 ms [root@vlinx144011 ~]# [root@vlinx144011 ~]# [root@vlinx144011 ~]# [root@vlinx144011 ~]# curl -sSL https://github.com/jumpserver/jumpserver/releases/download/v2.6.1/quick_start.sh | sh User Check ........................ [ OK ] OS Check ........................ [ OK ] CPU Check ........................ [ OK ] Memory Check ........................ [ OK ] Loaded plugins: fastestmirror rhel | 3.6 kB 00:00:00 Determining fastest mirrors Resolving Dependencies --> Running transaction check ---> Package wget.x86_64 0:1.14-15.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================== Package Arch Version Repository Size ============================================================================================== Installing: wget x86_64 1.14-15.el7 rhel 547 k Transaction Summary ============================================================================================== Install 1 Package Total download size: 547 k Installed size: 2.0 M Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : wget-1.14-15.el7.x86_64 1/1 Verifying : wget-1.14-15.el7.x86_64 1/1 Installed: wget.x86_64 0:1.14-15.el7 Complete! --2020-12-31 17:23:54-- https://github.com/jumpserver/installer/releases/download/v2.6.1/jumpserver-installer-v2.6.1.tar.gz Resolving github.com (github.com)... 13.250.177.223 Connecting to github.com (github.com)|13.250.177.223|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/303679235/66d0dd00-4379-11eb-8ade-ead773c9f5a1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201231%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201231T092348Z&X-Amz-Expires=300&X-Amz-Signature=3a9685271b64e4774870e68301487b1a32e039e75ae3be24efb28bcf7841e990&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=303679235&response-content-disposition=attachment%3B%20filename%3Djumpserver-installer-v2.6.1.tar.gz&response-content-type=application%2Foctet-stream [following] --2020-12-31 17:23:55-- https://github-production-release-asset-2e65be.s3.amazonaws.com/303679235/66d0dd00-4379-11eb-8ade-ead773c9f5a1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201231%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201231T092348Z&X-Amz-Expires=300&X-Amz-Signature=3a9685271b64e4774870e68301487b1a32e039e75ae3be24efb28bcf7841e990&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=303679235&response-content-disposition=attachment%3B%20filename%3Djumpserver-installer-v2.6.1.tar.gz&response-content-type=application%2Foctet-stream Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.217.39.156 Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.217.39.156|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 22228 (22K) [application/octet-stream] Saving to: ‘jumpserver-installer-v2.6.1.tar.gz’ 100%[====================================================>] 22,228 44.4KB/s in 0.5s 2020-12-31 17:23:57 (44.4 KB/s) - ‘jumpserver-installer-v2.6.1.tar.gz’ saved [22228/22228] JumpServer 部署脚本已经下载至 /opt/jumpserver-installer-v2.6.1 目录 ██╗██╗ ██╗███╗ ███╗██████╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗ ██║██║ ██║████╗ ████║██╔══██╗██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗ ██║██║ ██║██╔████╔██║██████╔╝███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝ ██ ██║██║ ██║██║╚██╔╝██║██╔═══╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗ ╚█████╔╝╚██████╔╝██║ ╚═╝ ██║██║ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║ ╚════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ Version: v2.6.1 >>> 一、配置JumpServer 1. 检查配置文件 各组件使用环境变量式配置文件,而不是 yaml 格式, 配置名称与之前保持一致 配置文件位置: /opt/jumpserver/config/config.txt 完成 2. 配置 Nginx 证书 证书位置在: /opt/jumpserver/config/nginx/cert 完成 3. 备份配置文件 备份至 /opt/jumpserver/config/backup/config.txt.2020-12-31_17-24-05 完成 4. 配置网络 需要支持 IPv6 吗? (y/n) (默认为n): 完成 5. 自动生成加密密钥 完成 6. 配置持久化目录 修改日志录像等持久化的目录,可以找个最大的磁盘,并创建目录,如 /opt/jumpserver 注意: 安装完后不能再更改, 否则数据库可能丢失 Filesystem Size Used Avail Use% Mounted on /dev/sr0 8.1G 8.1G 0 100% /mnt/iso /dev/sda1 197M 121M 77M 62% /boot 设置持久化卷存储目录 (默认为/opt/jumpserver): 完成 7. 配置MySQL 是否使用外部mysql (y/n) (默认为n): 完成 8. 配置Redis 是否使用外部redis (y/n) (默认为n): 完成 >>> 二、安装配置Docker 1. 安装Docker 开始下载 Docker 程序 ... --2020-12-31 17:24:08-- https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-18.06.2-ce.tgz Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 106.117.243.219, 106.117.243.222, 27.128.214.226, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|106.117.243.219|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 43834194 (42M) [application/x-tar] Saving to: ‘/tmp/docker.tar.gz’ 100%[====================================================>] 43,834,194 17.5MB/s in 2.4s 2020-12-31 17:24:11 (17.5 MB/s) - ‘/tmp/docker.tar.gz’ saved [43834194/43834194] 开始下载 Docker compose 程序 ... --2020-12-31 17:24:13-- https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 Resolving get.daocloud.io (get.daocloud.io)... 106.75.86.15 Connecting to get.daocloud.io (get.daocloud.io)|106.75.86.15|:443... connected. HTTP request sent, awaiting response... 302 FOUND Location: https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 [following] --2020-12-31 17:24:16-- https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 Resolving dn-dao-github-mirror.daocloud.io (dn-dao-github-mirror.daocloud.io)... 27.128.222.239, 42.81.58.243, 27.128.222.242, ... Connecting to dn-dao-github-mirror.daocloud.io (dn-dao-github-mirror.daocloud.io)|27.128.222.239|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12218968 (12M) [application/x-executable] Saving to: ‘/tmp/docker-compose’ 100%[====================================================>] 12,218,968 14.3MB/s in 0.8s 2020-12-31 17:24:17 (14.3 MB/s) - ‘/tmp/docker-compose’ saved [12218968/12218968] 完成 2. 配置Docker 修改Docker镜像容器的默认存储目录,可以找个最大的磁盘, 并创建目录,如 /opt/docker Filesystem Size Used Avail Use% Mounted on /dev/sr0 8.1G 8.1G 0 100% /mnt/iso /dev/sda1 197M 121M 77M 62% /boot Docker存储目录 (默认为/opt/docker): 完成 3. 启动Docker Docker 版本发生改变 或 docker配置文件发生变化,是否要重启 (y/n) (默认为y): 完成 >>> 三、加载镜像 [jumpserver/redis:6-alpine] 6-alpine: Pulling from jumpserver/redis 05e7bc50f07f: Pull complete 14c9d57a1c7f: Pull complete ccd033d7ec06: Pull complete 6ff79b059f99: Pull complete d91237314b77: Pull complete c47d41ba6aa8: Pull complete Digest: sha256:4920debee18fad71841ce101a7867743ff8fe7d47e6191b750c3edcfffc1cb18 Status: Downloaded newer image for jumpserver/redis:6-alpine [jumpserver/mysql:5] 5: Pulling from jumpserver/mysql 6ec7b7d162b2: Pull complete fedd960d3481: Pull complete 7ab947313861: Pull complete 64f92f19e638: Pull complete 3e80b17bff96: Pull complete 014e976799f9: Pull complete 59ae84fee1b3: Pull complete 7d1da2a18e2e: Pull complete 301a28b700b9: Pull complete 979b389fc71f: Pull complete 403f729b1bad: Pull complete Digest: sha256:b3b2703de646600b008cbb2de36b70b21e51e7e93a7fca450d2b08151658b2dd Status: Downloaded newer image for jumpserver/mysql:5 [jumpserver/nginx:alpine2] alpine2: Pulling from jumpserver/nginx c87736221ed0: Pull complete 6ff0ab02fe54: Pull complete e5b318df7728: Pull complete b7a5a4fe8726: Pull complete Digest: sha256:d25ed0a8c1b4957f918555c0dbda9d71695d7b336d24f7017a87b2081baf1112 Status: Downloaded newer image for jumpserver/nginx:alpine2 [jumpserver/luna:v2.6.1] v2.6.1: Pulling from jumpserver/luna 801bfaa63ef2: Pull complete b1242e25d284: Pull complete 7453d3e6b909: Pull complete 07ce7418c4f8: Pull complete e295e0624aa3: Pull complete 9aa19406fcc2: Pull complete b88c1894aa70: Pull complete Digest: sha256:6889bc5825c8b608d3d086fa6713da5098665d9caaa6de0d2de2e30f27246fa4 Status: Downloaded newer image for jumpserver/luna:v2.6.1 [jumpserver/core:v2.6.1] v2.6.1: Pulling from jumpserver/core 852e50cd189d: Pull complete 334ed303e4ad: Pull complete a687a65725ea: Pull complete fe607cb30fbe: Pull complete af3dd7a5d357: Pull complete 5ed087772967: Pull complete de88310b192c: Pull complete 3f3c40cb5584: Pull complete a616053790d8: Pull complete f78e4ffd4b11: Pull complete 681df5236765: Pull complete 6feeeb96a348: Pull complete 8b170624587e: Pull complete Digest: sha256:1332e03847e45f1995845e1b74f1f3deb1f108da72ac5b8af087bc3775690e7b Status: Downloaded newer image for jumpserver/core:v2.6.1 [jumpserver/koko:v2.6.1] v2.6.1: Pulling from jumpserver/koko 6d28e14ab8c8: Pull complete c4b1524d2f75: Pull complete 8522e19e2998: Pull complete 106d5adca780: Pull complete e649208988b3: Pull complete fd02488ce54c: Pull complete 8566396c9588: Pull complete 5c3ae6b36882: Pull complete cb4e3aeda111: Pull complete 3bc46e9d6be9: Pull complete 919620ef3747: Pull complete 3998a9375e49: Pull complete 5869987766aa: Pull complete 9fd39a172e25: Pull complete f60bfb937cc4: Pull complete Digest: sha256:242e96c7a992bf44ccbda321fb69c8ea4d39d5ff423cf8f1505e9856b1ac2496 Status: Downloaded newer image for jumpserver/koko:v2.6.1 [jumpserver/guacamole:v2.6.1] v2.6.1: Pulling from jumpserver/guacamole c5e155d5a1d1: Pull complete 221d80d00ae9: Pull complete 4250b3117dca: Pull complete d1370422ab93: Pull complete deb6b03222ca: Pull complete 9cdea8d70cc3: Pull complete 968505be14db: Pull complete 04b5c270ac81: Pull complete 301d76fcab1f: Pull complete f4d49608235a: Pull complete f4c6404fd6f8: Pull complete 73ac8e900d64: Pull complete eec0a1010dfa: Pull complete 199219e1bcf7: Pull complete 54d3328751a0: Pull complete 68412973433c: Pull complete b45d84968434: Pull complete 9569df8016cc: Pull complete 642448bde40a: Pull complete e788dd92de90: Pull complete 223eaf2bd9f6: Pull complete b68966fc02ad: Pull complete cf0eb6b2e415: Pull complete 0b78188a975b: Pull complete 704b69b91dcb: Pull complete Digest: sha256:cb80c430c14ad220edd6f20855da5f7ea256d75f5f87bebe29d7e27275c4beeb Status: Downloaded newer image for jumpserver/guacamole:v2.6.1 [jumpserver/lina:v2.6.1] v2.6.1: Pulling from jumpserver/lina 801bfaa63ef2: Already exists b1242e25d284: Already exists 7453d3e6b909: Already exists 07ce7418c4f8: Already exists e295e0624aa3: Already exists 2ec572beb6c1: Pull complete c7d22dce32ca: Pull complete Digest: sha256:8d63a0716558b4384f0eab2220bcfefe5ba2e040cbd33634576ba444c215212a Status: Downloaded newer image for jumpserver/lina:v2.6.1 >>> 四、安装完成了 1. 可以使用如下命令启动, 然后访问 ./jmsctl.sh start 2. 其它一些管理命令 ./jmsctl.sh stop ./jmsctl.sh restart ./jmsctl.sh backup ./jmsctl.sh upgrade 更多还有一些命令,你可以 ./jmsctl.sh --help来了解 3. 访问 Web 后台页面 http://192.168.1.9:8080 https://192.168.1.9:8443 4. ssh/sftp 访问 ssh admin@192.168.1.9 -p2222 sftp -P2222 admin@192.168.1.9 5. 更多信息 我们的文档: https://docs.jumpserver.org/ 我们的官网: https://www.jumpserver.org/
执行完安装脚本我们可以进去查看下下载好的安装镜像
执行完安装脚本我们已经将jumpserver所需要的环境都准备好了,容器的镜像也已经下载好了,接下来我们就需要进行启动就是通过脚本将镜像启动为容器同时对外发布端口号,这个步骤也是可以通过脚本来执行的
[root@vlinx144011 ~]# cd /opt/jumpserver-installer-v2.6.1/
[root@vlinx144011 jumpserver-installer-v2.6.1]#
[root@vlinx144011 jumpserver-installer-v2.6.1]#
[root@vlinx144011 jumpserver-installer-v2.6.1]# ./jmsctl.sh start
Creating network "jms_net" with driver "bridge"
Creating jms_redis ... done
Creating jms_mysql ... done
Creating jms_core ... done
Creating jms_celery ... done
Creating jms_lina ... done
Creating jms_koko ... done
Creating jms_guacamole ... done
Creating jms_luna ... done
Creating jms_nginx ... done
[root@vlinx144011 jumpserver-installer-v2.6.1]#
执行完脚本之后我们可以查看下启动的容器有哪些,都发布了哪些端口,
或者是直接查看下系统对外发布了哪些端口了,这里需要注意的就是两个,
现在我们就可以通过IP:8080来访问到jumpserver的页面了,
http://192.168.144.11:8080
第一次登录的时候我们是需要修改密码的,我修改成了——》weakPassword
进入之后就是这个页面了,直接看到的就是仪表盘界面,
到登录到jumpserver页面我们就已经安装成功了,为了看到实验现象安装过程就没有一个节点一个节点的部署,直接使用官方提供的安装脚本来进行部署了,只是根据脚本执行过程分步的了解了下脚本都执行了什么,因为不是要直接使用到工作环境中的所以这样安装也是可以的。
首先上文档:官方使用文档
使用过程全部都是根据官方文档来进行操作,如果不解可以去查看官方文档,一切以官方文档为主。
使用过程第一步就是添加邮箱,我这里使用的是我们的工作邮箱163,需要通过网页将163邮箱的SMTP功能启动,然后新增授权码,然后获取到163邮箱SMTP服务器的地址,
设置邮箱,系统设置——》邮件设置——》基本信息——》填写内容——》提交
PS:也可以在这个页面点击测试连接然后邮箱中就可以收到邮件
附上官网文档解释
查看测试邮件
PS:因为我们使用的SMTP服务器就是本身的163邮箱所以发送测试邮件的时候就是自己发送给自己的,
jumpserver是作为堡垒机来使用的,既然是堡垒机那么必不可少的就是创建用户给开发或测试人员来使用,
首先我们创建用户,因为jumpserver作为一款堡垒机,我们可以将后面登录的机器作为资产添加进来然后我们可以通过创建用户分配资产来进行管理,根据用户权限的不同授予不同的资产。
创建用户我们可以先创建用户组——》再创建用户;也可以直接创建用户然后用户组选择为Default默认,都是可以的;
我选择自己创建用户组——》xylong
创建用户,
PS:这里我们使用的邮箱还是我的163邮箱,需要注意的是密码策略的时候选择设置密码,系统角色选择系统管理员
查看创建成功的用户,
资产是jumpserver中用来定义被管理主机的,简单理解,你想通过jumpserver登录那台主机那么你就将那台主机加进来。
jumpserver中对资产是以树状来显示的,默认是只有一个根【Default】,我们这里使用的时候创建两个分支,分别对应Linux和windows系统,
首先我们对资产管理树来进行操作,点击Default右击创建节点,根据官方文档中的内容ssh是Linux操作系统,RDP是windows操作系统。
因为现在我启动了两台的Linux机器,一个ftp机器一个是jumpserver本身的虚机,所以将他们加进去,
这里我们需要说一下jumpserver涉及到的三个用户:
添加资产之前我们还需要做一个操作——》创建管理用户,
首先创建管理用户,管理用户就是我们要添加的资源的登录的用户名和密码
资产管理——》管理用户——》创建
PS:这里我的两台机器用户名和密码都是一样的,如果你的不同那就分别创建,
现在我们就可以添加资产了
资产列表——》SSH Server——》创建
主机名我填写的就是虚机设置的主机名、IP就是对应的虚机IP地址、系统平台是Linux、管理用户选择我们刚才设置的root,
添加成功,
PS:这时候我们查看“可连接”这里是黄色的,状态还不是正常的,需要等一会,
这时候我们可以点击进入查看资产的情况,右边有两个选项【更新硬件信息】和【测试资产连接性】
稍等一会之后我们可以看下资产的基本信息之后我们可以看到获取到的信息,
也可以手动的【测试资产可连接性】
这时候我们在查看【连接性】这里就绿色的对号了,
接着一样的流程将jumpserver虚机也添加进来
系统用户是jumpserver跳转登录资产的时候使用的用户,
名称和用户名还是——》xylong、优先级、协议——》默认、打开自动推送,sudo设置为ALL所有权限,shell默认,家目录我没有指定、自动生成秘钥——》打开
创建完成之后查看
现在我们创建好jumpserver用户xylong可以用于登录,加入了资产两个Linux虚机,设置了管理用户(登录虚机的用户名和密码)、系统用户(登录资源的时候使用的用户名),接下来我们只需要将资源加入到用户中,然后切换用户就可以对资源进行操作了。
现在我们为用户分配资源admin用户就是所有资源就是这两台机器都要,xylong用户的话就将ftp那台加入进去就好,接着我们切换用户到xylong上面查看情况。
权限管理——》资产管理——》SSH Server ——》创建
名称——》自己起我的是administrator、用户——》管理员用户、资产——》将所以资产加入、系统用户——》root
接着将xylong用户的授权创建出来,还是一样的步骤,
名称——》xylong、用户——》xylong、系统用户——》root、
现在我们登陆的用户是administrator用户,可以查看下
会话管理——》web终端
进入之后我们就可以看到我们添加进来的两个虚机了,双机就可以打开终端进行命令输入了,
接着我们切换下用户——》xylong/weakPassword
会话管理——》web终端
这里我们看到的资源就是一台,我们作为ftp的这台机器了
还有我们可以通过文件管理来查看资源中的文件系统
我们可以将本地的内容上传到虚机上,
或者是选中虚机中我文件进行下载
这种下载方式是通过浏览器来进行下载文件都到了【下载】文件夹中
到现在为了我们演示了创建用户、添加资源、设置权限、用户登录访问资源等操作,接着我们演示下通过ssh方式登录jumpserver进行访问,
ssh -p 2222 admin@192.168.144.11
选择P查看有权限的资源
我们可以通过ID来登录到资源上进行操作
g查看有权限的节点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。