乐闻世界logo
搜索文章和话题

服务端面试题手册

如何进行 SSH 安全加固?有哪些最佳实践和安全配置建议?

SSH 安全加固是保护服务器免受未授权访问的重要措施。通过合理配置和最佳实践,可以显著提高 SSH 服务器的安全性。基础安全配置1. 修改默认端口# /etc/ssh/sshd_configPort 2222修改默认端口可以减少自动化扫描和暴力破解攻击。2. 禁用密码认证# /etc/ssh/sshd_configPasswordAuthentication noPubkeyAuthentication yes仅允许密钥认证,大大提高安全性。3. 禁止 root 登录# /etc/ssh/sshd_configPermitRootLogin no禁止 root 用户直接登录,需要先登录普通用户再提权。4. 限制登录用户# /etc/ssh/sshd_configAllowUsers admin deployDenyUsers test guestAllowGroups ssh-users只允许特定用户或组登录。高级安全配置1. 限制认证尝试次数# /etc/ssh/sshd_configMaxAuthTries 3MaxStartups 10:30:100LoginGraceTime 60限制认证尝试次数,防止暴力破解。2. 配置登录超时# /etc/ssh/sshd_configClientAliveInterval 300ClientAliveCountMax 2空闲连接超时自动断开。3. 禁用不安全功能# /etc/ssh/sshd_configX11Forwarding noAllowTcpForwarding yesGatewayPorts noPermitTunnel no禁用不需要的功能,减少攻击面。4. 使用强加密算法# /etc/ssh/sshd_config# 密钥交换算法KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256# 加密算法Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com# MAC 算法MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com使用现代、安全的加密算法。网络层安全1. 使用防火墙限制访问# iptables 示例iptables -A INPUT -p tcp --dport 2222 -s 192.168.1.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 2222 -j DROP# ufw 示例ufw allow from 192.168.1.0/24 to any port 2222ufw enable只允许特定 IP 访问 SSH 端口。2. 使用 TCP Wrappers# /etc/hosts.allowsshd: 192.168.1.0/24 : ALLOW# /etc/hosts.denysshd: ALL : DENY额外的访问控制层。3. 使用 fail2ban 防止暴力破解# /etc/fail2ban/jail.local[sshd]enabled = trueport = 2222maxretry = 3bantime = 3600findtime = 600自动封禁暴力破解 IP。密钥管理最佳实践1. 使用强密钥类型# 生成 ED25519 密钥(推荐)ssh-keygen -t ed25519 -b 4096# 生成 RSA 4096 位密钥ssh-keygen -t rsa -b 40962. 为私钥设置密码短语ssh-keygen -t ed25519 -C "user@example.com"# 提示时输入强密码短语3. 定期轮换密钥# 生成新密钥ssh-keygen -t ed25519 -f ~/.ssh/new_key# 将新公钥添加到服务器ssh-copy-id -i ~/.ssh/new_key.pub user@server# 删除旧密钥rm ~/.ssh/old_key4. 限制密钥使用# ~/.ssh/authorized_keys# 限制只能执行特定命令command="/usr/local/bin/backup-script" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...# 限制来源 IPfrom="192.168.1.0/24" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...# 禁用端口转发no-port-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...监控和审计1. 启用详细日志# /etc/ssh/sshd_configLogLevel VERBOSESyslogFacility AUTHPRIV记录详细的登录信息。2. 监控登录活动# 查看最近的登录last -n 20# 查看失败的登录尝试lastb -n 20# 实时监控 SSH 日志tail -f /var/log/auth.log | grep sshd3. 设置登录通知# ~/.bashrc 或 /etc/profileecho "SSH login: $(date) $(whoami) from $(echo $SSH_CLIENT | awk '{print $1}')" | mail -s "SSH Login Alert" admin@example.com收到登录通知邮件。多因素认证1. 使用 Google Authenticator# 安装apt-get install libpam-google-authenticator# 配置google-authenticator# /etc/pam.d/sshdauth required pam_google_authenticator.so# /etc/ssh/sshd_configChallengeResponseAuthentication yes2. 使用 SSH 证书# 生成 CA 密钥ssh-keygen -t ed25519 -f ~/.ssh/ca_key# 签发用户证书ssh-keygen -s ~/.ssh/ca_key -I user_id -n username -V +52w ~/.ssh/user_key.pub# 服务器配置# /etc/ssh/sshd_configTrustedUserCAKeys /etc/ssh/ca_key.pub定期维护1. 更新 SSH 软件# 定期检查更新apt-get updateapt-get upgrade openssh-server# 或使用自动更新apt-get install unattended-upgrades2. 审查配置# 检查配置语法sshd -t# 查看有效配置sshd -T | grep -i password3. 清理旧密钥# 删除不再使用的密钥rm ~/.ssh/old_key*# 清理 authorized_keysvim ~/.ssh/authorized_keys安全检查清单[ ] 修改默认端口[ ] 禁用密码认证[ ] 禁止 root 登录[ ] 限制登录用户[ ] 配置防火墙规则[ ] 启用 fail2ban[ ] 使用强加密算法[ ] 定期更新 SSH 软件[ ] 启用详细日志[ ] 实施多因素认证[ ] 定期审计访问日志[ ] 备份配置文件应急响应1. 发现入侵迹象# 检查异常登录last -n 100 | grep -v "reboot"# 检查进程ps aux | grep ssh# 检查网络连接netstat -tuln | grep :22222. 立即响应# 停止 SSH 服务systemctl stop sshd# 修改配置加强安全vim /etc/ssh/sshd_config# 重启服务systemctl start sshd3. 事后分析分析日志文件识别攻击来源修复安全漏洞更新安全策略
阅读 0·3月6日 23:38

