首页
直播
统计
壁纸
留言
友链
关于
Search
1
PVE开启硬件显卡直通功能
2,634 阅读
2
在k8s(kubernetes) 上安装 ingress V1.1.0
2,115 阅读
3
IPTV直播源分享地址
2,015 阅读
4
二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈
1,966 阅读
5
Ubuntu 通过 Netplan 配置网络教程
1,914 阅读
默认分类
登录
/
注册
Search
chenby
累计撰写
211
篇文章
累计收到
124
条评论
首页
栏目
默认分类
页面
直播
统计
壁纸
留言
友链
关于
搜索到
211
篇与
cby
的结果
2021-12-30
Ansible 安装并简单使用
Ansible 简介Ansible 是一款 IT 自动化工具。主要应用场景有配置系统、软件部署、持续发布及不停服平滑滚动更新的高级任务编排。Ansible 本身非常简单易用,同时注重安全和可靠性,以最小化变动为特色,使用 OpenSSH 实现数据传输 ( 如果有需要的话也可以使用其它传输模式或者 pull 模式 ),其语言设计非常利于人类阅读,即使是针对不刚接触 Ansible 的新手来讲亦是如此。我们坚信无论什么范围的环境,简单都是必须的,所以我们的设计尽可能满足各类型的繁忙人群:开发人员、系统管理员、发布工程师、IT 管理员等所有类型的人。同时, Ansible 适用于各种环境,小到几台多到成千上万台的企业实际环境都完全满足。Ansible 不使用C/S架构管理节点,即没有 Agent 。这样的架构使得 Ansible 不会存在如何升级远程 Agent 管理进程或者因为没有安装 Agent 而无法管理系统。因为 OpenSSH 是非常流行的开源组件,安全问题也非常少 。Ansible 的 去中心化 管理方式深受业内认可, 即它只依赖 OS 的 KEY 认证访问远程主机。如需, Ansible 可以便捷接入 Kerberos, LDAP 或者其它认证系统。安装ansible工具root@Ansible:~# apt update && apt install ansible root@Ansible:~# apt install sshpass创建秘钥root@Ansible:~# ssh-keygen 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: SHA256:ZlnekfYdDkp4AA2zZLysbtr8Epcp6tMgFB2TGEY/zFU root@Ansible The key's randomart image is: +---[RSA 3072]----+ |.++oo.oE+. | |.o+oo o.o.o . | | .= .....o+. . | | . . o +oo.oo..| |. . S ... ...| | . . + * | | . = + | | oo= | | .o+oo. | +----[SHA256]-----+ root@Ansible:~# 批量拷贝脚本 root@Ansible:~# vim copy_ssh_id.sh root@Ansible:~# cat copy_ssh_id.sh #!/bin/bash rm -f ./authorized_keys; touch ./authorized_keys sed -i '/StrictHostKeyChecking/s/^#//; /StrictHostKeyChecking/s/ask/no/' /etc/ssh/ssh_config sed -i "/#UseDNS/ s/^#//; /UseDNS/ s/yes/no/" /etc/ssh/sshd_config cat hostsname.txt | while read host ip pwd; do sshpass -p $pwd ssh-copy-id -f $ip 2>/dev/null ssh -nq $ip "hostnamectl set-hostname $host" ssh -nq $ip "echo -e 'y\n' | ssh-keygen -q -f ~/.ssh/id_rsa -t rsa -N ''" echo "===== Copy id_rsa.pub of $ip =====" scp $ip:/root/.ssh/id_rsa.pub ./$host-id_rsa.pub #cat ./$host-id_rsa.pub >> ./authorized_keys echo $ip $host >> /etc/hosts done root@Ansible:~#添加主机信息root@Ansible:~# vim hostsname.txt root@Ansible:~# cat hostsname.txt node 192.168.1.2 123123 node 192.168.1.3 123123 node 192.168.1.4 123123 node 192.168.1.5 123123 node 192.168.1.6 123123 node 192.168.1.7 123123 node 192.168.1.8 123123 node 192.168.1.9 123123 ------fetch模块:copy模块:1、从远程主机获取文件: root@Ansible:~# ansible k8s -m fetch -a "src=/root/node.sh dest=/root/test" 2、从本地主机传到远程: root@Ansible:~# ansible k8s -m copy -a "src=/root/node.sh dest=/root" 3、远程复制或者本地上传,加上force=yes,则会覆盖掉原来的文件,加上backup=yes,在覆盖的时候会把原来的文件做一个备份: root@Ansible:~# ansible k8s -m copy -a "src=/root/node.sh dest=/root force=yes backup=yes" 4、复制的时候可以带参数:owner,group,mode---------将本地的源拷贝到服务器上 root@Ansible:~# ansible k8s -m copy -a "src=/etc/apt/sources.list dest=/etc/apt/" 更新源 root@Ansible:~# ansible k8s -m command -a 'apt update' 安装ntpdate root@Ansible:~# ansible k8s -m command -a 'apt install ntpdate' 同步时间 root@Ansible:~# ansible k8s -m command -a 'ntpdate -u ntp.aliyun.com' 修改时区 root@Ansible:~# root@Ansible:~# root@Ansible:~# ansible k8s -m command -a 'cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime' 查看是否修改 root@Ansible:~# root@Ansible:~# ansible k8s -m command -a 'date -R ' 192.168.1.13 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.10 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.14 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.12 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.11 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.15 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.51 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.52 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.16 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.53 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:57 +0800 192.168.1.55 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:58 +0800 192.168.1.54 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:58 +0800 192.168.1.57 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:58 +0800 192.168.1.56 | CHANGED | rc=0 >> Thu, 11 Nov 2021 14:52:58 +0800 root@Ansible:~# root@Ansible:~#Linux运维交流社区Linux运维交流社区,互联网新闻以及技术交流。50篇原创内容公众号 https://blog.csdn.net/qq_33921750https://my.oschina.net/u/3981543https://www.zhihu.com/people/chen-bu-yun-2https://segmentfault.com/u/hppyvyv6/articleshttps://juejin.cn/user/3315782802482007https://space.bilibili.com/352476552/articlehttps://cloud.tencent.com/developer/column/93230知乎、CSDN、开源中国、思否、掘金、哔哩哔哩、腾讯云本文使用 文章同步助手 同步
2021年12月30日
506 阅读
0 评论
0 点赞
2021-12-30
kubernetes(k8s) 存储动态挂载
使用 nfs 文件系统 实现kubernetes存储动态挂载1. 安装服务端和客户端root@hello:~# apt install nfs-kernel-server nfs-common 其中 nfs-kernel-server 为服务端, nfs-common 为客户端。2. 配置 nfs 共享目录root@hello:~# mkdir /nfs root@hello:~# sudo vim /etc/exports /nfs *(rw,sync,no_root_squash,no_subtree_check)各字段解析如下: /nfs: 要共享的目录 :指定可以访问共享目录的用户 ip, * 代表所有用户。192.168.3. 指定网段。192.168.3.29 指定 ip。 rw:可读可写。如果想要只读的话,可以指定 ro。 sync:文件同步写入到内存与硬盘中。 async:文件会先暂存于内存中,而非直接写入硬盘。 no_root_squash:登入 nfs 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!但如果你需要在客户端对 nfs 目录进行写入操作。你就得配置 no_root_squash。方便与安全不可兼得。 root_squash:在登入 nfs 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。 subtree_check:强制 nfs 检查父目录的权限(默认) no_subtree_check:不检查父目录权限配置完成后,执行以下命令导出共享目录,并重启 nfs 服务:root@hello:~# exportfs -a root@hello:~# systemctl restart nfs-kernel-server root@hello:~# root@hello:~# systemctl enable nfs-kernel-server客户端挂载root@hello:~# apt install nfs-common root@hello:~# mkdir -p /nfs/ root@hello:~# mount -t nfs 192.168.1.66:/nfs/ /nfs/root@hello:~# df -hT Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 7.8G 0 7.8G 0% /dev tmpfs tmpfs 1.6G 2.9M 1.6G 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv ext4 97G 9.9G 83G 11% / tmpfs tmpfs 7.9G 0 7.9G 0% /dev/shm tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup /dev/loop0 squashfs 56M 56M 0 100% /snap/core18/2128 /dev/loop1 squashfs 56M 56M 0 100% /snap/core18/2246 /dev/loop3 squashfs 33M 33M 0 100% /snap/snapd/12704 /dev/loop2 squashfs 62M 62M 0 100% /snap/core20/1169 /dev/loop4 squashfs 33M 33M 0 100% /snap/snapd/13640 /dev/loop6 squashfs 68M 68M 0 100% /snap/lxd/21835 /dev/loop5 squashfs 71M 71M 0 100% /snap/lxd/21029 /dev/sda2 ext4 976M 107M 803M 12% /boot tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/0 192.168.1.66:/nfs nfs4 97G 6.4G 86G 7% /nfs创建配置默认存储[root@k8s-master-node1 ~/yaml]# vim nfs-storage.yaml [root@k8s-master-node1 ~/yaml]# [root@k8s-master-node1 ~/yaml]# cat nfs-storage.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: "true" ## 删除pv的时候,pv的内容是否要备份 --- apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: registry.cn-hangzhou.aliyuncs.com/chenby/nfs-subdir-external-provisioner:v4.0.2 # resources: # limits: # cpu: 10m # requests: # cpu: 10m volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER value: 192.168.1.66 ## 指定自己nfs服务器地址 - name: NFS_PATH value: /nfs/ ## nfs服务器共享的目录 volumes: - name: nfs-client-root nfs: server: 192.168.1.66 path: /nfs/ --- apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io创建[root@k8s-master-node1 ~/yaml]# kubectl apply -f nfs-storage.yaml storageclass.storage.k8s.io/nfs-storage created deployment.apps/nfs-client-provisioner created serviceaccount/nfs-client-provisioner created clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created [root@k8s-master-node1 ~/yaml]#查看是否创建默认存储[root@k8s-master-node1 ~/yaml]# kubectl get storageclasses.storage.k8s.io NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-storage (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 100s [root@k8s-master-node1 ~/yaml]#创建pvc进行测试[root@k8s-master-node1 ~/yaml]# vim pvc.yaml [root@k8s-master-node1 ~/yaml]# cat pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nginx-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 200Mi [root@k8s-master-node1 ~/yaml]# [root@k8s-master-node1 ~/yaml]# kubectl apply -f pvc.yaml persistentvolumeclaim/nginx-pvc created [root@k8s-master-node1 ~/yaml]#查看pvc[root@k8s-master-node1 ~/yaml]# [root@k8s-master-node1 ~/yaml]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginx-pvc Bound pvc-8a4b6065-904a-4bae-bef9-1f3b5612986c 200Mi RWX nfs-storage 4s [root@k8s-master-node1 ~/yaml]#查看pv[root@k8s-master-node1 ~/yaml]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-8a4b6065-904a-4bae-bef9-1f3b5612986c 200Mi RWX Delete Bound default/nginx-pvc nfs-storage 103s [root@k8s-master-node1 ~/yaml]#Linux运维交流社区Linux运维交流社区,互联网新闻以及技术交流。53篇原创内容公众号本文使用 文章同步助手 同步
2021年12月30日
1,133 阅读
1 评论
0 点赞
2021-12-30
学习docker看此文足以
什么是 DockerDocker 最初是 dotCloud 公司创始人 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 ,主要项目代码在 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 。Docker 自开源后受到广泛的关注和讨论,至今其 已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。为什么要用 Docker作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。更高效的利用系统资源由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。更快速的启动时间传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。一致的运行环境开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。持续交付和部署对开发和运维()人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 来进行镜像构建,并结合 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 系统进行自动部署。而且使用 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。更轻松的迁移由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。更轻松的维护和扩展Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 ,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。docker一键安装curl -fsSL https://get.docker.com | bash -s docker --mirror AliyunDocker命令实战常用命令基础实战1、镜像下载最新版镜像root@hello:~# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 7d63c13d9b9b: Pull complete 5cb019b641b5: Pull complete d477de77abf8: Pull complete c60e7d4c1c30: Pull complete 365a49996569: Pull complete 039c6e901970: Pull complete Digest: sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest查看本地镜像root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e9ce56a96f8e 8 hours ago 141MB root@hello:~删除镜像root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e9ce56a96f8e 8 hours ago 141MB root@hello:~# root@hello:~# docker rmi e9ce56a96f8e Untagged: nginx:latest Untagged: nginx@sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Deleted: sha256:e9ce56a96f8e0e9f75051f258a595d1257bd6bb91913b79455ea77e67e686c5c Deleted: sha256:6e5a463ea9608e4712465e1c575b2932dde96f99fa2c2fc31a5bacbe69c725cb Deleted: sha256:a12cc243b903b34c8137e57160d206d6c1ee76a1ab6011a1cebdceb8b6ff8768 Deleted: sha256:a562e4589c72b0706526e13eed9c4f037ab5d1f50eb4529b38670abe353248f2 Deleted: sha256:fd67efaafabe1a0b146e9f7d958de79ec8fcec9aa6ee13ca3052b4acd8a3b81a Deleted: sha256:c3967df88e47f739c3048492985aafaafecd5806de6c6870cbd76997fc0c68b0 Deleted: sha256:e8b689711f21f9301c40bf2131ce1a1905c3aa09def1de5ec43cf0adf652576e root@hello:~# root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE root@hello:~#下载指定版本镜像root@hello:~# docker pull nginx:1.20.1 1.20.1: Pulling from library/nginx b380bbd43752: Pull complete 83acae5e2daa: Pull complete 33715b419f9b: Pull complete eb08b4d557d8: Pull complete 74d5bdecd955: Pull complete 0820d7f25141: Pull complete Digest: sha256:a98c2360dcfe44e9987ed09d59421bb654cb6c4abe50a92ec9c912f252461483 Status: Downloaded newer image for nginx:1.20.1 docker.io/library/nginx:1.20.1 root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.20.1 c8d03f6b8b91 5 weeks ago 133MB root@hello:~#2、容器docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 【docker run 设置项 镜像名 】 镜像启动运行的命令(镜像里面默认有的,一般不会写) # -d:后台运行 # --restart=always: 开机自启 # -p 主机端口:容器端口 root@hello:~# docker run --name=myningx -d --restart=always -p 88:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 7d63c13d9b9b: Pull complete 5cb019b641b5: Pull complete d477de77abf8: Pull complete c60e7d4c1c30: Pull complete 365a49996569: Pull complete 039c6e901970: Pull complete Digest: sha256:168a6a2be5c65d4aafa7a78ca98ff8b110fe44c6ca41e7ccb4314ed481e32288 Status: Downloaded newer image for nginx:latest 15db0ba492cf2b86714e3e29723d413b97e64cc2ee361d4109f4216b2e0cba60 root@hello:~# root@hello:~# curl -I 127.0.0.1:88 HTTP/1.1 200 OK Server: nginx/1.21.4 Date: Wed, 17 Nov 2021 02:03:13 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Tue, 02 Nov 2021 14:49:22 GMT Connection: keep-alive ETag: "61814ff2-267" Accept-Ranges: bytes root@hello:~#查看当前运行的容器root@hello:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15db0ba492cf nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp, :::88->80/tcp myningx root@hello:~#停止容器root@hello:~# docker stop 15db0ba492cf 15db0ba492cf root@hello:~# root@hello:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@hello:~#查看所有容器root@hello:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15db0ba492cf nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 12 seconds ago myningx root@hello:~#启动容器root@hello:~# docker start 15db0ba492cf 15db0ba492cf root@hello:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 15db0ba492cf nginx "/docker-entrypoint.…" 2 minutes ago Up 3 seconds 0.0.0.0:88->80/tcp, :::88->80/tcp myningx root@hello:~#删除容器,在运行中无法删除root@hello:~# docker rm 15db0ba492cf Error response from daemon: You cannot remove a running container 15db0ba492cf2b86714e3e29723d413b97e64cc2ee361d4109f4216b2e0cba60. Stop the container before attempting removal or force remove强制删除容器root@hello:~# docker rm -f 15db0ba492cf 15db0ba492cf root@hello:~#3、进入容器操作容器root@hello:~# docker exec -it b1d72657b /bin/bash root@b1d72657b272:/# root@b1d72657b272:/#4、修改容器内容root@hello:~# docker exec -it b1d72657b /bin/bash root@b1d72657b272:/# echo "123" > /usr/share/nginx/html/index.html root@b1d72657b272:/# root@b1d72657b272:/# echo "cby" > /usr/share/nginx/html/index.html root@hello:~# curl 127.0.0.1:88 123 root@hello:~# root@hello:~# docker exec -it b1d72657b /bin/bash root@b1d72657b272:/# echo "cby" > /usr/share/nginx/html/index.html root@hello:~# curl 127.0.0.1:88 cby root@hello:~#5、挂载外部数据root@hello:~# docker run --name=myningx -d --restart=always -p 88:80 -v /data/html:/usr/share/nginx/html/ nginx e3788cdd7be695fe9a1bebd7306c131d6380da215a416d19c162c609b8f108ae root@hello:~# root@hello:~# root@hello:~# curl 127.0.0.1:88 <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.21.4</center> </body> </html> root@hello:~# root@hello:~# echo "cby" > /data/html/index.html root@hello:~# root@hello:~# root@hello:~# curl 127.0.0.1:88 cby root@hello:~#6、将运行中的容器构建为镜像root@hello:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e3788cdd7be6 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:88->80/tcp, :::88->80/tcp myningx root@hello:~# root@hello:~# docker commit -a "cby" -m "my app" e3788cdd7be6 myapp:v1.0 sha256:07a7b54c914c79dfbd402029a3d144201235eca72a4f26c92e2ec7780c485226 root@hello:~# root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myapp v1.0 07a7b54c914c 4 seconds ago 141MB nginx latest e9ce56a96f8e 8 hours ago 141MB root@hello:~#7、镜像保存与导入root@hello:~# docker save -o cby.tar myapp:v1.0 root@hello:~# ll cby.tar -rw------- 1 root root 145910784 Nov 17 02:21 cby.tar root@hello:~# root@hello:~# docker load -i cby.tar Loaded image: myapp:v1.0 root@hello:~# root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myapp v1.0 07a7b54c914c 3 minutes ago 141MB nginx latest e9ce56a96f8e 8 hours ago 141MB nginx 1.20.1 c8d03f6b8b91 5 weeks ago 133MB root@hello:~#8、推送到DockerHub,并在其他主机上可拉去该镜像root@hello:~# docker tag myapp:v1.0 chenbuyun/myapp:v1.0 root@hello:~# root@hello:~# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: chenbuyun Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded root@hello:~# docker push chenbuyun/myapp:v1.0 The push refers to repository [docker.io/chenbuyun/myapp] 799aefeaf6b1: Pushed fd688ba2259e: Mounted from library/nginx c731fe3d8126: Mounted from library/nginx 3b1690d8cd86: Mounted from library/nginx 03f105433dc8: Mounted from library/nginx bd7b2912e0ab: Mounted from library/nginx e8b689711f21: Mounted from library/nginx v1.0: digest: sha256:f085a533e36cccd27a21fe4de7c87f652fe9346e1ed86e3d82856d5d4434c0a0 size: 1777 root@hello:~# root@hello:~# docker logout Removing login credentials for https://index.docker.io/v1/ root@hello:~# root@hello:~# docker pull chenbuyun/myapp:v1.0 v1.0: Pulling from chenbuyun/myapp Digest: sha256:f085a533e36cccd27a21fe4de7c87f652fe9346e1ed86e3d82856d5d4434c0a0 Status: Downloaded newer image for chenbuyun/myapp:v1.0 docker.io/chenbuyun/myapp:v1.0 root@hello:~# root@hello:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chenbuyun/myapp v1.0 07a7b54c914c 9 minutes ago 141MB myapp v1.0 07a7b54c914c 9 minutes ago 141MB nginx latest e9ce56a96f8e 8 hours ago 141MB nginx 1.20.1 c8d03f6b8b91 5 weeks ago 133MB root@hello:~#以上仅为常用命令,更多docker相关知识可在:https://www.runoob.com/docker/docker-tutorial.htmlLinux运维交流社区Linux运维交流社区,互联网新闻以及技术交流。55篇原创内容公众号 https://blog.csdn.net/qq_33921750https://my.oschina.net/u/3981543https://www.zhihu.com/people/chen-bu-yun-2https://segmentfault.com/u/hppyvyv6/articleshttps://juejin.cn/user/3315782802482007https://space.bilibili.com/352476552/articlehttps://cloud.tencent.com/developer/column/93230知乎、CSDN、开源中国、思否、掘金、哔哩哔哩、腾讯云本文使用 文章同步助手 同步
2021年12月30日
733 阅读
0 评论
0 点赞
2021-12-30
PVE开启硬件显卡直通功能
首先编辑GRUB配置文件:root@pve:~# vim /etc/default/grub root@pve:~# root@pve:~# cat /etc/default/grub # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. # For full documentation of the options in this file, see: # info -f grub -n 'Simple configuration' GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off" GRUB_CMDLINE_LINUX="" # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries #GRUB_DISABLE_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" root@pve:~# 开启IOMMU支持: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off" 如果是AMD的CPU: GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on video=efifb:off"更新GRUB:root@pve:~# update-grub Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.11.22-5-pve Found initrd image: /boot/initrd.img-5.11.22-5-pve Found linux image: /boot/vmlinuz-5.11.22-4-pve Found initrd image: /boot/initrd.img-5.11.22-4-pve Found memtest86+ image: /boot/memtest86+.bin Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin done root@pve:~#添加所需的系统模块(驱动):root@pve:~# root@pve:~# echo "vfio" >> /etc/modules root@pve:~# echo "vfio_iommu_type1" >> /etc/modules root@pve:~# echo "vfio_pci" >> /etc/modules root@pve:~# echo "vfio_virqfd" >> /etc/modules root@pve:~# root@pve:~# cat /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Generated by sensors-detect on Fri Sep 24 17:22:44 2021 # Chip drivers coretemp vfio vfio_iommu_type1 vfio_pci vfio_virqfd接着添加模块(驱动)黑名单,即让GPU设备在下次系统启动之后不使用这些驱动,把设备腾出来给vfio驱动用: Intel核显:echo "blacklist snd_hda_intel" >> /etc/modprobe.d/pve-blacklist.conf echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/pve-blacklist.conf echo "blacklist i915" >> /etc/modprobe.d/pve-blacklist.confN卡/A卡:echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf echo "blacklist radeon" >> /etc/modprobe.d/pve-blacklist.conf如果是N卡还需要加入下面的配置到kvm.conf(据老外说是避免一些莫名其妙的错误):echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.confroot@pve:~# echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf root@pve:~# echo "blacklist radeon" >> /etc/modprobe.d/pve-blacklist.conf root@pve:~# root@pve:~# cat /etc/modprobe.d/pve-blacklist.conf # This file contains a list of modules which are not supported by Proxmox VE # nidiafb see bugreport https://bugzilla.proxmox.com/show_bug.cgi?id=701 blacklist nvidiafb blacklist nouveau blacklist radeon root@pve:~# root@pve:~# echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf root@pve:~# root@pve:~# cat /etc/modprobe.d/kvm.conf options kvm ignore_msrs=1更新内核:root@pve:~# update-initramfs -u update-initramfs: Generating /boot/initrd.img-5.11.22-5-pve Running hook script 'zz-proxmox-boot'.. Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace.. No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync. root@pve:~#重启机器:root@pve:~# reboot重启上来之后检查模块是否正常加载:root@pve:~# lsmod | grep vfio vfio_pci 57344 1 vfio_virqfd 16384 1 vfio_pci irqbypass 16384 11 vfio_pci,kvm vfio_iommu_type1 36864 1 vfio 36864 5 vfio_iommu_type1,vfio_pci root@pve:~#查看显卡root@pve:~# lspci -nn | grep NV 86:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8] (rev a1) root@pve:~# root@pve:~#查看显卡ID,写入到配置中root@pve:~# lspci -n -s 86:00 86:00.0 0302: 10de:1eb8 (rev a1) root@pve:~# root@pve:~# root@pve:~# echo "options vfio-pci ids=10de:1eb8" > /etc/modprobe.d/vfio.conf root@pve:~# https://blog.csdn.net/qq_33921750https://my.oschina.net/u/3981543https://www.zhihu.com/people/chen-bu-yun-2https://segmentfault.com/u/hppyvyv6/articleshttps://juejin.cn/user/3315782802482007https://space.bilibili.com/352476552/articlehttps://cloud.tencent.com/developer/column/93230知乎、CSDN、开源中国、思否、掘金、哔哩哔哩、腾讯云本文使用 文章同步助手 同步
2021年12月30日
2,634 阅读
2 评论
0 点赞
2021-12-30
SELinux入门学习总结
前言安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。如果可以熟练掌握 SELinux 并正确运用,我觉得整个系统基本上可以到达“坚不可摧”的地步了(请永远记住没有绝对的安全)。掌握 SELinux 的基本概念以及简单的配置方法是每个 Linux 系统管理员的必修课。一、基本概念1、TE模型的安全上下文所有的操作系统访问控制都基于主体、客体,以及与他们相关的访问控制属性。在selinux中,访问控制属性叫做安全上下文。所有对象(文件、进程间通信通道、套接字、网络主机等)和主体(进程)都有一个与之关联的安全上下文。一个安全上下文包含三个元素:用户(user)、角色(role)和类型标识符(type identifiers)安全上下文的形式如下:user:role:type对进程来说:分别表示用户、角色、类型标识符也被称为域对客体来说:前两项基本没有实际用途,role通常为object_r,user通常位创建这个对象的进程的user,对访问控制没有影响总结:SELinux是通过MAC(Mandatory Access Control)方式来控管进程,它控制的主体是进程,而目标则是该进程能否读取的”文件资源”。主体SELinux 主要是想管理控制进程。注*:为了方便理解,如无特别说明,以下均把进程视为主体。目标主体进程能否访问的”目标资源”一般是文件系统。对象被主体访问的资源。可以是文件、目录、端口、设备等。注*:为了方便理解,如无特别说明,以下均把文件或者目录视为对象。策略因为进程和文件的数量庞大,因此 SELiunx会根据某些服务来制定基本的访问安全性策略。这些策略内部还有详细的规则来指定不同的服务开放某些资源的访问与否。系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由政策决定的。一套政策里面有多个规则。部分规则可以按照需求启用或禁用(以下把该类型的规则称为布尔型规则)。规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。SELINUX参数值:enforcing:强制执行SELinux功能;permissive:只显示警告信息;disabled:停用SELinux功能。SELINUXTYPE参数值:targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略;strict:完整的保护功能,包括网络服务、一般指令、应用程序,限制方面较为严格。安全上下文安全上下文是 SELinux 的核心。安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。一个「进程安全上下文」一般对应多个「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。安全上下文的结构及含义安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0。SELinux 的工作模式SELinux 有三种工作模式,分别是:enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。disabled:关闭 SELinux。SELinux 工作模式可以在 /etc/selinux/config 中设定。如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文。SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。SELinux 工作流程显示安全上下文加上-Z能显示主体、客体的上下文ls -Z能显示文件系统的安全上下文ps -Z能显示进程的安全上下文id -Z能显示shell的安全上下文:joe:usr_r:usr_t2、TE访问控制在SELinux中,默认时没有允许规则的,也没有超级用户。被允许的访问必须由规则给出。一条规则如下:allow Source type(s) Target type(s): Object class(es) Permission(s)比如这样的访问规则:allow user_t bin_t : file {read execute getattr};表示允许域为user_t的进程对type为bin_t的文件具有读、执行、得到属性的操作3、角色的作用SELinux也提供基于角色的访问控制通过以下语句指定role的type:role user_r type passwd_t;如果没有以上这条语句,则:安全上下文joe:user_r:passwd_t则不能被创建exec调用则失败,即便策略允许二、架构1、内核架构基于LSM(linux security module),为所有的内核的资源提供强制访问控制注*:LSM(linux security module)一种轻量级的安全访问控制框架,主要利用Hook函数对权限进行访问控制,并在部分对象中内置了透明的安全属性。LSM提供了一系列的钩子函数如果访问被DAC拒绝,则会影响审计结果SELinux的架构如下所示:策略决定包含在安全服务器中,与具体架构无关,便于移植对象管理者时各对象的管理者,在LSM架构中,是一系列的LSM钩子,遍布在内核的子系统中。注*:Linux安全模块(LSM)提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。2、用户空间的对象管理器SELinux支持将对象管理器放到用户态,使用内核的对象管理策略服务器来管理用户态的对象然而,支持用户空间的对象管理器有一些弱点:对于TE模型,还需要定义class对于对象管理器的管理策略不再内核之中策略服务架构如下:AVC表示各种缓存三、SELinux 的作用及权限管理机制1 SELinux 的作用SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?SELinux 就是来解决这个问题的。2 DAC在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。只要访问这个资源的进程符合以上的条件就可以被访问。而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。3 MAC在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。下文中的操作均为 MCS 模式。4 DAC 和 MAC 的对比这里引用一张图片来说明。可以看到,在 DAC 模式下,只要相应目录有相应用户的权限,就可以被访问。而在 MAC 模式下,还要受进程允许访问目录范围的限制。四、SELinux 基本操作1 查询文件或目录的安全上下文命令基本用法ls -Z能显示文件系统的安全上下文ps -Z能显示进程的安全上下文id -Z能显示shell的安全上下文:joe:usr_r:usr_t用法举例查询 /etc/hosts 的安全上下文。ls -Z /etc/hosts执行结果[root@localhost ~]# ls -Z /etc/hosts -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts [root@localhost ~]# 2 查询进程的安全上下文命令基本用法ps auxZ | grep -v grep | grep <进程名>用法举例查询 Nginx 相关进程的安全上下文。ps auxZ | grep -v grep | grep sshd执行结果[root@localhost ~]# [root@localhost ~]# ps auxZ | grep -v grep | grep sshd system_u:system_r:sshd_t:s0-s0:c0.c1023 root 1454 0.0 0.0 112940 4324 ? Ss Sep03 0:00 /usr/sbin/sshd -D unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 11664 0.0 0.0 158944 5596 ? Ss 10:34 0:00 sshd: root@pts/0 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 11668 0.0 0.0 156812 5444 ? Ss 10:34 0:00 sshd: root@notty [root@localhost ~]# 3 手动修改文件或目录的安全上下文命令基本用法chcon <选项> <文件或目录 1> [<文件或目录 2>...]用法举例修改 test 的安全上下文为 system_u:object_r:httpd_sys_content_t:s0。chcon -u system_u -r object_r -t httpd_sys_content_t html2/* [root@localhost nginx]# ls -Z drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 html2 [root@localhost nginx]# ls -Z html2 -rw-r--r--. root root unconfined_u:object_r:usr_t:s0 404.html -rw-r--r--. root root unconfined_u:object_r:usr_t:s0 50x.html -rwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 index.html -rw-r--r--. root root unconfined_u:object_r:usr_t:s0 nginx-logo.png -rw-r--r--. root root unconfined_u:object_r:usr_t:s0 poweredby.png [root@localhost nginx]# chcon -u system_u -r object_r -t httpd_sys_content_t html2/* [root@localhost nginx]# ls -Z html2 -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 404.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 50x.html -rwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 index.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 nginx-logo.png -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 poweredby.png [root@localhost nginx]# 4 把文件或目录的安全上下文恢复到默认值命令基本用法restorecon [选项] <文件或目录 1> [<文件或目录 2>...]用法举例添加一些网页文件到 Nginx 服务器的目录之后,为这些新文件设置正确的安全上下文。[root@localhost ~]# [root@localhost ~]# restorecon -R /root/test/ [root@localhost ~]# [root@localhost ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 test [root@localhost ~]# 5 查询系统中的布尔型规则及其状态命令基本用法getsebool -a由于该命令要么查询所有规则,要么只查询一个规则,所以一般都是先查询所有规则然后用 grep 筛选。用法举例查询与 httpd 有关的布尔型规则。getsebool -a | grep ssh执行结果[root@localhost ~]# [root@localhost ~]# getsebool -a | grep ssh fenced_can_ssh --> off selinuxuser_use_ssh_chroot --> off ssh_chroot_rw_homedirs --> off ssh_keysign --> off ssh_sysadm_login --> off [root@localhost ~]# 6 开关一个布尔型规则 命令基本用法setsebool [选项] <规则名称> <on|off>用法举例开启 httpd_anon_write 规则。setsebool -P httpd_anon_write on执行结果[root@localhost ~]# getsebool -a | grep ssh fenced_can_ssh --> off selinuxuser_use_ssh_chroot --> off ssh_chroot_rw_homedirs --> off ssh_keysign --> off ssh_sysadm_login --> off [root@localhost ~]# [root@localhost ~]# 修改布尔型规则[root@localhost ~]# setsebool -P ssh_sysadm_login on [root@localhost ~]# [root@localhost ~]# getsebool -a | grep ssh fenced_can_ssh --> off selinuxuser_use_ssh_chroot --> off ssh_chroot_rw_homedirs --> off ssh_keysign --> off ssh_sysadm_login --> on [root@localhost ~]# [root@localhost ~]# setsebool -P ssh_sysadm_login off [root@localhost ~]# [root@localhost ~]# getsebool -a | grep ssh fenced_can_ssh --> off selinuxuser_use_ssh_chroot --> off ssh_chroot_rw_homedirs --> off ssh_keysign --> off ssh_sysadm_login --> off [root@localhost ~]# 配置文件目录即文件内容[root@localhost booleans]# pwd /sys/fs/selinux/booleans [root@localhost booleans]# cat mpd_use_cifs 0 07 添加目录的默认安全上下文命令基本用法(如果提示找不到命令的话请安装 policycoreutils-python 软件包,下同。)semanage fcontext -a -t <文件安全上下文中的类型字段> "<目录(后面不加斜杠)>(/.*)?"注:目录或文件的默认安全上下文可以通过 semanage fcontext -l 命令配合 grep 过滤查看。用法举例为 Nginx 新增一个网站目录 /usr/share/nginx/html2 之后,需要为其设置与原目录相同的默认安全上下文。semanage fcontext -a -t httpd_sys_content_t " /usr/share/nginx/html2(/.*)?"8 添加某类进程允许访问的端口命令基本用法semanage port -a -t <服务类型> -p <协议> <端口号>注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。用法举例为 Nginx 需要使用 10080 的端口用于 HTTP 服务。semanage port -a -t http_port_t -p tcp 100809 参考其它进行修改命令基本用法chcon --reference=<源文件> <要修改的文件>修改 1.txt文件[root@localhost html]# ll -Z -rw-r--r--. root root unconfined_u:object_r:usr_t:s0 1.txt -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 404.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 50x.html lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 en-US -> ../../doc/HTML/en-US drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 img -> ../../doc/HTML/img lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 index.html -> ../../doc/HTML/index.h -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 nginx-logo.png lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 poweredby.png -> nginx-logo.png执行结果[root@localhost html]# chcon --reference=404.html 1.txt [root@localhost html]# [root@localhost html]# [root@localhost html]# ll -Z -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 1.txt -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 404.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 50x.html lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 en-US -> ../../doc/HTML/en-US drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 img -> ../../doc/HTML/img lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 index.html -> ../../doc/HTML/index.html -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 nginx-logo.png lrwxrwxrwx. root root system_u:object_r:httpd_sys_content_t:s0 poweredby.png -> nginx-logo.png10 修改后的权限,恢复到原始的命令基本用法restorecon -v <文件>[root@localhost files]# ls -Z /etc/yum.conf -rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/yum.conf [root@localhost files]# [root@localhost files]# [root@localhost files]# chcon -t httpd_config_t /etc/yum.conf [root@localhost files]# [root@localhost files]# ls -Z /etc/yum.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 /etc/yum.conf [root@localhost files]# 执行结果[root@localhost files]# restorecon -v /etc/yum.conf restorecon reset /etc/yum.conf context system_u:object_r:httpd_config_t:s0->system_u:object_r:etc_t:s0 [root@localhost files]# ls -Z /etc/yum.conf -rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/yum.conf [root@localhost files]# 11 查看身份角色类似[root@localhost ~]# yum install setools-console [root@localhost ~]# seinfo [选项] 选项: -u: 列出SELinux中所有的身份(user); -r: 列出SELinux中所有的角色(role); -t: 列出SELinux中所有的类型(type); -b: 列出所有的布尔值(也就是策略中的具体规则名称); -x: 显示更多的信息; 五、SELinux 错误分析和解决1 认识 SELinux 日志当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。这时候我们就需要借助 SELinux 违规日志来分析解决。SELinux 违规日志保存在 /var/log/audit/audit.log 中。/var/log/audit/audit.log 的内容大概是这样的。... [root@localhost ~]# tailf /var/log/audit/audit.log type=GRP_MGMT msg=audit(1630901844.207:878): pid=11979 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:groupadd_t:s0-s0:c0.c1023 msg='op=add-shadow-group id=994 exe="/usr/sbin/groupadd" hostname=? addr=? terminal=? res=success' type=ADD_USER msg=audit(1630901844.247:879): pid=11984 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:useradd_t:s0-s0:c0.c1023 msg='op=add-user id=997 exe="/usr/sbin/useradd" hostname=? addr=? terminal=? res=success' type=USER_MGMT msg=audit(1630901844.288:880): pid=11989 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:useradd_t:s0-s0:c0.c1023 msg='op=pam_tally2 reset=0 id=997 exe="/usr/sbin/pam_tally2" hostname=? addr=? terminal=? res=success' type=SOFTWARE_UPDATE msg=audit(1630901844.314:881): pid=11968 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='sw="nginx-filesystem-1:1.20.1-2.el7.noarch" sw_type=rpm key_enforce=0 gpg_res=1 root_dir="/" comm="yum" exe="/usr/bin/python2.7" hostname=localhost.localdomain addr=? terminal=pts/0 res=success' type=SOFTWARE_UPDATE msg=audit(1630901844.581:882): pid=11968 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='sw="nginx-1:1.20.1-2.el7.x86_64" sw_type=rpm key_enforce=0 gpg_res=1 root_dir="/" comm="yum" exe="/usr/bin/python2.7" hostname=localhost.localdomain addr=? terminal=pts/0 res=success' type=USER_AVC msg=audit(1630904068.840:883): pid=1053 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=7) exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?' type=MAC_POLICY_LOAD msg=audit(1630904065.495:884): policy loaded auid=0 ses=76 type=SYSCALL msg=audit(1630904065.495:884): arch=c000003e syscall=1 success=yes exit=3881672 a0=4 a1=7f3cf9ca2000 a2=3b3ac8 a3=7ffd6fe646a0 items=0 ppid=12014 pid=12019 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=76 comm="load_policy" exe="/usr/sbin/load_policy" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=PROCTITLE msg=audit(1630904065.495:884): proctitle="/sbin/load_policy" type=USER_MAC_CONFIG_CHANGE msg=audit(1630904068.901:885): pid=12014 uid=0 auid=0 ses=76 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='resrc=port op=add lport=10080 proto=6 tcontext=system_u:object_r:http_port_t:s0 comm="semanage" exe="/usr/bin/python2.7" hostname=? addr=? terminal=? res=success'该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert 这个实用工具来帮忙分析(如果提示找不到命令的话请安装 setroubleshoot 软件包)。2 使用 sealert 分析错误命令基本用法sealert -a /var/log/audit/audit.log执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图:[root@localhost ~]# yum install setroubleshoot-server python3-pydbus3 SELinux 错误的思路当发现一个服务出现错误的时候,请先检查一下 sealert 的分析报告里面是否有该服务进程名称的关键字。如果没有,说明不是 SELinux 造成的错误,请往其他方面排查。文件目录默认的权限在这个文件下,具体文件是file_contexts/etc/selinux/targeted/contexts/files/接下来就是阅读 sealert 的分析报告了。首先需要了解的就是违规原因。如果违规原因里面出现了该服务不该访问的文件或资源,那就要小心了。有可能是服务的配置有问题或者服务本身存在漏洞,请优先排查服务的配置文件。在分析报告中,对于一个违规行为,通常会有 2~3 个解决方案。请优先选择修改布尔值、设置默认安全上下文之类操作简单、容易理解的解决方案。如果没有这种操作简单、容易理解的解决方案,请先去搜索引擎搜索一下有没有其他更好的解决方案。需要注意的是,可信度只是一个参考值,并不代表使用可信度最高的解决方案就一定可以解决问题。我个人感觉使用可信度越高的解决方案对系统的改动就越小。不过请记住,在执行解决方案之前,一定要先搞清楚解决方案中的命令是干什么的!最后,请谨慎使用 audit2allow 这个命令。这个命令的作用非常简单粗暴,就是强制允许所遇到的错误然后封装成一个 SELinux 模块,接着让 SELinux 加载这个模块来达到消除错误的目的。不是万不得已建议不要随便使用 audit2allow。本文使用 文章同步助手 同步
2021年12月30日
710 阅读
0 评论
0 点赞
1
...
36
37
38
...
43