声明
学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。
公众号:泷羽sec
b站:泷羽sec
笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣幸成为一名分享者,最终目标是成为一名开拓者,很有趣也十分有意义
🤵♂️ 个人主页: @One_Blanks
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
文章目录
X
无论是防御还是进攻,强大的底层技术基础都是必要的
从防御的角度,了解底层技术才能知道如何构建防御体系
从进攻的角度,了解底层技术才能发现漏洞并且开发漏洞利用
攻击者和防御者都必须了解对方的运作方式
云技术历史
从前构建系统需要购买设备,租用数据中心机柜,搭建基础设施
随着处理器进化升级,虚拟机将一台机器的资源分成多台机器
提高资源利用率,灵活可拓展,从裸机基础设施到虚拟化基础设施
容器化进一步提高效率,实现服务器,网络和存储的虚拟交付
最新一代的基础设施我们称为“云”,它不是单一的技术,而是技术的集合。
云服务
云是一种 IT 基础设施系统,它将资源的创建抽象在软件层面。
云基础架构必须稳定且无频繁中断
地理分布的云基础设施提高容错能力
云必须能够快速扩展以满足需求
公有云服务商
Amazon web services (AWS)
Azure
google(GCP)
.华为云,腾讯云,阿里云…
组织可以使用openStack等工具在自己的数据中心搭建私有云。或者部分业务运行在私有云中,部分运行在公有云中
云分类
基础设施既服务(laas)
- 定义:IaaS 是云计算服务模式的最底层,它提供了基本的计算资源,如服务器、存储设备、网络设备等,以虚拟机或裸金属服务器的形式出租给用户。用户可以像使用自己的数据中心资源一样,在这些基础设施上安装操作系统、部署应用程序、配置网络等。
- 示例:亚马逊的 AWS EC2(Elastic Compute Cloud)是典型的 IaaS 服务。用户通过 AWS 控制台或 API,可以选择不同类型的 EC2 实例,这些实例具有不同的 CPU、内存、存储等配置。例如,用户可以选择一个具有 2 个 vCPU、8GB 内存和 100GB 存储的实例来运行自己的 Web 服务器。另外,像微软 Azure 的虚拟机服务也是 IaaS 的一种,用户可以在 Azure 提供的虚拟机上构建自己的开发、测试或生产环境。
平台既服务(PAAS)
- 定义:PaaS 在 IaaS 的基础上,提供了一个完整的应用程序开发和运行平台。它包括操作系统、编程语言运行环境、数据库管理系统、中间件等,让开发者能够专注于应用程序的开发,而无需关心底层的基础设施。
- 示例:Heroku 是一款流行的 PaaS 产品。开发者可以使用多种编程语言(如 Python、Ruby、Node.js 等)在 Heroku 平台上开发应用程序。Heroku 会自动处理应用程序的部署、运行环境的配置、扩展等工作。例如,开发者编写一个 Python 的 Web 应用程序后,只需将代码推送到 Heroku 的仓库,Heroku 就会自动构建和部署该应用程序,并且根据应用程序的流量自动调整资源。另外,谷歌的 App Engine 也是 PaaS 的代表,它支持 Java、Python 等多种语言,为开发者提供了便捷的应用开发和部署环境
软件既服务(SaaS)
- 定义:SaaS 是一种通过互联网提供软件应用服务的模式,用户无需在本地安装软件,而是通过浏览器或专用客户端访问云端的软件应用。软件的维护、升级、数据存储等工作都由 SaaS 提供商负责。
- 示例:Salesforce 是一款知名的 SaaS 产品,主要用于客户关系管理。企业用户可以通过浏览器访问 Salesforce 的应用程序,进行客户信息管理、销售机会跟踪、营销活动策划等业务操作。用户只需要一个账号和密码,就可以在任何有网络连接的地方使用该软件。另外,微软的 Office 365 也是 SaaS 的典型代表,用户可以在云端使用 Word、Excel、PowerPoint 等办公软件,并且可以实现多人协作编辑文档等功能,数据存储在云端,方便用户随时随地访问。
云架构
虚拟化
将一台机器的资源分 成多台虚拟机器,多台裸机汇集形成的资源集群隔离资源的使用,灵活且可扩展资源池.抽象了硬件安装过程,但仍有改进空间(并非为云而生)
- 技术栈的灵活性和可定制性提升,导致容器出现
- 容器允许开发 人员与堆栈各部分进行灵活交互,实现按需生成服务和网络抽象程度不断提高,方便应用迁移扩展,更加高效使用资源
云架构设计
组件选择
- 确定架构(难改),选择绑定/非绑定组件(开发、开源、购买)
- 云原生组件: 为分布式系统设计,CNCF认证(非必须)、安全编码、开源(部分)
- laC:引导介质(Packer)、安装系统(Terraform)、 自动配置(Ansible)、 状态强制(Monit)
集成部署
- 使用持续集成和持续交付(CICD) 管道来构建环境
包括测试、测量和扫描代码更改的自动化测试和部署(GitOps)
弹性可靠
- 任何单点故障都有故障转移或其他机制,使业务可以持续提供(冗余)
GSLB (智能DNS、GTM)解决客户单访问的单点故障隐患
平衡控制
- 控制保护系统免受漏洞和内部攻击的组件,应平衡控制和可用性
云设计模式
云架构设计不必从头开始, 使用已检验的设计模式是最佳选择
微服务架构
- 松散耦合、 模块化服务而设计,微服务协同工作以完成整体服务每个服务都可以独立修改代码和重用,提高系统整体弹性和容错
大多数云利用微服务架构,云原生应用被构建充当微服务,便于水平扩展安全优势:每个微服务应用强化、隔离,单一服务漏洞对整体系统影响小缺点:调试更加复杂,需要跨不同服务跟踪事务;性能短板
零信任架构
- 对资源的每个请求都需要验证来源已授权,然后授权短期访问(令牌)实现ZTA的一种常见方法是Open ID Connect (OIDC) 联盟访问
授权处于活动状态时可以访问任何联合内服务
密码重置是针对ZTA的常见攻击方式
安全控制
网络控制
传统架构使用防火墙实现网络控制,云环境网络抽象为SDN、SD WANSDN对不同的接口(如API或GUI) 设置网络规则
通过mTLS不仅流量加密,也对客户端进行身份验证,拥有证书才能访问微服务访问控制
不正确的访问管理可导致权限提升,甚至破坏整个基础设施
现代访问管理系统多使用令牌进行访问控制,提供对服务的短时访问权
JWT通常用于访问云端资源,伪造和破解密码是常见攻击手段
另一种类型的权限控制机制是强制访问控制MAC
身份管理
企业通常使用AD、LDAP进行身份管理
AWS IAM是身份和访问管理(IAM)的公共云服务
Google联盟认证OIDC经常用于2FA
- 云身份提供者(ldP)作为真实身份来源, 是更安全的解决方案(Azure AD)
容器与云
虚拟化中每个VM需要运行自己的操作系统, 显着增加了总体开销
容器化是一种更加现代的架构,容器共享内核与硬件,更快、更小、更高效
容器远没有虚拟化强大,因此容器是对虚拟化的补充,而非取代
容器的系统开销更小(可忽略),因此可以进一 步分离应用组件,例如搜索、登录、查询、订单功能分开
容器使用映像作为模板生成。映像相当于计算机硬盘
容器使用不同发行版文件加载内核,运行容器
在Ubuntu上生成cent os7容器
安装Docker
-
使用Docker这个流行的容器化工具
-
确保你已经安装了Docker。如果没有安装,可以使用以下命令安装:
sudo apt-get update
sudo apt-get install docker.io
- 检查是否安装成功
docker -v
启用Docker
sudo service docker start
- 启动成功后,没有错误信息输出。
可以使用 sudo docker ps
命令来验证 Docker 是否正常启动。
sudo docker ps
Docker配置中国镜像源
-
首先,需要找到
daemon.json
文件。在 Linux 系统中,该文件通常位于/etc/docker/
目录下。如果没有这个文件,可以使用文本编辑器(如vi
或nano
)创建一个。 -
阿里云镜像源: (registry-mirrors字符中不能存在空格否则就会配置失败)
阿里的这个镜像源每个人的都不一样,可以去官网看https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
- 网易云镜像源:
{
"registry-mirrors": ["https://hub - mirror.c.163.com/"]
}
- 重启 Docker 服务:完成配置后,需要重启 Docker 服务使配置生效。在 Ubuntu 或 Debian 系统中,可以使用命令
sudo service docker restart
;在 CentOS 或 RHEL 系统中,可以使用sudo systemctl restart docker
Docker中安装CentOS 7
- 拉取CentOS 7的官方Docker镜像:
sudo docker pull centos:7
- 运行一个基于CentOS 7镜像的容器:
sudo docker run -it --name my_centos7 centos:7 /bin/bash
sudo docker run -d --name my_centos7 centos:7 /bin/bash
两命令都会创建,exit
退出后仍然存在,可使用docker ps -a
进行查看
- 在这个命令中:
-it
选项允许你交互式地运行容器,会占用终端。OR或者 -d
选项(Detached,分离模式),容器就会在后台启动并运行,不会占用当前终端
--name my_centos7
给容器命名为my_centos7。
执行上述命令后,你会进入到一个新的CentOS 7容器中,可以在这个环境中执行CentOS 7系统的命令。
centos:7
指定使用的镜像。
/bin/bash
启动容器后执行的命令,这里启动了bash让你能与容器交互。
现在就是进入了CentOS 7中而并非之前的服务器
- 输入
exit
就会退出容器
容器与云
- 创建Apache容器后台运行
docker container run -d --rm -p 8080:80 httpd
-
第一次运行镜像的容器时都会有Unable 这是很常见的情况,因为本来就没有,所以需要Docker去网上pull
-
使用curl命令检查搭建是否成功
curl localhost:8080
- 存在回显,有具体标签,表示搭建成功
Docker 常用命令
查看所有正在运行容器
docker container ls
查看所有已经创建的容器
docker ps -a
查看特定容器的进程信息
docker top <container_name_or_id>
登陆后台运行的容器
docker exec -it 290b81b8fbfa /bin/bash
– 使用设置的参数name也是可以的.如: docker exec -it my_centos7 /bin/bash
停止容器
docker container stop 290b81b8fbfa
挂载宿主机目录
docker container run -d --rm -p 8080:80 -v /home/user/webroot/:/usr/local/apache2/htdocs/ httpd
-d
参数- 功能:表示以 “分离(detached)” 模式运行容器。
- 含义和作用:当容器以这种模式启动后,它会在后台运行,不会占用当前的命令行终端。这使得你可以在启动容器后,继续在终端中执行其他任务,比如启动其他容器、检查容器状态或者运行其他系统命令等。例如,你可以在启动这个
httpd
容器后,马上使用docker ps
命令查看容器是否已经成功启动并在后台运行。
--rm
参数- 功能:设置容器在退出时自动删除。
- 含义和作用:一旦容器内的任务完成或者因为某种原因(如发生错误、手动停止等)停止运行,Docker 会自动删除这个容器。这有助于保持 Docker 环境的整洁,避免大量无用的容器占用磁盘空间。特别是在临时测试或者短期运行容器的场景下非常有用,比如你只是想快速测试一下
httpd
服务器的配置,使用完后容器自动删除,不需要手动清理。
-p 8080:80
参数- 功能:进行端口映射。
- 含义和作用:左边的
8080
是宿主机(运行 Docker 的物理机或虚拟机)上的端口,右边的80
是容器内httpd
服务器默认监听的端口。通过这种映射,外部客户端(如浏览器)访问宿主机的8080
端口时,请求会被转发到容器内httpd
服务器监听的80
端口。这就使得你可以通过宿主机的8080
端口来访问容器内httpd
服务器提供的网页服务。例如,在浏览器中输入宿主机的 IP 地址加上8080
端口(如http://[宿主机IP]:8080
),就可以访问容器内httpd
服务器上的网页。
-v /home/user/webroot/:/usr/local/apache2/htdocs/
参数- 功能:进行目录挂载。
- 含义和作用:左边的
/home/user/webroot/
是宿主机上的一个目录,右边的/usr/local/apache2/htdocs/
是容器内httpd
服务器存放网页文档的默认目录。通过这种挂载,将宿主机上的目录挂载到容器内相应的目录。这样做有很多好处,一是方便在宿主机上直接对要提供给httpd
服务器的网页文档进行编辑、更新等操作。例如,你在宿主机的/home/user/webroot/
目录下新建一个index.html
文件,容器内的httpd
服务器就能直接使用这个文件来提供网页服务。二是实现了数据的持久化和共享,即使容器重新启动或者被删除后重新创建,只要宿主机上挂载的目录中的数据没有丢失,容器内的httpd
服务器就可以继续使用这些数据来提供网页服务。
httpd
部分- 功能:指定要运行的容器所基于的镜像名称。
- 含义和作用:
httpd
是一个常用的用于搭建 Apache HTTP 服务器的镜像。通过运行基于这个镜像的容器,容器内部会启动httpd
服务器,从而能够对外提供网页服务。当容器启动后,httpd
服务器会根据容器内的配置和挂载的网页文档目录来提供相应的网页内容
侦听宿主机80端口
docker container run -d --rm --network host -v /home/user/webroot/:/usr/local/apache2/htdocs/ httpd
--network host
参数- 功能:
- 将容器的网络模式设置为 “host” 模式。
- 含义和作用:
- 在这种模式下,容器会直接使用宿主机的网络栈。容器内的网络接口和端口将直接与宿主机相同,不再进行端口映射操作。例如,容器内
httpd
服务器监听的80
端口,将直接在宿主机的80
端口上进行监听。这对于一些需要直接使用宿主机网络资源或者需要避免网络地址转换(NAT)带来的复杂性的应用场景很有用。不过,这种模式也有一定的风险,因为容器内的服务将直接暴露在宿主机网络上,可能会增加安全风险。
- 在这种模式下,容器会直接使用宿主机的网络栈。容器内的网络接口和端口将直接与宿主机相同,不再进行端口映射操作。例如,容器内
- 功能:
Podman
-
Podman 是 Docker 的替代产品
-
无守护进程
-
运行容器 (不加sudo启动报错,默认禁止侦听1024以下端口)
-
sudo podman run -d --r-m --network host httpd
-
pod是共享名称的多个容器的集合
-
创建名为wha的空pod (加入两个容器,访问容器1)
podman pod create --name wha
podman run -d --pod wha httpd
podman run -pod wha -it alpine/curl /bin/bash
- 验证curl
curl localhost
PODMAN
大部分容器化过程都采用开放容器计划(OCI) 标准
因此Podman和Docker可互操作
容器的真相
Linux没有被称为“容器”的单一特性
实际上“容器"是阻止进程访问其他进程和资源的特性组合。由于这些发生在内核级别,所以可以控制“容器”的限制级别
容器的历史
197x年代引入chroot
1999年FreeBSD发布Jails, 在chroot之上提供更多限制(Linux不支持)
2002年引入namespaces,在需要时可分离内核资源
位于单独入namespace中的进程不知道主机网络或其他进程网络
2006年谷歌引入进程容器,后被称为cgroup,可将内存和CPU资源限制在特定进程中
结合cgroup和命名空间发布了Linux容器(LXC) 项目,可创建在单独命名空间中运行的容器
●Linux中八种用户命名空间
挂载、进程ID(PID)、网络、进程间通信(IPC)、Unix分时(UTS)、用户ID、控制组、时间、syslog
容器是一种轻量级的虚拟化技术,用于将应用程序及其所有依赖项打包在一起,以便在不同的计算环境中进行移植和运行。容器提供了一种隔离的运行环境,使得不同应用程序能够在独立的文件系统、网络和进程空间中运行,从而提升了安全性和稳定性
容器是一个轻量级、可执行的软件包,包含运行某个特定应用所需的所有代码、运行时环境、库和配置文件。与运行在物理或虚拟机上的应用不同,容器与宿主机共享内核,但在用户空间中以隔离的方式运行。这种隔离确保了不同容器之间的独立性,避免了相互干扰
Chroot
chroot是Linux上最原始的沙盒之一 ,可以指示进程的新根目录
chroot中的进程可以访问网络、挂载和其他内核功能,攻击者如破解其中进程,则能够逃逸到主机其余部分
进入chroot目录
sudo chroot /home/userlroots/min/ /bin/bash
ps au root 48086 S 01:21 0:00 sudo chroot /home/student/roots/bionic/ /bin/bash
-
查看系统进程信息(
ps
命令),并且筛选出用户为root
,进程 ID 为48086
,进程状态为S
(可中断睡眠状态,通常表示进程正在等待某些事件完成),启动时间为01:21
,占用 CPU 时间为0:00
的进程相关内容。这个进程对应的命令是sudo chroot /home/student/roots/bionic/ /bin/bash
-
虽然chroot实现了某种形式的分段,但并不完美。命名空间可实现每个进程分离网络、进程和其他命名空间
命名空间
Linux允许根据各种内核特性对进程进行分割
Linux中八种命名空间
挂载、进程ID(PID)、 网络、进程间通信(IPC)、 Unix分时(UTS)、用户ID、 控制组、时间、syslog
- 以PID命名空间为例,查看当前shell的PID
echo $$
$$
是一个特殊变量,表示当前shell进程的进程ID(PID)
- 在新命名空间中运行bash (容器化环境)
sudo unshare --fork --pid --mount /bin/bash
- 进一步隔离命名空间
ps aux
root1 ... May100:08 /sbin/init
mount-t proc none /proc
root1 ... May 100:09 /bin/bash
-
mount
是用于挂载文件系统的命令。-t proc
表示要挂载的文件系统类型是proc. -
这个操作通常用于在特定的环境(比如容器或者经过命名空间隔离的环境)中重新建立
proc
文件系统,以实现对进程相关信息的访问控制或者隔离 -
我们发现/sbin/init变为/bin/bash,这就起到一个命名隔离的效果
- 隔离网络命名空间
ip a
sudo unshare -fpmun --root /home/user/roots/ --mount-proc /bin/bash
ip a
Capabilities
Docker默认不使用用户命名空间。为了防止特权内核调用,其使用内核capabilities和seccomp配置文件限制访问
Linux具有特权或非特权进程
具有正确权限的非特权进程可以写入系统文件,但特权进程几乎无所不能用户权限过于宽泛,当非特权用户只需要特殊权限时,可使用Capabilities
Linux将一些系统级任务分组为40多个类别,称为Capabilities
能力允许非特权进程运行特定的系统级任务,而无需授予其完全访问权
内核限制进程使用自定义数据包创建原始套接字的能力
内核不支持半开TCP连接
nmap 127.0.0.1-sS
非特权用户需要运行调用原始套接字能力的命令
SUID(所有者为root)
#提权隐患
sudo cp /usr/bin/nmap /usr/bin/nmap-cap
sudo setcap cap_ net raw+eip /usr/bin/nmap-capo
nmap-cap --privileged 127.0.0.1-sS
命令解释
sudo cp /usr/bin/nmap /usr/bin/nmap-cap这一步是使用管理员权限(sudo)将系统中的 nmap 工具复制一份并命名为 nmap-cap。
sudo setcap cap_net_raw+eip /usr/bin/nmap-cap这一步是给新复制的 nmap-cap 工具赋予特定的权限,使其能够进行原始套接字操作等高级权限操作。
nmap-cap --privileged 127.0.0.1 -sS这一步是使用具有特殊权限的 nmap-cap 工具去扫描本地地址。
- 这里的提权隐患在于:
随意提升工具的权限可能会被恶意用户利用。如果一个恶意用户获得了对这个工具的控制,或者通过某种方式利用这个工具的高权限状态,就可能对系统进行破坏,比如访问本不应该被访问的系统资源、窃取敏感信息等。 这种提权操作可能会绕过系统正常的安全机制。系统通常有一系列的权限控制和安全策略来防止未经授权的操作,但通过这种方式提权可能会打破这些安全防线,使系统更容易受到攻击。 如果这个工具被黑客利用,他们可以利用其高权限来进一步渗透系统,甚至完全控制整个系统,给系统的安全性带来极大的威胁。
- 常见Capabilities
CAP_ CHOWN:允许进程修改文件所有者
CAP NET ADMIN: 对网络配置(IP、 防火墙等)执行管理任务0 CAP NET_ BIND SERVICE:允许绑定低于1024的端口
CAP _NET _RAW: 允许使用RAW套接字
CAP_ SYS_ ADMIN: “根"权限(危险),启用过多的功能集CAP_ SYS_ BOOT: 允许重新启动主机
CAP_ SYS_ MODULE:允许加载和卸载内核模块
CAP_ SYS_ TIME:允许进程设置系统时钟
CAP SYS_ CHROOT:允许使用chroot
CAP AUDIT _WRITE: 允许写入内核审计日志
Kubernetes(k8s)
介绍
Kubernetes,通常简称为 K8s,是一个开源的容器编排平台。它可以自动化部署、扩展和管理容器化应用程序。Kubernetes 能够在多个服务器上高效地运行容器,确保应用的高可用性和可扩展性。
核心概念
Pod
Pod 是 Kubernetes 中最小的可部署单元,它可以包含一个或多个容器。这些容器共享网络命名空间和存储卷,并且被一起调度和管理。
Deployment
Deployment 用于管理 Pod 的副本数量和更新策略。它可以确保应用始终保持指定数量的副本在运行,并且可以实现滚动更新等功能。
Service
Service 定义了一组 Pod 的访问方式。它提供了一个稳定的 IP 地址和端口,使得外部可以通过这个地址访问到一组 Pod。
Node
Node 是 Kubernetes 中的工作节点,它可以是物理服务器或虚拟机。每个 Node 上运行着 Kubelet 和容器运行时,负责管理容器的生命周期。
安装Minikube(用于本地开发的 Kubernetes 环境)
- 下载 Minikube 二进制文件
- 可以从 Minikube 官方网站下载适合你系统架构的版本。例如,对于 64 位的 Linux 系统,使用以下命令下载:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
- 使下载的二进制文件可执行。
chmod +x minikube-linux-amd64
- 将可执行文件移动到
PATH
中的目录(例如/usr/local/bin
),以便在任何位置都能方便地使用
sudo mv minikube-linux-amd64 /usr/local/bin/minikube
启动Minikube
minikube start
注意
:如果直接使用root用户启动它会报错,所以su切换到其他用户再启动
验证Minikube 是否成功启动
minikube status
部署应用到 Kubernetes
安装kubectl
- 下载
kubectl
二进制文件
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
- 使二进制文件可执行
chmod +x kubectl
- 将
kubectl
移动到PATH
中的目录(例如/usr/local/bin
)
sudo mv kubectl /usr/local/bin/
创建一个 Deployment
kubectl create deployment nginx --image=nginx
- 部署 Nginx 服务器。
查看 Deployment
kubectl get deployments
创建一个 Service
kubectl expose deployment nginx --port=80 --type=NodePort
- 让外部访问 Nginx 服务器。
查看 Service
kubectl get services
访问应用
在 Service 信息中找到 NodePort 的端口号,使用“:”在浏览器中访问 Nginx 服务器。
扩展应用
- 扩展 Deployment 的副本数量
kubectl scale deployment nginx --replicas=3
- 查看副本数量
kubectl get deployments
更新应用
-
更新 Deployment 的镜像
使用以下命令将 Nginx 的镜像更新为一个新的版本:kubectl set image deployment/nginx nginx=new-image:version
-
查看更新进度
使用以下命令查看 Deployment 的更新进度:kubectl rollout status deployment/nginx
Git
介绍
Git 是一个分布式版本控制系统,用于跟踪文件的变化,方便团队协作开发软件项目。它可以记录文件的历史版本,允许开发者在不同版本之间切换,并且可以合并多个开发者的修改。
安装
在不同操作系统上的安装方法
Windows:可以从 Git 官方网站下载安装程序进行安装。
macOS:可以使用 Homebrew 等包管理器安装 Git。
Linux:可以通过系统的包管理器安装 Git,
例如在 Ubuntu 上可以使用
sudo apt-get install git
- 检查安装
git --version
避免敏感信息泄露
- 不要提交敏感信息
避免在 Git 仓库中提交敏感信息,如密码、密钥、个人身份信息等。
如果不小心提交了敏感信息,可以使用 git rm --cached <文件名> 命令从暂存区删除文件,然后使用
git commit --amend
命令修改上一次提交。
- 使用
.gitignore
文件
创建一个.gitignore
文件,列出不需要被跟踪的文件和目录。例如,可以将包含敏感信息的文件或
时文件添加到.gitignore
文件中。
- 加密通信
确保与 Git 远程仓库的通信是加密的。可以使用 SSH 或 HTTPS 协议进行通信。
定期备份
- 定期备份 Git 仓库
定期备份 Git 仓库,以防止数据丢失。可以使用 Git 的备份工具,或者将仓库复制到其他存储设备中。
安全审计
- 定期进行安全审计
定期检查 Git 仓库的安全性,包括权限设置、敏感信息泄露等。可以使用第三方工具进行安全审计。
《Git安全教程》
保护 Git 仓库的重要性
Git 仓库通常包含项目的源代码和敏感信息,如密码、密钥等。因此,保护 Git 仓库的安全非常重要,以防止敏感信息泄露和恶意攻击。
基本安全措施
使用强密码
为 Git 远程仓库设置强密码,避免使用简单的密码或常用密码。
限制访问权限
只授予必要的人员访问 Git 仓库的权限。可以使用 Git 提供的权限管理功能,或者使用第三方
工具进行更精细的权限控制。
基本使用
初始化仓库
在一个新的项目目录中,初始化一个 Git 仓库,使用git init
命令
git init
添加文件
使用git add <文件名>
命令将文件添加到暂存区。
可以使用 git add. 将当前目录下的所有文件添加到暂存区。
提交更改
使用 git commit -m "提交说明"
命令将暂存区的文件提交到本地仓库。
查看状态
查看当前仓库的状态,包括哪些文件被修改、哪些文件在暂存区等, 使用 git status
命令
git status
查看历史记录
查看提交历史记录,使用 git log
命令
git log
分支管理
创建分支
使用 git branch <分支名>
命令创建一个新分支。
git branch <分支名>
切换分支
使用git checkout <分支名>
命令切换到指定分支。
git checkout <分支名>
合并分支
当在一个分支上完成工作后,可以将其合并到另一个分支。首先切换到目标分支,然后使用
git merge <源分支名>
命令进行合并。
git merge <源分支名>
远程仓库
添加远程仓库
使用git remote add <远程仓库名> <远程仓库地址>
命令添加一个远程仓库。
git remote add <远程仓库名> <远程仓库地址>
推送更改
使用 git push <远程仓库名> <分支名>
命令将本地分支的更改推送到远程仓库。
git push <远程仓库名> <分支名>
拉取更改
使用git pull <远程仓库名> <分支名>
命令从远程仓库拉取最新的更改并合并到本地分支。
git pull <远程仓库名> <分支名>
协作开发
克隆仓库
如果要参与一个项目,可以使用git clone <远程仓库地址>
命令克隆仓库到本地。
处理冲突
当多个开发者同时修改同一个文件时,可能会出现冲突。在合并分支时,需要手动解决冲突,然后提交更改。
历史记录,使用 git log
命令
git log
分支管理
创建分支
使用 git branch <分支名>
命令创建一个新分支。
git branch <分支名>
切换分支
使用git checkout <分支名>
命令切换到指定分支。
git checkout <分支名>
合并分支
当在一个分支上完成工作后,可以将其合并到另一个分支。首先切换到目标分支,然后使用
git merge <源分支名>
命令进行合并。
git merge <源分支名>
远程仓库
添加远程仓库
使用git remote add <远程仓库名> <远程仓库地址>
命令添加一个远程仓库。
git remote add <远程仓库名> <远程仓库地址>
推送更改
使用 git push <远程仓库名> <分支名>
命令将本地分支的更改推送到远程仓库。
git push <远程仓库名> <分支名>
拉取更改
使用git pull <远程仓库名> <分支名>
命令从远程仓库拉取最新的更改并合并到本地分支。
git pull <远程仓库名> <分支名>
协作开发
克隆仓库
如果要参与一个项目,可以使用git clone <远程仓库地址>
命令克隆仓库到本地。
处理冲突
当多个开发者同时修改同一个文件时,可能会出现冲突。在合并分支时,需要手动解决冲突,然后提交更改。