如何配置 SSH 密钥认证?密钥认证相比密码认证有哪些优势?

SSH 密钥认证使用非对称加密技术,通过公钥和私钥对进行身份验证,比密码认证更安全、更便捷。密钥对生成使用 ssh-keygen 命令生成密钥对:# 生成 RSA 密钥(默认)ssh-keygen -t rsa -b 4096# 生成 ED25519 密钥(推荐,更安全高效)ssh-keygen -t ed25519# 指定文件名和注释ssh-keygen -t ed25519 -f ~/.ssh/my_key -C "user@example.com"密钥对组成私钥:必须保密,通常保存在 ~/.ssh/id_rsa 或 ~/.ssh/id_ed25519公钥:可以公开,通常保存在 ~/.ssh/id_rsa.pub 或 ~/.ssh/id_ed25519.pub配置步骤生成密钥对:在客户端运行 ssh-keygen复制公钥到服务器: # 方法1:使用 ssh-copy-id ssh-copy-id user@hostname # 方法2:手动复制 cat ~/.ssh/id_ed25519.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"设置权限: chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys优势安全性更高:私钥不易被破解,无需传输密码便捷性:无需每次输入密码,支持自动化脚本支持多因素认证:可配合密码短语(passphrase)使用细粒度控制:可在 authorized_keys 中限制命令、IP 等配置示例在 ~/.ssh/authorized_keys 中可以设置限制:# 限制只能执行特定命令command="echo 'Hello'" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...# 限制来源 IPfrom="192.168.1.0/24" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...# 禁用端口转发no-port-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...最佳实践使用 ED25519 或 RSA 4096 位密钥为私钥设置强密码短语定期轮换密钥使用 SSH 代理(ssh-agent)管理密钥禁用服务器的密码认证,仅使用密钥认证
阅读 0·3月6日 23:38

Cookie 在跨域场景下如何使用?需要注意哪些问题?

Cookie 在跨域场景下的使用需要特别注意,因为浏览器的同源策略会限制 Cookie 的访问和发送。同源策略与 CookieCookie 默认只在同源请求中发送同源:相同协议、域名和端口跨域 Cookie 设置通过 Domain 属性// 在父域名设置 Cookie,子域名可访问document.cookie = "token=xyz; Domain=.example.com; Path=/";设置 Domain 为 .example.com,所有子域名都能访问注意:Domain 必须是当前域名的父域名或相同域名跨域请求携带 Cookie// 前端设置fetch('https://api.example.com/data', { credentials: 'include' // 或 'same-origin'});// 或使用 XMLHttpRequestconst xhr = new XMLHttpRequest();xhr.withCredentials = true;xhr.open('GET', 'https://api.example.com/data');xhr.send();服务器端配置// Express.js 示例app.use(cors({ origin: 'https://frontend.example.com', credentials: true // 允许携带 Cookie}));// 设置 Cookie 时指定 SameSiteres.setHeader('Set-Cookie', [ 'token=xyz; HttpOnly; Secure; SameSite=None']);CORS 与 Cookie 的关系必须设置 credentials: 'include'服务器必须设置 Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin 不能是 *,必须是具体域名第三方 Cookie 限制Chrome、Firefox 等浏览器逐步限制第三方 CookieSafari 已默认阻止第三方 Cookie解决方案:使用 SameSite=None; Secure使用场景单点登录(SSO)跨域 API 认证第三方登录(OAuth)安全注意事项跨域 Cookie 必须使用 Secure 标志验证 Origin 和 Referer 头使用 CSRF Token 提供额外防护设置合理的过期时间
阅读 0·3月6日 23:36

WebRTC的数据通道有什么作用?如何使用它传输非媒体数据?

WebRTC数据通道(Data Channel)是WebRTC的一个重要特性,允许在点对点连接上传输非媒体数据。数据通道的作用:低延迟数据传输:适用于实时游戏、协作工具等需要低延迟的场景安全传输:使用DTLS加密,确保数据传输安全点对点传输:无需通过服务器中继,减少延迟和服务器负载双向通信:支持全双工通信,双方可以同时发送和接收数据可靠性选项:支持可靠传输(类似TCP)和不可靠传输(类似UDP)使用数据通道传输非媒体数据的步骤:创建数据通道: // 在RTCPeerConnection创建后 const dataChannel = peerConnection.createDataChannel('myDataChannel', { ordered: true, // 是否保证顺序 maxRetransmits: 3, // 最大重传次数 reliable: true // 是否可靠传输 });监听数据通道事件: // 发送方监听 dataChannel.onopen = () => { console.log('Data channel opened'); dataChannel.send('Hello WebRTC!'); }; dataChannel.onmessage = (event) => { console.log('Received message:', event.data); }; dataChannel.onclose = () => { console.log('Data channel closed'); }; dataChannel.onerror = (error) => { console.error('Data channel error:', error); };接收方处理数据通道: peerConnection.ondatachannel = (event) => { const receivedDataChannel = event.channel; receivedDataChannel.onopen = () => { console.log('Received data channel opened'); }; receivedDataChannel.onmessage = (event) => { console.log('Received message:', event.data); }; };发送数据: // 发送文本 dataChannel.send('Hello'); // 发送Blob const blob = new Blob(['Hello Blob'], { type: 'text/plain' }); dataChannel.send(blob); // 发送ArrayBuffer const buffer = new ArrayBuffer(8); const view = new Uint8Array(buffer); view[0] = 42; dataChannel.send(buffer);应用场景:实时游戏中的玩家状态同步协作工具中的实时白板数据实时文本聊天文件传输传感器数据传输
阅读 0·3月6日 23:36

WebRTC的信令过程是怎样的?为什么需要信令服务器?

WebRTC的信令过程是建立点对点连接的关键步骤,主要包括以下几个阶段:会话初始化:客户端A创建RTCPeerConnection对象客户端A调用createOffer()生成SDP(会话描述协议)提议客户端A通过信令服务器将SDP提议发送给客户端B客户端B接收SDP提议并调用setRemoteDescription()设置远程描述客户端B调用createAnswer()生成SDP应答客户端B通过信令服务器将SDP应答发送给客户端A客户端A接收SDP应答并调用setRemoteDescription()设置远程描述ICE候选者交换:双方在创建RTCPeerConnection后开始收集ICE候选者(包含IP地址和端口信息)当收集到ICE候选者时,通过信令服务器相互交换双方接收到对方的ICE候选者后,调用addIceCandidate()添加到连接中连接建立:当ICE候选者交换完成后,WebRTC会尝试建立点对点连接连接建立成功后,双方可以开始传输媒体数据信令服务器的必要性:NAT穿透:WebRTC需要通过信令交换ICE候选者来实现NAT穿透媒体协商:通过SDP交换协商媒体格式、编解码器等会话管理:处理呼叫发起、应答、挂断等会话控制用户发现:帮助用户找到并连接到其他用户安全认证:验证用户身份,确保通信安全需要注意的是,WebRTC规范本身并不包含信令协议,开发者需要自行选择合适的信令机制,如WebSocket、Socket.io、MQTT等。
阅读 0·3月6日 23:35

TensorFlow支持哪些优化器?请列举至少三种,并简要说明其特点。

在深度学习模型训练中,优化器是决定模型收敛速度、稳定性和最终性能的核心组件。TensorFlow作为主流机器学习框架,提供了丰富的优化器实现,以适应不同场景的需求。本文将系统解析TensorFlow支持的优化器,重点列举三种常用优化器(Adam、SGD、RMSProp),详细说明其数学原理、适用场景及实践建议,帮助开发者高效选择和应用。优化器概述TensorFlow 2.x通过tf.keras.optimizers模块提供多种优化器,均基于自动微分机制实现。这些优化器通过调整学习率(learning rate)和梯度更新策略,优化神经网络参数。选择合适的优化器需考虑数据特性(如稀疏性、噪声水平)、模型复杂度及训练目标。例如,在大规模数据集上,自适应优化器可显著提升训练效率;而在小规模数据或需要强正则化时,基础优化器更易控制。三种核心优化器详解Adam优化器特点:Adam(Adaptive Moment Estimation)融合了动量(Momentum)和RMSProp的优点,通过计算梯度的一阶矩(均值)和二阶矩(方差)的指数加权移动平均,实现自适应学习率调整。其核心优势在于:鲁棒性高:能有效处理稀疏梯度和非平稳目标,避免SGD的震荡问题。收敛速度快:在大多数任务中比SGD快2-5倍,尤其在大规模数据集上表现优异。内存效率:仅需存储一阶和二阶矩估计,适合高维参数。默认配置:通常使用learning_rate=0.001,但可通过beta_1和beta_2参数调整。数学公式:$$\begin{align}\text{m}t &= \beta1 \text{m}{t-1} + (1 - \beta1) gt \\text{v}t &= \beta2 \text{v}{t-1} + (1 - \beta2) gt^2 \\thetat &= \theta{t-1} - \alpha \frac{\text{m}t}{\sqrt{\text{v}t} + \epsilon}\end{align}$$其中,$\beta1$和$\beta2$为衰减系数(默认0.9和0.999),$\epsilon$为数值稳定性常数(默认1e-7)。适用场景:推荐用于大多数深度学习任务,包括CNN、RNN和Transformer模型。尤其适合图像识别(如ImageNet)和自然语言处理(如BERT预训练)。代码示例:import tensorflow as tf# 创建简单模型(示例:线性回归)model = tf.keras.Sequential([ tf.keras.layers.Dense(10, input_shape=(5,))])# 使用Adam优化器(推荐默认配置)optimizer = tf.keras.optimizers.Adam( learning_rate=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-7)model.compile(optimizer=optimizer, loss='mse')# 训练循环示例(实际使用需替换数据)# for epoch in range(100):# model.train_on_batch(X_train, y_train)实践建议:初学者首选:Adam是TensorFlow默认优化器,通常无需调参。调优技巧:若训练缓慢,可尝试降低learning_rate(如0.0001);若出现过拟合,结合clipnorm限制梯度范数。注意事项:在超大规模模型中,Adam可能因内存开销略高于SGD,需权衡性能。SGD优化器特点:SGD(Stochastic Gradient Descent)是基础优化器,通过随机梯度更新参数。其核心优势在于:简单高效:实现轻量,内存占用低(仅需存储当前梯度)。可控性高:可通过momentum和nesterov参数引入动量,减少震荡,适合凸优化问题。稳定性强:在小批量数据或噪声数据上,SGD能提供更稳定的收敛路径。正则化作用:随机性天然引入正则化,有助于防止过拟合。数学公式:$$\thetat = \theta{t-1} - \alpha \nabla\theta J(\theta{t-1})$$当使用动量时:$$\begin{align}vt &= \beta v{t-1} + (1 - \beta) gt \\thetat &= \theta{t-1} - \alpha \frac{vt}{\sqrt{\text{norm}(v_t)} + \epsilon}\end{align}$$其中,$\beta$为动量系数(默认0.9)。适用场景:适用于简单模型(如线性回归)或需要强正则化的场景。特别适合小规模数据集(\<10,000样本)和资源受限环境(如嵌入式设备)。
阅读 0·3月6日 23:20

TensorFlow Serving是什么?如何用它部署模型?

在机器学习模型从研发走向生产环境的过程中,高效、可靠的模型部署是关键挑战。TensorFlow Serving(简称TFS)是Google开发的开源服务系统,专为生产级模型部署设计。它基于gRPC协议,提供高性能、低延迟的预测服务,支持多种模型格式(如SavedModel、TensorFlow Lite),并能无缝集成到现代云原生架构中。本文将深入解析TFS的核心原理,并通过实践步骤指导你部署模型,助你实现从模型训练到实时推理的平滑过渡。什么是TensorFlow Serving?核心概念与设计目标TensorFlow Serving是一个专用的模型服务系统,旨在解决传统部署方案(如Flask或Django)的局限性。其核心目标包括:高性能:利用gRPC和多路复用技术,支持每秒数千次请求的高吞吐量。模型版本管理:自动处理模型更新,实现A/B测试和回滚。生产级可靠性:提供负载均衡、健康检查和故障转移机制。多模型支持:单个服务可同时托管多个模型,减少资源开销。TFS基于TensorFlow生态构建,与TensorFlow Estimator、Keras等框架无缝协同。它通过模型服务化(Model Serving)抽象层,将模型加载、推理和管理简化为标准接口,避免了重复编码。与传统方案的对比| 特性 | TensorFlow Serving | Flask/Django || ------ | ---------------------- | ---------------- || 性能 | gRPC优化,低延迟( | |​
阅读 0·3月6日 23:19

Elasticsearch 如何实现近实时搜索?

Elasticsearch 作为一款流行的分布式搜索与分析引擎,其核心优势之一是近实时(Near Real-time, NRT)搜索能力。这意味着数据在索引后通常能在秒级内被检索到,这对日志分析、实时监控和全文搜索等场景至关重要。本文将深入剖析 Elasticsearch 实现 NRT 的技术机制,包括底层原理、关键配置和实践建议,帮助开发者高效利用这一特性。一、引言:为什么需要近实时搜索?在 IT 领域,近实时搜索通常指数据从写入到可搜索的延迟在 1 秒左右。传统数据库如关系型系统往往提供事务性保证,但牺牲了查询速度;而 Elasticsearch 通过结合 Lucene 引擎和分布式架构,在保证高可靠性的前提下实现了亚秒级响应。例如,在电商网站的商品搜索中,用户期望在点击搜索后立即看到结果,NRT 能显著提升用户体验。Elasticsearch 的 NRT 机制是其区别于其他搜索库的核心竞争力,源于其对索引过程的优化设计。二、Elasticsearch 近实时搜索的核心机制1. Lucene 的倒排索引与分片Elasticsearch 基于 Apache Lucene 构建,其搜索能力依赖倒排索引(Inverted Index)。当数据写入时,Elasticsearch 会将每个文档分解为词项,并建立词项到文档ID的映射。为了水平扩展,数据被分配到多个分片(Shard),每个分片独立维护索引。NRT 的关键在于,索引过程不是原子的,而是分阶段完成,确保数据在写入后能快速可用。2. Translog 与 Commit 机制Elasticsearch 通过 translog(事务日志)确保数据持久化。当写入请求到达时:文档首先被写入内存中的 in-memory index(索引缓冲区)。同时,数据被记录到 translog 文件(持久化存储),用于在服务重启时恢复。当 translog 达到一定大小或时间间隔时,Elasticsearch 触发 commit 操作,将内存索引写入磁盘。NRT 的核心在于: 写入后,数据可立即在内存索引中查询,但需等待 translog 同步到磁盘。默认情况下,Elasticsearch 使用 refresh interval(刷新间隔)控制内存索引到磁盘的转换,通常为 1 秒。这使得数据在写入后 1 秒内即可被搜索,实现近实时效果。3. Refresh Interval 的作用refresh interval 是控制 NRT 行为的关键参数。默认值为 1 秒,表示 Elasticsearch 每 1 秒刷新一次内存索引到磁盘。刷新过程:将内存索引写入磁盘的副本(称为 segment)。生成新的可搜索索引,供查询使用。为什么是近实时? 数据写入后,内存索引立即可用,因此查询可以返回新数据。但严格来说,数据在内存索引中已可搜索,而磁盘同步是后台操作,确保了可靠性。若需更快响应,可缩短 refresh interval(例如 0.5 秒),但需权衡性能:频繁刷新会增加 I/O 负荷,可能影响写入吞吐量。4. 实践中的数据流数据写入 Elasticsearch 的典型流程:客户端发送请求到协调节点。节点将数据分发到主分片和副本分片。数据写入内存索引和 translog。每 1 秒触发 refresh,将内存索引写入磁盘。查询请求可立即使用内存索引,返回结果。​
阅读 0·3月6日 23:16