前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[数据完整性保障措施在Hive运维中的实践]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
Kafka
...心角色。生产者负责将数据写入Kafka集群,而消费者则从这些主题中读取数据。嘿,你知道吗?Kafka这家伙,他可是个玩转分布式系统的高手!他设计的那个系统,就像个超级快递员一样,能保证你的信息无论去哪儿,都能安全无误地送达。这背后有个秘密武器,那就是消息持久化和高可用性机制。就像是在每个包裹上都贴了个追踪标签,不管遇到啥情况,都能找到它的踪迹。这样一来,无论是你发的信息还是数据,都能稳稳当当地到达目的地,不用担心会迷路或者丢失。这不就是咱们想要的安全可靠嘛!哎呀,你知道吗?在咱们实际操作的时候,有时候会遇到一些出乎意料的小麻烦。比如说,“InvalidProducerGroupLogPartitionLogSegmentState”,这句看起来就挺专业的,但其实就是告诉我们,系统在处理数据时遇到了点小问题,可能是某个部分的状态不对劲了。得赶紧找找是哪里出了岔子,然后对症下药,把这个问题解决掉。毕竟,咱们的系统就像个大家庭,每个成员都得好好配合,才能顺畅运行啊!本文旨在深入探讨这一问题的原因、解决方法以及预防措施。 二、问题解析 理解“InvalidProducerGroupLogPartitionLogSegmentState” 当我们在Kafka的日志中看到这个错误信息时,通常意味着生产者组的日志分区或日志段的状态不正常。这可能是由于多种原因导致的,包括但不限于: - 日志段损坏:Kafka在存储消息时,会将其分割成多个日志段(log segments)。哎呀,你猜怎么着?如果某个日志段因为存储的时候出了点小差错,或者是硬件哪里有点小故障,那可就有可能导致一些问题冒出来!就像是你家电脑里的文件不小心被删了,或者硬盘突然罢工了,结果你得花时间去找回丢失的信息,这事儿在日志里也可能会发生。所以,咱们得好好照顾这些数据,别让它们乱跑乱跳,对吧? - 日志清理策略冲突:Kafka的默认配置可能与特定场景下的需求不匹配,例如日志清理策略设置为保留时间过短或日志备份数量过多等,都可能导致日志段状态异常。 - 生产者组管理问题:生产者组内部的成员管理不当,或者组内成员的增加或减少频繁,也可能引发这种状态的错误。 三、代码示例 如何检测和修复问题 为了更直观地理解这个问题及其解决方法,下面我们将通过一些简单的代码示例来演示如何在Kafka环境中检测并修复这类问题。 示例代码1:检查和修复日志段状态 首先,我们需要使用Kafka提供的命令行工具kafka-log-consumer来检查日志段的状态。以下是一个基本的命令示例: bash 连接到Kafka集群 bin/kafka-log-consumer.sh --zookeeper localhost:2181 --topic your-topic-name --group your-group-name 检查特定日志段的状态 bin/kafka-log-consumer.sh --zookeeper localhost:2181 --topic your-topic-name --group your-group-name --log-segment-state INVALID 如果发现特定日志段的状态为“INVALID”,可以尝试使用kafka-log-cleaner工具来修复问题: bash 启动日志清理器,修复日志段 bin/kafka-log-cleaner.sh --zookeeper localhost:2181 --topic your-topic-name --group your-group-name --repair 示例代码2:调整日志清理策略 对于日志清理策略的调整,可以通过修改Kafka配置文件server.properties来实现。以下是一个示例配置,用于延长日志段的保留时间: properties 延长日志段保留时间 log.retention.hours=24 确保在进行任何配置更改后,重启Kafka服务器以使更改生效: bash 重启Kafka服务器 service kafka-server-start.sh config/server.properties 四、最佳实践与预防措施 为了预防“InvalidProducerGroupLogPartitionLogSegmentState”错误的发生,建议采取以下最佳实践: - 定期监控:使用Kafka监控工具(如Kafka Manager)定期检查集群状态,特别是日志清理和存储情况。 - 合理配置:根据实际业务需求合理配置Kafka的参数,如日志清理策略、备份策略等,避免过度清理导致数据丢失。 - 容错机制:设计具有高容错性的生产者和消费者逻辑,能够处理临时网络中断或其他不可预测的错误。 - 定期维护:执行定期的集群健康检查和日志清理任务,及时发现并解决问题。 五、结语 从失败到成长 面对“InvalidProducerGroupLogPartitionLogSegmentState”这样的问题,虽然它可能会带来暂时的困扰,但正是这些挑战促使我们深入理解Kafka的工作机制和最佳实践。哎呀,学着怎么识别问题,然后把它们解决掉,这事儿可真挺有意思的!不仅能让你的电脑或者啥设备运行得更稳当,还不停地长本事,就像个技术侦探一样,对各种情况都能看得透透的。这不是简单地提升技能,简直是开挂啊!记住,每一次挑战都是成长的机会,让我们在技术的道路上不断前行。
2024-08-28 16:00:42
107
春暖花开
转载文章
...一个 SQLite 数据库中,一旦这个数据库损坏,将会丢失用户的聊天记录。 解决思路 预防措施: SQLite 是一个号称每行代码都有对应测试的成熟框架,其代码问题导致的 bug 非常少见。而一般损坏原因主要有3点: 空间不足 设备断电或 AppCrash 文件 sync 失败 针对空间不足: 通过中度的使用和观察,我发现 iOS 端的空间占用是相对合理的,并没有对存储空间的明显浪费。并且 App 会在数据库写入时检查可用空间,如果不足时会抛出空间不足的提示。 针对设备断电或App崩溃: 设备断电属于不可抗力。而 App 崩溃目前我们准备上线 APM 监控平台,预期在一到两个版本的迭代中把崩溃率降低到千分之一以下的行业优秀水平。 针对文件 sync 失败: 调整 synchronous = FULL , 保证每个事务的操作都能写入文件。目前CoreData的默认配置项。 调整 fullfsync = 1 , 保证写入文件顺序和提交顺序一致,拒绝设备重排顺序以优化性能。此项会降低性能。对比得出写入性能大概降低至默认值的25%左右。 优化效果: 根据微信的实践,调整配置项后,损坏率可以降低一半,但并不能完全避免损坏,所以我们还是需要补救措施。 补救措施: 通过查阅 SQLite 的相关资料,发现修复损坏数据库的两种思路和四种方案。 思路一:数据导出 .dump修复 从 master 表中读出一个个表的信息,根据根节点地址和创表语句来 select 出表里的数据,能 select 多少是多少,然后插入到一个新 DB 中。 每个SQLite DB都有一个sqlite_master表,里面保存着全部table和index的信息(table本身的信息,不包括里面的数据哦),遍历它就可以得到所有表的名称和 CREATE TABLE ...的SQL语句,输出CREATE TABLE语句,接着使用SELECT FROM ... 通过表名遍历整个表,每读出一行就输出一个INSERT语句,遍历完后就把整个DB dump出来了。 这样的操作,和普通查表是一样的,遇到损坏一样会返回SQLITE_CORRUPT,我们忽略掉损坏错误, 继续遍历下个表,最终可以把所有没损坏的表以及损坏了的表的前半部分读取出来。将 dump 出来的SQL语句逐行执行,最终可以得到一个等效的新DB。 思路二:数据备份 拷贝: 不能再直白的方式。由于SQLite DB本身是文件(主DB + journal 或 WAL), 直接把文件复制就能达到备份的目的。 .dump备份: 上一个恢复方案用到的命令的本来目的。在DB完好的时候执行.dump, 把 DB所有内容输出为 SQL语句,达到备份目的,恢复的时候执行SQL即可。 Backup API: SQLite自身提供的一套备份机制,按 Page 为单位复制到新 DB, 支持热备份。 综合思路:备份master表+数据导出 WCDB框架: 数据库完整时备份master表,数据库损坏时通过使用已备份的master表读取损坏数据库来恢复数据。成功率大概是70%。缺点在于我们目前项目使用的是CoreData框架,迁移成本非常的高。没有办法使用。 补救措施选型原则: 这么多的方案孰优孰劣?作为一个移动APP,我们追求的就是用户体验,根据资料推断只有万分之一不到的用户会发生DB损坏,不能为了极个别牺牲全体用户的体验。不影响用户体验的方法就是好方案。主要考量指标如下: 一:恢复成功率 由于牵涉到用户核心数据,“姑且一试”的方案是不够的,虽说 100% 成功率不太现实,但 90% 甚至 99% 以上的成功率才是我们想要的。 二:备份大小: 原本用户就可能有2GB 大的 DB,如果备份数据本身也有2GB 大小,用户想必不会接受。 三:备份性能: 性能则主要影响体验和备份成功率,作为用户不感知的功能,占用太多系统资源造成卡顿 是不行的,备份耗时越久,被系统杀死等意外事件发生的概率也越高。 数据导出方案考量: 恢复成功率大概是30%。不需要事先备份,故备份大小和备份性能都是最优的。 备份方案考量: 备份方案的理论恢复成功率都为100%,需要考量的即为备份大小和性能。 拷贝:备份大小等于原文件大小。备份性能最好,直接拷贝文件,不需要运算。 Backup API: 备份大小等于原文件大小。备份性能最差,原因是热备份,需要用到锁机制。 .dump:因为重新进行了排序,备份大小小于原文件。备份性能居中,需要遍历数据库生成语句。 可以看出,比较折中的选择是 Dump ,备份大小具有明显优势,备份性能尚可,恢复性能较差但由于需要恢复的场景较少,算是可以接受的短板。 深入钻研 即使优化后的方案,对于大DB备份也是耗时耗电,对于移动APP来说,可能未必有这样的机会做这样重度的操作,或者频繁备份会导致卡顿和浪费使用空间。 备份思路的高成本迫使我们从另外的方案考虑,于是我们再次把注意力放在之前的Dump方案。 Dump 方案本质上是尝试从坏DB里读出信息,这个尝试一般来说会出现两种结果: DB的基本格式仍然健在,但个别数据损坏,读到损坏的地方SQLite返回SQLITE_CORRUPT错误, 但已读到的数据得以恢复。 基本格式丢失(文件头或sqlite_master损坏),获取有哪些表的时候就返回SQLITE_CORRUPT, 根本没法恢复。 第一种可以算是预期行为,毕竟没有损坏的数据能部分恢复。从成功率来看,不少用户遇到的是第二种情况,这种有没挽救的余地呢? 要回答这个问题,先得搞清楚sqlite_master是什么。它是一个每个SQLite DB都有的特殊的表, 无论是查看官方文档Database File Format,还是执行SQL语句 SELECT FROM sqlite_master;,都可得知这个系统表保存以下信息: 表名、类型(table/index)、 创建此表/索引的SQL语句,以及表的RootPage。sqlite_master的表名、表结构都是固定的, 由文件格式定义,RootPage 固定为 page 1。 正常情况下,SQLite 引擎打开DB后首次使用,需要先遍历sqlite_master,并将里面保存的SQL语句再解析一遍, 保存在内存中供后续编译SQL语句时使用。假如sqlite_master损坏了无法解析,“Dump恢复”这种走正常SQLite 流程的方法,自然会卡在第一步了。为了让sqlite_master受损的DB也能打开,需要想办法绕过SQLite引擎的逻辑。 由于SQLite引擎初始化逻辑比较复杂,为了避免副作用,没有采用hack的方式复用其逻辑,而是决定仿造一个只可以 读取数据的最小化系统。 虽然仿造最小化系统可以跳过很多正确性校验,但sqlite_master里保存的信息对恢复来说也是十分重要的, 特别是RootPage,因为它是表对应的B-tree结构的根节点所在地,没有了它我们甚至不知道从哪里开始解析对应的表。 sqlite_master信息量比较小,而且只有改变了表结构的时候(例如执行了CREATE TABLE、ALTER TABLE 等语句)才会改变,因此对它进行备份成本是非常低的,一般手机典型只需要几毫秒到数十毫秒即可完成,一致性也容易保证, 只需要执行了上述语句的时候重新备份一次即可。有了备份,我们的逻辑可以在读取DB自带的sqlite_master失败的时候 使用备份的信息来代替。 到此,初始化必须的数据就保证了,可以仿造读取逻辑了。我们常规使用的读取DB的方法(包括dump方式恢复), 都是通过执行SQL语句实现的,这牵涉到SQLite系统最复杂的子系统——SQL执行引擎。我们的恢复任务只需要遍历B-tree所有节点, 读出数据即可完成,不需要复杂的查询逻辑,因此最复杂的SQL引擎可以省略。同时,因为我们的系统是只读的, 写入恢复数据到新 DB 只要直接调用 SQLite 接口即可,因而可以省略同样比较复杂的B-tree平衡、Journal和同步等逻辑。 最后恢复用的最小系统只需要: VFS读取部分的接口(Open/Read/Close),或者直接用stdio的fopen/fread、Posix的open/read也可以 B-tree解析逻辑 Database File Format 详细描述了SQLite文件格式, 参照之实现B-tree解析可读取 SQLite DB。 实现了上面的逻辑,就能读出DB的数据进行恢复了,但还有一个小插曲。我们知道,使用SQLite查询一个表, 每一行的列数都是一致的,这是Schema层面保证的。但是在Schema的下面一层——B-tree层,没有这个保证。 B-tree的每一行(或者说每个entry、每个record)可以有不同的列数,一般来说,SQLite插入一行时, B-tree里面的列数和实际表的列数是一致的。但是当对一个表进行了ALTER TABLE ADD COLUMN操作, 整个表都增加了一列,但已经存在的B-tree行实际上没有做改动,还是维持原来的列数。 当SQLite查询到ALTER TABLE前的行,缺少的列会自动用默认值补全。恢复的时候,也需要做同样的判断和支持, 否则会出现缺列而无法插入到新的DB。 解析B-tree方案上线后,成功率约为78%。这个成功率计算方法为恢复成功的 Page 数除以总 Page 数。 由于是我们自己的系统,可以得知总 Page 数,使用恢复 Page 数比例的计算方法比人数更能反映真实情况。 B-tree解析好处是准备成本较低,不需要经常更新备份,对大部分表比较少的应用备份开销也小到几乎可以忽略, 成功恢复后能还原损坏时最新的数据,不受备份时限影响。 坏处是,和Dump一样,如果损坏到表的中间部分,比如非叶子节点,将导致后续数据无法读出。 落地实践: 剥离封装RepairKit: 从WCDB框架中,剥离修复组件,并且封装其C++的原始API为OC管理类。 备份 master 表的时机: 我们发现 SQLite 里面 B+树 算法的实现是 向下分裂 的,也就是说当一个叶子页满了需要分裂时,原来的叶子页会成为内部节点,然后新申请两个页作为他的叶子页。这就保证了根节点一旦下来,是再也不会变动的。master 表只会在新创建表或者删除一个表时才会发生变化,而CoreData的机制表明每一次数据库的变动都要改动版本标识,那么我通过缓存和查询版本标识的变动来确定何时进行备份,避免频繁备份。 备份文件有效性: 既然 DB 可以损坏,那么这个备份文件也会损坏,怎么办呢?我用了双备份,每一个版本备份两个文件,如果一个备份恢复失败,就会启动另一个备份文件恢复。 介入恢复时机: 当CoreData初始化SQLite前,校验SQLite的Head完整性,如果不完整,进行介入修复。 经过我深入研究证明了这已经是最佳做法。 本篇文章为转载内容。原文链接:https://blog.csdn.net/a66666225/article/details/81637368。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-11-23 18:22:40
127
转载
转载文章
在深入理解SQL数据库操作的诸多要素之后,我们可以关注近期关于数据库优化和安全性的前沿动态。近日,MySQL官方发布了8.0.28版本,该版本强化了对窗口函数的支持,并提升了索引条件推送的性能,使得复杂查询得以更高效地执行。同时,针对多表查询优化策略,许多数据库专家和社区成员正在探讨如何借助物化视图、分区表等高级功能进一步提升查询速度。 此外,随着数据安全问题日益凸显,触发器在保障数据一致性与合规性方面的作用受到更多重视。例如,在金融交易系统中,通过精心设计的触发器可实现对关键业务数据的实时审计追踪。而在数据同步场景下,触发器结合流处理技术(如Debezium)实现实时增量数据同步,已被广泛应用在微服务架构中。 另一方面,存储过程的安全性与性能优化也成为了热门话题。有研究指出,通过合理设计和使用参数化存储过程,不仅可以减少SQL注入风险,还能有效提高数据库系统的整体性能。尤其在大数据环境下,企业开始探索利用存储过程进行批量化数据清洗和预处理,以减轻服务器负载并确保数据质量。 最后,针对数据库隐私保护,各大云服务商正积极引入同态加密、动态数据屏蔽等前沿技术,这些技术在不影响查询性能的前提下,增强了数据在存储及传输过程中的安全性,为用户提供了更为全面的数据安全保障。对于SQL开发者而言,紧跟这些技术趋势和实践案例,无疑将有助于更好地应对未来数据库管理和查询优化的挑战。
2023-04-26 19:09:16
83
转载
转载文章
...中启用它们。 2. 数据库性能调优实践:针对特定应用场景调整MySQL服务器配置参数至关重要。例如,通过优化innodb_buffer_pool_size以提升InnoDB存储引擎的性能,或者调整query_cache_size以缓存查询结果。实时案例分析和专家建议可以帮助您更好地理解如何根据服务器硬件资源和工作负载特征进行有效调优。 3. 日志管理与故障排查:MySQL服务器的日志记录功能对于问题诊断和审计有着重要作用。学习如何通过配置慢查询日志、错误日志以及二进制日志实现对系统运行状况的有效监控,并借助相关工具分析日志数据来发现并解决潜在问题。 4. 高可用性和复制策略:在生产环境中,MySQL往往需要部署为集群或采用主从复制模式以确保服务的高可用性。深入研究server-id、binlog_format等相关配置项如何影响复制行为,并结合GTID(全局事务标识符)等高级复制特性进行实战演练。 5. 操作系统级优化配合MySQL:除了直接修改MySQL配置文件外,系统级别的优化也相当重要,包括合理分配内存、磁盘I/O调度策略、网络参数调整等,这些都会间接影响到MySQL服务器的性能表现。及时跟踪Linux或Windows操作系统的最佳实践指南,以实现软硬件层面的协同优化。 综上所述,MySQL服务器配置文件只是数据库运维中的一个环节,后续的学习应结合当前的技术发展动态、行业最佳实践以及自身业务需求,不断深化对MySQL以及其他相关技术栈的理解与应用能力。
2023-10-08 09:56:02
129
转载
转载文章
...的技术细节,均在协议数据包处理代码中,漏洞类型古典,分别是全局缓冲区溢出、堆溢出和空指针解引用。其中缓冲区溢出类型漏洞可方便构造PoC,实现远程任意代码执行的漏洞利用。 漏洞本身原理简单,也并不是关键。以其中一个为例,Pavel在发现时负责任地向LibVNC作者提交了issue,并跟进漏洞修复过程;在第一次修复之后,复核并指出修复代码无效,给出了有效patch。这个过程是常规操作。 漏洞疑点 有意思的是,在漏洞披露邮件中,Pavel重点谈了自己对这系列漏洞的一些周边发现,也是这里提到的原因。其中,关于存在漏洞的代码,作者表述: 我最初认为,这些问题是libvnc开发者自己代码中的错误,但看起来并非如此。其中有一些(如CoRRE数据处理函数中的堆缓冲区溢出),出现在AT&T实验室1999年的代码中,而后被很多软件开发者原样复制(在Github上搜索一下HandleCoRREBPP函数,你就知道),LibVNC和TightVNC也是如此。 为了证实,翻阅了这部分代码,确实在其中数据处理相关代码文件看到了剑桥和AT&T实验室的文件头GPL声明注释,中国菜刀 这证实这些文件是直接从最初剑桥实验室版本VNC移植过来的,且使用方式是 直接代码包含,而非独立库引用方式。在官方开源发布并停止更新后,LibVNC使用的这部分代码基本没有改动——除了少数变量命名方式的统一,以及本次漏洞修复。通过搜索,我找到了2000年发布的相关代码文件,确认这些文件与LibVNC中引入的原始版本一致。 另外,Pavel同时反馈了TightVNC中相同的问题。TightVNC与LibVNC没有继承和直接引用关系,但上述VNC代码同样被TightVNC使用,问题的模式不约而同。Pavel测试发现在Ubuntu最新版本TightVNC套件(1.3.10版本)中同样存在该问题,上报给当前软件所有者GlavSoft公司,但对方声称目前精力放在不受GPL限制的TightVNC 2.x版本开发中,对开源的1.x版本漏洞代码“可能会进行修复”。看起来,这个问题被踢给了各大Linux发行版社区来焦虑了——如果他们愿意接锅。 问题思考 在披露邮件中,Pavel认为,这些代码bug“如此明显,让人无法相信之前没被人发现过……也许是因为某些特殊理由才始终没得到修复”。 事实上,我们都知道目前存在一些对开源基础软件进行安全扫描的大型项目,例如Google的OSS;同时,仍然存活的开源项目也越来越注重自身代码发布前的安全扫描,Fortify、Coverity的扫描也成为很多项目和平台的标配。在这样一些眼睛注视下,为什么还有这样的问题?我认为就这个具体事例来说,可能有如下两个因素: ·上游已死。仍然在被维护的代码,存在版本更迭,也存在外界的持续关注、漏洞报告和修复、开发的迭代,对于负责人的开发者,持续跟进、评估、同步代码的改动是可能的。但是一旦一份代码走完了生命周期,就像一段史实一样会很少再被改动。 ·对第三方上游代码的无条件信任。我们很多人都有过基础组件、中间件的开发经历,不乏有人使用Coverity开启全部规则进行代码扫描、严格修复所有提示的问题甚至编程规范warning;报告往往很长,其中也包括有源码形式包含的第三方代码中的问题。但是,我们一方面倾向于认为这些被广泛使用的代码不应存在问题(不然早就被人挖过了),一方面考虑这些引用的代码往往是组件或库的形式被使用,应该有其上下文才能认定是否确实有可被利用的漏洞条件,现在单独扫描这部分代码一般出来的都是误报。所以这些代码的问题都容易被忽视。 但是透过这个具体例子,再延伸思考相关的实践,这里最根本的问题可以总结为一个模式: 复制粘贴风险。复制粘贴并不简单意味着剽窃,实际是当前软件领域、互联网行业发展的基础模式,但其中有一些没人能尝试解决的问题: ·在传统代码领域,如C代码中,对第三方代码功能的复用依赖,往往通过直接进行库的引入实现,第三方代码独立而完整,也较容易进行整体更新;这是最简单的情况,只需要所有下游使用者保证仅使用官方版本,跟进官方更新即可;但在实践中很难如此贯彻,这是下节讨论的问题。 ·有些第三方发布的代码,模式就是需要被源码形式包含到其他项目中进行统一编译使用(例如腾讯的开源Json解析库RapidJSON,就是纯C++头文件形式)。在开源领域有如GPL等规约对此进行规范,下游开发者遵循协议,引用代码,强制或可选地显式保留其GPL声明,可以进行使用和更改。这样的源码依赖关系,结合规范化的changelog声明代码改动,侧面也是为开发过程中跟进考虑。但是一个成型的产品,比如企业自有的服务端底层产品、中间件,新版本的发版更新是复杂的过程,开发者在旧版本仍然“功能正常”的情况下往往倾向于不跟进新版本;而上游代码如果进行安全漏洞修复,通常也都只在其最新版本代码中改动,安全修复与功能迭代并存,如果没有类似Linux发行版社区的努力,旧版本代码完全没有干净的安全更新patch可用。 ·在特定场景下,有些开发实践可能不严格遵循开源代码协议限定,引入了GPL等协议保护的代码而不做声明(以规避相关责任),丢失了引入和版本的信息跟踪;在另一些场景下,可能存在对开源代码进行大刀阔斧的修改、剪裁、定制,以符合自身业务的极端需求,但是过多的修改、人员的迭代造成与官方代码严重的失同步,丧失可维护性。 ·更一般的情况是,在开发中,开发者个体往往心照不宣的存在对网上代码文件、代码片段的复制-粘贴操作。被参考的代码,可能有上述的开源代码,也可能有各种Github作者练手项目、技术博客分享的代码片段、正式开源项目仅用来说明用法的不完备示例代码。这些代码的引入完全无迹可寻,即便是作者自己也很难解释用了什么。这种情况下,上面两条认定的那些与官方安全更新失同步的问题同样存在,且引入了独特的风险:被借鉴的代码可能只是原作者随手写的、仅仅是功能成立的片段,甚至可能是恶意作者随意散布的有安全问题的代码。由此,问题进入了最大的发散空间。 在Synopsys下BLACKDUCK软件之前发布的《2018 Open Source Security and Risk Analysis Report》中分析,96%的应用中包含有开源组件和代码,开源代码在应用全部代码中的占比约为57%,78%的应用中在引用的三方开源代码中存在历史漏洞。也就是说,现在互联网上所有厂商开发的软件、应用,其开发人员自己写的代码都是一少部分,多数都是借鉴来的。而这还只是可统计、可追溯的;至于上面提到的非规范的代码引用,如果也纳入进来考虑,三方代码占应用中的比例会上升到多少?曾经有分析认为至少占80%,我们只期望不会更高。 Ⅱ. 从碎片到乱刃:OpenSSH在野后门一览 在进行基础软件梳理时,回忆到反病毒安全软件提供商ESET在2018年十月发布的一份白皮书《THE DARK SIDE OF THE FORSSHE: A landscape of OpenSSH backdoors》。其站在一个具有广泛用户基础的软件提供商角度,给出了一份分析报告,数据和结论超出我们对于当前基础软件使用全景的估量。以下以我的角度对其中一方面进行解读。 一些必要背景 SSH的作用和重要性无需赘言;虽然我们站在传统互联网公司角度,可以认为SSH是通往生产服务器的生命通道,但当前多样化的产业环境已经不止于此(如之前libssh事件中,不幸被我言中的,SSH在网络设备、IoT设备上(如f5)的广泛使用)。 OpenSSH是目前绝大多数SSH服务端的基础软件,有完备的开发团队、发布规范、维护机制,本身是靠谱的。如同绝大多数基础软件开源项目的做法,OpenSSH对漏洞有及时的响应,针对最新版本代码发出安全补丁,但是各大Linux发行版使用的有各种版本的OpenSSH,这些社区自行负责将官方开发者的安全补丁移植到自己系统搭载的低版本代码上。天空彩 白皮书披露的现状 如果你是一个企业的运维管理人员,需要向企业生产服务器安装OpenSSH或者其它基础软件,最简单的方式当然是使用系统的软件管理安装即可。但是有时候,出于迁移成本考虑,可能企业需要在一个旧版本系统上,使用较新版本的OpenSSL、OpenSSH等基础软件,这些系统不提供,需要自行安装;或者需要一个某有种特殊特性的定制版本。这时,可能会选择从某些rpm包集中站下载某些不具名第三方提供的现成的安装包,或者下载非官方的定制化源码本地编译后安装,总之从这里引入了不确定性。 这种不确定性有多大?我们粗估一下,似乎不应成为问题。但这份白皮书给我们看到了鲜活的数据。 ESET研究人员从OpenSSH的一次历史大规模Linux服务端恶意软件Windigo中获得启示,采用某种巧妙的方式,面向在野的服务器进行数据采集,主要是系统与版本、安装的OpenSSH版本信息以及服务端程序文件的一个特殊签名。整理一个签名白名单,包含有所有能搜索到的官方发布二进制版本、各大Linux发行版本各个版本所带的程序文件版本,将这些标定为正常样本进行去除。最终结论是: ·共发现了几百个非白名单版本的OpenSSH服务端程序文件ssh和sshd; ·分析这些样本,将代码部分完全相同,仅仅是数据和配置不同的合并为一类,且分析判定确认有恶意代码的,共归纳为 21个各异的恶意OpenSSH家族; ·在21个恶意家族中,有12个家族在10月份时完全没有被公开发现分析过;而剩余的有一部分使用了历史上披露的恶意代码样本,甚至有源代码; ·所有恶意样本的实现,从实现复杂度、代码混淆和自我保护程度到代码特征有很大跨度的不同,但整体看,目的以偷取用户凭证等敏感信息、回连外传到攻击者为主,其中有的攻击者回连地址已经存在并活跃数年之久; ·这些后门的操控者,既有传统恶意软件黑产人员,也有APT组织; ·所有恶意软件或多或少都在被害主机上有未抹除的痕迹。ESET研究者尝试使用蜜罐引诱出攻击者,但仍有许多未解之谜。这场对抗,仍未取胜。 白皮书用了大篇幅做技术分析报告,此处供细节分析,不展开分析,以下为根据恶意程序复杂度描绘的21个家族图谱: 问题思考 问题引入的可能渠道,我在开头进行了一点推测,主要是由人的原因切入的,除此以外,最可能的是恶意攻击者在利用各种方法入侵目标主机后,主动替换了目标OpenSSH为恶意版本,从而达成攻击持久化操作。但是这些都是止血的安全运维人员该考虑的事情;关键问题是,透过表象,这显露了什么威胁形式? 这个问题很好回答,之前也曾经反复说过:基础软件碎片化。 如上一章节简单提到,在开发过程中有各种可能的渠道引入开发者不完全了解和信任的代码;在运维过程中也是如此。二者互相作用,造成了软件碎片化的庞杂现状。在企业内部,同一份基础软件库,可能不同的业务线各自定制一份,放到企业私有软件仓库源中,有些会有人持续更新供自己产品使用,有些由系统软件基础设施维护人员单独维护,有些则可能是开发人员临时想起来上传的,他们自己都不记得;后续用到的这个基础软件的开发和团队,在这个源上搜索到已有的库,很大概率会倾向于直接使用,不管来源、是否有质量背书等。长此以往问题会持续发酵。而我们开最坏的脑洞,是否可能有黑产人员入职到内部,提交个恶意基础库之后就走人的可能?现行企业安全开发流程中审核机制的普遍缺失给这留下了空位。 将源码来源碎片化与二进制使用碎片化并起来考虑,我们不难看到一个远远超过OpenSSH事件威胁程度的图景。但这个问题不是仅仅靠开发阶段规约、运维阶段规范、企业内部管控、行业自查、政府监管就可以根除的,最大的问题归根结底两句话: 不可能用一场战役对抗持续威胁;不可能用有限分析对抗无限未知。 Ⅲ. 从自信到自省:RHEL、CentOS backport版本BIND漏洞 2018年12月20日凌晨,在备战冬至的软件供应链安全大赛决赛时,我注意到漏洞预警平台捕获的一封邮件。但这不是一个漏洞初始披露邮件,而是对一个稍早已披露的BIND在RedHat、CentOS发行版上特定版本的1day漏洞CVE-2018-5742,由BIND的官方开发者进行额外信息澄(shuǎi)清(guō)的邮件。 一些必要背景 关于BIND 互联网的一个古老而基础的设施是DNS,这个概念在读者不应陌生。而BIND“是现今互联网上最常使用的DNS软件,使用BIND作为服务器软件的DNS服务器约占所有DNS服务器的九成。BIND现在由互联网系统协会负责开发与维护参考。”所以BIND的基础地位即是如此,因此也一向被大量白帽黑帽反复测试、挖掘漏洞,其开发者大概也一直处在紧绷着应对的处境。 关于ISC和RedHat 说到开发者,上面提到BIND的官方开发者是互联网系统协会(ISC)。ISC是一个老牌非营利组织,目前主要就是BIND和DHCP基础设施的维护者。而BIND本身如同大多数历史悠久的互联网基础开源软件,是4个UCB在校生在DARPA资助下于1984年的实验室产物,直到2012年由ISC接管。 那么RedHat在此中是什么角色呢?这又要提到我之前提到的Linux发行版和自带软件维护策略。Red Hat Enterprise Linux(RHEL)及其社区版CentOS秉持着稳健的软件策略,每个大的发行版本的软件仓库,都只选用最必要且质量久经时间考验的软件版本,哪怕那些版本实在是老掉牙。这不是一种过分的保守,事实证明这种策略往往给RedHat用户在最新漏洞面前提供了保障——代码总是跑得越少,潜在漏洞越多。 但是这有两个关键问题。一方面,如果开源基础软件被发现一例有历史沿革的代码漏洞,那么官方开发者基本都只为其最新代码负责,在当前代码上推出修复补丁。另一方面,互联网基础设施虽然不像其上的应用那样爆发性迭代,但依然持续有一些新特性涌现,其中一些是必不可少的,但同样只在最新代码中提供。两个刚需推动下,各Linux发行版对长期支持版本系统的软件都采用一致的策略,即保持其基础软件在一个固定的版本,但对于这些版本软件的最新漏洞、必要的最新软件特性,由发行版维护者将官方开发者最新代码改动“向后移植”到旧版本代码中,即backport。这就是基础软件的“官宣”碎片化的源头。 讲道理,Linux发行版维护者与社区具有比较靠谱的开发能力和监督机制,backport又基本就是一些复制粘贴工作,应当是很稳当的……但真是如此吗? CVE-2018-5742漏洞概况 CVE-2018-5742是一个简单的缓冲区溢出类型漏洞,官方评定其漏洞等级moderate,认为危害不大,漏洞修复不积极,披露信息不多,也没有积极给出代码修复patch和新版本rpm包。因为该漏洞仅在设置DEBUG_LEVEL为10以上才会触发,由远程攻击者构造畸形请求造成BIND服务崩溃,在正常的生产环境几乎不可能具有危害,RedHat官方也只是给出了用户自查建议。 这个漏洞只出现在RHEL和CentOS版本7中搭载的BIND 9.9.4-65及之后版本。RedHat同ISC的声明中都证实,这个漏洞的引入原因,是RedHat在尝试将BIND 9.11版本2016年新增的NTA机制向后移植到RedHat 7系中固定搭载的BIND 9.9版本代码时,偶然的代码错误。NTA是DNS安全扩展(DNSSEC)中,用于在特定域关闭DNSSEC校验以避免不必要的校验失败的机制;但这个漏洞不需要对NTA本身有进一步了解。 漏洞具体分析 官方没有给出具体分析,但根据CentOS社区里先前有用户反馈的bug,我得以很容易还原漏洞链路并定位到根本原因。 若干用户共同反馈,其使用的BIND 9.9.4-RedHat-9.9.4-72.el7发生崩溃(coredump),并给出如下的崩溃时调用栈backtrace: 这个调用过程的逻辑为,在9 dns_message_logfmtpacket函数判断当前软件设置是否DEBUG_LEVEL大于10,若是,对用户请求数据包做日志记录,先后调用8 dns_message_totext、7 dns_message_sectiontotext、6 dns_master_rdatasettotext、5 rdataset_totext将请求进行按协议分解分段后写出。 由以上关键调用环节,联动RedHat在9.9.4版本BIND源码包中关于引入NTA特性的源码patch,进行代码分析,很快定位到问题产生的位置,在上述backtrace中的5,masterdump.c文件rdataset_totext函数。漏洞相关代码片段中,RedHat进行backport后,这里引入的代码为: 这里判断对于请求中的注释类型数据,直接通过isc_buffer_putstr宏对缓存进行操作,在BIND工程中自定义维护的缓冲区结构对象target上,附加一字节字符串(一个分号)。而漏洞就是由此产生:isc_buffer_putstr中不做缓冲区边界检查保证,这里在缓冲区已满情况下将造成off-by-one溢出,并触发了缓冲区实现代码中的assertion。 而ISC上游官方版本的代码在这里是怎么写的呢?找到ISC版本BIND 9.11代码,这里是这样的: 这里可以看到,官方代码在做同样的“附加一个分号”这个操作时,审慎的使用了做缓冲区剩余空间校验的str_totext函数,并额外做返回值成功校验。而上述提到的str_totext函数与RETERR宏,在移植版本的masterdump.c中,RedHat开发者也都做了保留。但是,查看代码上下文发现,在RedHat开发者进行代码移植过程中,对官方代码进行了功能上的若干剪裁,包括一些细分数据类型记录的支持;而这里对缓冲区写入一字节,也许开发者完全没想到溢出的可能,所以自作主张地简化了代码调用过程。 问题思考 这个漏洞本身几乎没什么危害,但是背后足以引起思考。 没有人在“借”别人代码时能不出错 不同于之前章节提到的那种场景——将代码文件或片段复制到自己类似的代码上下文借用——backport作为一种官方且成熟的做法,借用的代码来源、粘贴到的代码上下文,是具有同源属性的,而且开发者一般是追求稳定性优先的社区开发人员,似乎质量应该有足够保障。但是这里的关键问题是:代码总要有一手、充分的语义理解,才能有可信的使用保障;因此,只要是处理他人的代码,因为不够理解而错误使用的风险,只可能减小,没办法消除。 如上分析,本次漏洞的产生看似只是做代码移植的开发者“自作主张”之下“改错了”。但是更广泛且可能的情况是,原始开发者在版本迭代中引入或更新大量基础数据结构、API的定义,并用在新的特性实现代码中;而后向移植开发人员仅需要最小规模的功能代码,所以会对增量代码进行一定规模的修改、剪裁、还原,以此适应旧版本基本代码。这些过程同样伴随着第三方开发人员不可避免的“望文生义”,以及随之而来的风险。后向移植操作也同样助长了软件碎片化过程,其中每一个碎片都存在这样的问题;每一个碎片在自身生命周期也将有持续性影响。 多级复制粘贴无异于雪上加霜 这里简单探讨的是企业通行的系统和基础软件建设实践。一些国内外厂商和社区发布的定制化Linux发行版,本身是有其它发行版,如CentOS特定版本渊源的,在基础软件上即便同其上游发行版最新版本间也存在断层滞后。RedHat相对于基础软件开发者之间已经隔了一层backport,而我们则人为制造了二级风险。 在很多基础而关键的软件上,企业系统基础设施的维护者出于与RedHat类似的初衷,往往会决定自行backport一份拷贝;通过早年心脏滴血事件的洗礼,即暴露出来OpenSSL一个例子。无论是需要RHEL还没来得及移植的新版本功能特性,还是出于对特殊使用上下文场景中更高执行效率的追求,企业都可能自行对RHEL上基础软件源码包进行修改定制重打包。这个过程除了将风险幂次放大外,也进一步加深了代码的不可解释性(包括基础软件开发人员流动性带来的不可解释)。 Ⅳ. 从武功到死穴:从systemd-journald信息泄露一窥API误用 1月10日凌晨两点,漏洞预警平台爬收取一封漏洞披露邮件。披露者是Qualys,那就铁定是重型发布了。最后看披露漏洞的目标,systemd?这就非常有意思了。 一些必要背景 systemd是什么,不好简单回答。Linux上面软件命名,习惯以某软件名后带个‘d’表示后台守护管理程序;所以systemd就可以说是整个系统的看守吧。而即便现在描述了systemd是什么,可能也很快会落伍,因为其初始及核心开发者Lennart Poettering(供职于Red Hat)描述它是“永无开发完结完整、始终跟进技术进展的、统一所有发行版无止境的差异”的一种底层软件。笼统讲有三个作用:中央化系统及设置管理;其它软件开发的基础框架;应用程序和系统内核之间的胶水。如今几乎所有Linux发行版已经默认提供systemd,包括RHEL/CentOS 7及后续版本。总之很基础、很底层、很重要就对了。systemd本体是个主要实现init系统的框架,但还有若干关键组件完成其它工作;这次被爆漏洞的是其journald组件,是负责系统事件日志记录的看守程序。 额外地还想简单提一句Qualys这个公司。该公司创立于1999年,官方介绍为信息安全与云安全解决方案企业,to B的安全业务非常全面,有些也是国内企业很少有布局的方面;例如上面提到的涉及碎片化和代码移植过程的历史漏洞移动,也在其漏洞管理解决方案中有所体现。但是我们对这家公司粗浅的了解来源于其安全研究团队近几年的发声,这两年间发布过的,包括有『stack clash』、『sudo get_tty_name提权』、『OpenSSH信息泄露与堆溢出』、『GHOST:glibc gethostbyname缓冲区溢出』等大新闻(仅截至2017年年中)。从中可见,这个研究团队专门啃硬骨头,而且还总能开拓出来新的啃食方式,往往爆出来一些别人没想到的新漏洞类型。从这个角度,再联想之前刷爆朋友圈的《安全研究者的自我修养》所倡导的“通过看历史漏洞、看别人的最新成果去举一反三”的理念,可见差距。 CVE-2018-16866漏洞详情 这次漏洞披露,打包了三个漏洞: ·16864和16865是内存破坏类型 ·16866是信息泄露 ·而16865和16866两个漏洞组和利用可以拿到root shell。 漏洞分析已经在披露中写的很详细了,这里不复述;而针对16866的漏洞成因来龙去脉,Qualys跟踪的结果留下了一点想象和反思空间,我们来看一下。 漏洞相关代码片段是这样的(漏洞修复前): 读者可以先肉眼过一遍这段代码有什么问题。实际上我一开始也没看出来,向下读才恍然大悟。 这段代码中,外部信息输入通过buf传入做记录处理。输入数据一般包含有空白字符间隔,需要分隔开逐个记录,有效的分隔符包括空格、制表符、回车、换行,代码中将其写入常量字符串;在逐字符扫描输入数据字符串时,将当前字符使用strchr在上述间隔符字符串中检索是否匹配,以此判断是否为间隔符;在240行,通过这样的判断,跳过记录单元字符串的头部连续空白字符。 但是问题在于,strchr这个极其基础的字符串处理函数,对于C字符串终止字符'\0'的处理上有个坑:'\0'也被认为是被检索字符串当中的一个有效字符。所以在240行,当当前扫描到的字符为字符串末尾的NULL时,strchr返回的是WHITESPACE常量字符串的终止位置而非NULL,这导致了越界。 看起来,这是一个典型的问题:API误用(API mis-use),只不过这个被误用的库函数有点太基础,让我忍不住想是不是还会有大量的类似漏洞……当然也反思我自己写的代码是不是也有同样情况,然而略一思考就释然了——我那么笨的代码都用for循环加if判断了:) 漏洞引入和消除历史 有意思的是,Qualys研究人员很贴心地替我做了一步漏洞成因溯源,这才是单独提这个漏洞的原因。漏洞的引入是在2015年的一个commit中: 在GitHub中,定位到上述2015年的commit信息,这里commit的备注信息为: journald: do not strip leading whitespace from messages. Keep leading whitespace for compatibility with older syslog implementations. Also useful when piping formatted output to the logger command. Keep removing trailing whitespace. OK,看起来是一个兼容性调整,对记录信息不再跳过开头所有连续空白字符,只不过用strchr的简洁写法比较突出开发者精炼的开发风格(并不),说得过去。 之后在2018年八月的一个当时尚未推正式版的另一次commit中被修复了,先是还原成了ec5ff4那次commit之前的写法,然后改成了加校验的方式: 虽然Qualys研究者认为上述的修改是“无心插柳”的改动,但是在GitHub可以看到,a6aadf这次commit是因为有外部用户反馈了输入数据为单个冒号情况下journald堆溢出崩溃的issue,才由开发者有目的性地修复的;而之后在859510这个commit再次改动回来,理由是待记录的消息都是使用单个空格作为间隔符的,而上一个commit粗暴地去掉了这种协议兼容性特性。 如果没有以上纠结的修改和改回历史,也许我会倾向于怀疑,在最开始漏洞引入的那个commit,既然改动代码没有新增功能特性、没有解决什么问题(毕竟其后三年,这个改动的代码也没有被反映issue),也并非出于代码规范等考虑,那么这么轻描淡写的一次提交,难免有人为蓄意引入漏洞的嫌疑。当然,看到几次修复的原因,这种可能性就不大了,虽然大家仍可以保留意见。但是抛开是否人为这个因素,单纯从代码的漏洞成因看,一个传统但躲不开的问题仍值得探讨:API误用。 API误用:程序员何苦为难程序员 如果之前的章节给读者留下了我反对代码模块化和复用的印象,那么这里需要正名一下,我们认可这是当下开发实践不可避免的趋势,也增进了社会开发速度。而API的设计决定了写代码和用代码的双方“舒适度”的问题,由此而来的API误用问题,也是一直被当做单纯的软件工程课题讨论。在此方面个人并没有什么研究,自然也没办法系统地给出分类和学术方案,只是谈一下自己的经验和想法。 一篇比较新的学术文章总结了API误用的研究,其中一个独立章节专门分析Java密码学组件API误用的实际,当中引述之前论文认为,密码学API是非常容易被误用的,比如对期望输入数据(数据类型,数据来源,编码形式)要求的混淆,API的必需调用次序和依赖缺失(比如缺少或冗余多次调用了初始化函数、主动资源回收函数)等。凑巧在此方面我有一点体会:曾经因为业务方需要,需要使用C++对一个Java的密码基础中间件做移植。Java对密码学组件支持,有原生的JDK模块和权威的BouncyCastle包可用;而C/C++只能使用第三方库,考虑到系统平台最大兼容和最小代码量,使用Linux平台默认自带的OpenSSL的密码套件。但在开发过程中感受到了OpenSSL满满的恶意:其中的API设计不可谓不反人类,很多参数没有明确的说明(比如同样是表示长度的函数参数,可能在不同地方分别以字节/比特/分组数为计数单位);函数的线程安全没有任何解释标注,需要自行试验;不清楚函数执行之后,是其自行做了资源释放还是需要有另外API做gc,不知道资源释放操作时是否规规矩矩地先擦除后释放……此类问题不一而足,导致经过了漫长的测试之后,这份中间件才提供出来供使用。而在业务场景中,还会存在比如其它语言调用的情形,这些又暴露出来OpenSSL API误用的一些完全无从参考的问题。这一切都成为了噩梦;当然这无法为我自己开解是个不称职开发的指责,但仅就OpenSSL而言其API设计之恶劣也是始终被人诟病的问题,也是之后其他替代者宣称改进的地方。 当然,问题是上下游都脱不了干系的。我们自己作为高速迭代中的开发人员,对于二方、三方提供的中间件、API,又有多少人能自信地说自己仔细、认真地阅读过开发指南和API、规范说明呢?做过通用产品技术运营的朋友可能很容易理解,自己产品的直接用户日常抛出不看文档的愚蠢问题带来的困扰。对于密码学套件,这个问题还好办一些,毕竟如果在没有背景知识的情况下对API望文生义地一通调用,绝大多数情况下都会以抛异常形式告终;但还是有很多情况,API误用埋下的是长期隐患。 不是所有API误用情形最终都有机会发展成为可利用的安全漏洞,但作为一个由人的因素引入的风险,这将长期存在并困扰软件供应链(虽然对安全研究者、黑客与白帽子是很欣慰的事情)。可惜,传统的白盒代码扫描能力,基于对代码语义的理解和构建,但是涉及到API则需要预先的抽象,这一点目前似乎仍然是需要人工干预的事情;或者轻量级一点的方案,可以case by case地分析,为所有可能被误用的API建模并单独扫描,这自然也有很强局限性。在一个很底层可信的开发者还对C标准库API存在误用的现实内,我们需要更多的思考才能说接下来的解法。 Ⅴ. 从规则到陷阱:NASA JIRA误配置致信息泄露血案 软件的定义包括了代码组成的程序,以及相关的配置、文档等。当我们说软件的漏洞、风险时,往往只聚焦在其中的代码中;关于软件供应链安全风险,我们的比赛、前面分析的例子也都聚焦在了代码的问题;但是真正的威胁都来源于不可思议之处,那么代码之外有没有可能存在来源于上游的威胁呢?这里就借助实例来探讨一下,在“配置”当中可能栽倒的坑。 引子:发不到500英里以外的邮件? 让我们先从一个轻松愉快的小例子引入。这个例子初见于Linux中国的一篇译文。 简单说,作者描述了这么一个让人啼笑皆非的问题:单位的邮件服务器发送邮件,发送目标距离本地500英里范围之外的一律失败,邮件就像悠悠球一样只能飞出一定距离。这个问题本身让描述者感到尴尬,就像一个技术人员被老板问到“为什么从家里笔记本上Ctrl-C后不能在公司台式机上Ctrl-V”一样。 经过令人窒息的分析操作后,笔者定位到了问题原因:笔者作为负责的系统管理员,把SunOS默认安装的Senmail从老旧的版本5升级到了成熟的版本8,且对应于新版本诸多的新特性进行了对应配置,写入配置文件sendmail.cf;但第三方服务顾问在对单位系统进行打补丁升级维护时,将系统软件“升级”到了系统提供的最新版本,因此将Sendmail实际回退到了版本5,却为了软件行为一致性,原样保留了高版本使用的配置文件。但Sendmail并没有在大版本间保证配置文件兼容性,这导致很多版本5所需的配置项不存在于保留下来的sendmail.cf文件中,程序按默认值0处理;最终引起问题的就是,邮件服务器与接收端通信的超时时间配置项,当取默认配置值0时,邮件服务器在1个单位时间(约3毫秒)内没有收到网络回包即认为超时,而这3毫秒仅够电信号打来回飞出500英里。 这个“故事”可能会给技术人员一点警醒,错误的配置会导致预期之外的软件行为,但是配置如何会引入软件供应链方向的安全风险呢?这就引出了下一个重磅实例。 JIRA配置错误致NASA敏感信息泄露案例 我们都听过一个事情,马云在带队考察美国公司期间问Google CEO Larry Page自视谁为竞争对手,Larry的回答是NASA,因为最优秀的工程师都被NASA的梦想吸引过去了。由此我们显然能窥见NASA的技术水位之高,这样的人才团队大概至少是不会犯什么低级错误的。 但也许需要重新定义“低级错误”……1月11日一篇技术文章披露,NASA某官网部署使用的缺陷跟踪管理系统JIRA存在错误的配置,可分别泄漏内部员工(JIRA系统用户)的全部用户名和邮件地址,以及内部项目和团队名称到公众,如下: 问题的原因解释起来也非常简单:JIRA系统的过滤器和配置面板中,对于数据可见性的配置选项分别选定为All users和Everyone时,系统管理人员想当然地认为这意味着将数据对所有“系统用户”开放查看,但是JIRA的这两个选项的真实效果逆天,是面向“任意人”开放,即不限于系统登录用户,而是任何查看页面的人员。看到这里,我不厚道地笑了……“All users”并不意味着“All ‘users’”,意不意外,惊不惊喜? 但是这种字面上把戏,为什么没有引起NASA工程师的注意呢,难道这样逆天的配置项没有在产品手册文档中加粗标红提示吗?本着为JIRA产品设计找回尊严的态度,我深入挖掘了一下官方说明,果然在Atlassian官方的一份confluence文档(看起来更像是一份增补的FAQ)中找到了相关说明: 所有未登录访客访问时,系统默认认定他们是匿名anonymous用户,所以各种权限配置中的all users或anyone显然应该将匿名用户包括在内。在7.2及之后版本中,则提供了“所有登录用户”的选项。 可以说是非常严谨且贴心了。比较讽刺的是,在我们的软件供应链安全大赛·C源代码赛季期间,我们设计圈定的恶意代码攻击目标还包括JIRA相关的敏感信息的窃取,但是却想不到有这么简单方便的方式,不动一行代码就可以从JIRA中偷走数据。 软件的使用,你“配”吗? 无论是开放的代码还是成型的产品,我们在使用外部软件的时候,都是处于软件供应链下游的消费者角色,为了要充分理解上游开发和产品的真实细节意图,需要我们付出多大的努力才够“资格”? 上一章节我们讨论过源码使用中必要细节信息缺失造成的“API误用”问题,而软件配置上的“误用”问题则复杂多样得多。从可控程度上讨论,至少有这几种因素定义了这个问题: ·软件用户对必要配置的现有文档缺少了解。这是最简单的场景,但又是完全不可避免的,这一点上我们所有有开发、产品或运营角色经验的应该都曾经体会过向不管不顾用户答疑的痛苦,而所有软件使用者也可以反省一下对所有软件的使用是否都以完整细致的文档阅读作为上手的准备工作,所以不必多说。 ·软件拥有者对配置条目缺少必要明确说明文档。就JIRA的例子而言,将NASA工程师归为上一条错误有些冤枉,而将JIRA归为这条更加合适。在边角但重要问题上的说明通过社区而非官方文档形式发布是一种不负责任的做法,但未引发安全事件的情况下还有多少这样的问题被默默隐藏呢?我们没办法要求在使用软件之前所有用户将软件相关所有文档、社区问答实现全部覆盖。这个问题范围内一个代表性例子是对配置项的默认值以及对应效果的说明缺失。 ·配置文件版本兼容性带来的误配置和安全问题。实际上,上面的SunOS Sendmail案例足以点出这个问题的存在性,但是在真实场景下,很可能不会以这么戏剧性形式出现。在企业的系统运维中,系统的版本迭代常见,但为软件行为一致性,配置的跨版本迁移是不可避免的操作;而且软件的更新迭代也不只会由系统更新推动,还有大量出于业务性能要求而主动进行的定制化升级,对于中小企业基础设施建设似乎是一个没怎么被提及过的问题。 ·配置项组合冲突问题。尽管对于单个配置项可能明确行为与影响,但是特定的配置项搭配可能造成不可预知的效果。这完全有可能是由于开发者与用户在信息不对等的情况下产生:开发者认为用户应该具有必需的背景知识,做了用户应当具备规避配置冲突能力的假设。一个例子是,对称密码算法在使用ECB、CBC分组工作模式时,从密码算法上要求输入数据长度必须是分组大小的整倍数,但如果用户搭配配置了秘钥对数据不做补齐(nopadding),则引入了非确定性行为:如果密码算法库对这种组合配置按某种默认补齐方式操作数据则会引起歧义,但如果在算法库代码层面对这种组合抛出错误则直接影响业务。 ·程序对配置项处理过程的潜在暗箱操作。这区别于简单的未文档化配置项行为,仅特指可能存在的蓄意、恶意行为。从某种意义上,上述“All users”也可以认为是这样的一种陷阱,通过浅层次暗示,引导用户做出错误且可能引起问题的配置。另一种情况是特定配置组合情况下触发恶意代码的行为,这种触发条件将使恶意代码具有规避检测的能力,且在用户基数上具有一定概率的用户命中率。当然这种情况由官方开发者直接引入的可能性很低,但是在众包开发的情况下如果存在,那么扫描方案是很难检测的。 Ⅵ. 从逆流到暗流:恶意代码溯源后的挑战 如果说前面所说的种种威胁都是面向关键目标和核心系统应该思考的问题,那么最后要抛出一个会把所有人拉进赛场的理由。除了前面所有那些在软件供应链下游被动污染受害的情况,还有一种情形:你有迹可循的代码,也许在不经意间会“反哺”到黑色产业链甚至特殊武器中;而现在研究用于对程序进行分析和溯源的技术,则会让你陷入百口莫辩的境地。 案例:黑产代码模块溯源疑云 1月29日,猎豹安全团队发布技术分析通报文章《电信、百度客户端源码疑遭泄漏,驱魔家族窃取隐私再起波澜》,矛头直指黑产上游的恶意信息窃取代码模块,认定其代码与两方产品存在微妙的关联:中国电信旗下“桌面3D动态天气”等多款软件,以及百度旗下“百度杀毒”等软件(已不可访问)。 文章中举证有三个关键点。 首先最直观的,是三者使用了相同的特征字符串、私有文件路径、自定义内部数据字段格式; 其次,在关键代码位置,三者在二进制程序汇编代码层面具有高度相似性; 最终,在一定范围的非通用程序逻辑上,三者在经过反汇编后的代码语义上显示出明显的雷同,并提供了如下两图佐证(图片来源): 文章指出的涉事相关软件已经下线,对于上述样本文件的相似度试验暂不做复现,且无法求证存在相似、疑似同源的代码在三者中占比数据。对于上述指出的代码雷同现象,猎豹安全团队认为: 我们怀疑该病毒模块的作者通过某种渠道(比如“曾经就职”),掌握有中国电信旗下部分客户端/服务端源码,并加以改造用于制作窃取用户隐私的病毒,另外在该病毒模块的代码中,我们还发现“百度”旗下部分客户端的基础调试日志函数库代码痕迹,整个“驱魔”病毒家族疑点重重,其制作传播背景愈发扑朔迷离。 这样的推断,固然有过于直接的依据(例如三款代码中均使用含有“baidu”字样的特征注册表项);但更进一步地,需要注意到,三个样本在所指出的代码位置,具有直观可见的二进制汇编代码结构的相同,考虑到如果仅仅是恶意代码开发者先逆向另外两份代码后借鉴了代码逻辑,那么在面临反编译、代码上下文适配重构、跨编译器和选项的编译结果差异等诸多不确定环节,仍能保持二进制代码的雷同,似乎确实是只有从根本上的源代码泄漏(抄袭)且保持相同的开发编译环境才能成立。 但是我们却又无法做出更明确的推断。这一方面当然是出于严谨避免过度解读;而从另一方面考虑,黑产代码的一个关键出发点就是“隐藏自己”,而这里居然如此堂而皇之地照搬了代码,不但没有进行任何代码混淆、变形,甚至没有抹除疑似来源的关键字符串,如果将黑产视为智商在线的对手,那这里背后是否有其它考量,就值得琢磨了。 代码的比对、分析、溯源技术水准 上文中的安全团队基于大量样本和粗粒度比对方法,给出了一个初步的判断和疑点。那么是否有可能获得更确凿的分析结果,来证实或证伪同源猜想呢? 无论是源代码还是二进制,代码比对技术作为一种基础手段,在软件供应链安全分析上都注定仍然有效。在我们的软件供应链安全大赛期间,针对PE二进制程序类型的题目,参赛队伍就纷纷采用了相关技术手段用于目标分析,包括:同源性分析,用于判定与目标软件相似度最高的同软件官方版本;细粒度的差异分析,用于尝试在忽略编译差异和特意引入的混淆之外,定位特意引入的恶意代码位置。当然,作为比赛中针对性的应对方案,受目标和环境引导约束,这些方法证明了可行性,却难以保证集成有最新技术方案。那么做一下预言,在不计入情报辅助条件下,下一代的代码比对将能够到达什么水准? 这里结合近一年和今年内,已发表和未发表的学术领域顶级会议的相关文章来简单展望: ·针对海量甚至全量已知源码,将可以实现准确精细化的“作者归属”判定。在ACM CCS‘18会议上曾发表的一篇文章《Large-Scale and Language-Oblivious Code Authorship Identification》,描述了使用RNN进行大规模代码识别的方案,在圈定目标开发者,并预先提供每个开发者的5-7份已知的代码文件后,该技术方案可以很有效地识别大规模匿名代码仓库中隶属于每个开发者的代码:针对1600个Google Code Jam开发者8年间的所有代码可以实现96%的成功识别率,而针对745个C代码开发者于1987年之后在GitHub上面的全部公开代码仓库,识别率也高达94.38%。这样的结果在当下的场景中,已经足以实现对特定人的代码识别和跟踪(例如,考虑到特定开发人员可能由于编码习惯和规范意识,在时间和项目跨度上犯同样的错误);可以预见,在该技术方向上,完全可以期望摆脱特定已知目标人的现有数据集学习的过程,并实现更细粒度的归属分析,例如代码段、代码行、提交历史。 ·针对二进制代码,更准确、更大规模、更快速的代码主程序分析和同源性匹配。近年来作为一项程序分析基础技术研究,二进制代码相似性分析又重新获得了学术界和工业界的关注。在2018年和2019(已录用)的安全领域四大顶级会议上,每次都会有该方向最新成果的展示,如S&P‘2019上录用的《Asm2Vec: Boosting Static Representation Robustness for Binary Clone Search against Code Obfuscation and Compiler Optimization》,实现无先验知识的条件下的最优汇编代码级别克隆检测,针对漏洞库的漏洞代码检测可实现0误报、100%召回。而2018年北京HITB会议上,Google Project Zero成员、二进制比对工具BinDiff原始作者Thomas Dullien,探讨了他借用改造Google自家SimHash算法思想,用于针对二进制代码控制流图做相似性检测的尝试和阶段结果;这种引入规模数据处理的思路,也可期望能够在目前其他技术方案大多精细化而低效的情况下,为高效、快速、大规模甚至全量代码克隆检测勾出未来方案。 ·代码比对方案对编辑、优化、变形、混淆的对抗。近年所有技术方案都以对代码“变种”的检测有效性作为关键衡量标准,并一定程度上予以保证。上文CCS‘18论文工作,针对典型源代码混淆(如Tigress)处理后的代码,大规模数据集上可有93.42%的准确识别率;S&P‘19论文针对跨编译器和编译选项、业界常用的OLLVM编译时混淆方案进行试验,在全部可用的混淆方案保护之下的代码仍然可以完成81%以上的克隆检测。值得注意的是以上方案都并非针对特定混淆方案单独优化的,方法具有通用价值;而除此以外还有很多针对性的的反混淆研究成果可用;因此,可以认为在采用常规商用代码混淆方案下,即便存在隐藏内部业务逻辑不被逆向的能力,但仍然可以被有效定位代码复用和开发者自然人。 代码溯源技术面前的“挑战” 作为软件供应链安全的独立分析方,健壮的代码比对技术是决定性的基石;而当脑洞大开,考虑到行业的发展,也许以下两种假设的情景,将把每一个“正当”的产品、开发者置于尴尬的境地。 代码仿制 在本章节引述的“驱魔家族”代码疑云案例中,黑产方面通过某种方式获得了正常代码中,功能逻辑可以被自身复用的片段,并以某种方法将其在保持原样的情况下拼接形成了恶意程序。即便在此例中并非如此,但这却暴露了隐忧:将来是不是有这种可能,我的正常代码被泄漏或逆向后出现在恶意软件中,被溯源后扣上黑锅? 这种担忧可能以多种渠道和形式成为现实。 从上游看,内部源码被人为泄漏是最简单的形式(实际上,考虑到代码的完整生命周期似乎并没有作为企业核心数据资产得到保护,目前实质上有没有这样的代码在野泄漏还是个未知数),而通过程序逆向还原代码逻辑也在一定程度上可获取原始代码关键特征。 从下游看,则可能有多种方式将恶意代码伪造得像正常代码并实现“碰瓷”。最简单地,可以大量复用关键代码特征(如字符串,自定义数据结构,关键分支条件,数据记录和交换私有格式等)。考虑到在进行溯源时,分析者实际上不需要100%的匹配度才会怀疑,因此仅仅是仿造原始程序对于第三方公开库代码的特殊定制改动,也足以将公众的疑点转移。而近年来类似自动补丁代码搜索生成的方案也可能被用来在一份最终代码中包含有二方甚至多方原始代码的特征和片段。 基于开发者溯源的定点渗透 既然在未来可能存在准确将代码与自然人对应的技术,那么这种技术也完全可能被黑色产业利用。可能的忧患包括强针对性的社会工程,结合特定开发者历史代码缺陷的漏洞挖掘利用,联动第三方泄漏人员信息的深层渗透,等等。这方面暂不做联想展开。 〇. 没有总结 作为一场旨在定义“软件供应链安全”威胁的宣言,阿里安全“功守道”大赛将在后续给出详细的分解和总结,其意义价值也许会在一段时间之后才能被挖掘。 但是威胁的现状不容乐观,威胁的发展不会静待;这一篇随笔仅仅挑选六个侧面做摘录分析,可即将到来的趋势一定只会进入更加发散的境地,因此这里,没有总结。 本篇文章为转载内容。原文链接:https://blog.csdn.net/systemino/article/details/90114743。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-02-05 13:33:43
300
转载
MySQL
在进行MySQL数据迁移或导入导出操作时,除了上述基本步骤外,了解一些进阶技巧和最新动态将有助于提升工作效率和确保数据安全。近期,MySQL 8.0版本推出了一系列改进,例如增强的并行复制功能,能够显著加快大规模数据迁移的速度。同时,MySQL团队也优化了mysqldump工具,支持更多参数选项以适应不同场景需求,如--single-transaction参数可在保证数据一致性的同时进行在线备份。 此外,在处理敏感信息时,MySQL企业版提供了加密功能,可以对导出的数据文件进行加密处理,保障数据在传输过程中的安全性。而对于数据库表结构复杂、数据量庞大的情况,采用分批次导入或者利用中间过渡表的方式可有效避免内存溢出等问题。 值得注意的是,随着云服务的普及,许多云服务商(如AWS RDS、阿里云RDS等)提供了便捷的数据迁移服务,用户可以直接通过控制台界面完成MySQL数据库之间的迁移任务,极大简化了操作流程,并具备良好的容灾备份能力。 深入解读方面,对于那些需要频繁进行数据库同步的企业来说,熟悉并掌握Percona Toolkit、pt-online-schema-change等第三方工具也是必不可少的,它们能够在不影响业务的情况下实现在线修改表结构和数据迁移。 综上所述,MySQL数据导入导出是一个涉及广泛且不断演进的话题,结合最新技术发展与最佳实践,不仅可以提高日常运维效率,还能更好地应对各类复杂的数据库管理挑战。
2023-02-12 10:44:09
70
数据库专家
MySQL
随着数据库安全性的日益重要,MySQL用户账号和密码的管理方式也在不断进化。在最新版本中,MySQL采用更高级别的加密算法存储用户密码,如SHA256等,确保即使数据库被非法获取,密码也不会轻易泄露。此外,为了进一步加强安全性,MySQL 8.0引入了 caching_sha2_password 身份验证插件作为默认的身份验证方法,提供了一种更加安全且高效的密码认证机制。 近期,针对MySQL数据库的安全事件频发,各大云服务商和企业纷纷升级自家数据库系统的安全防护措施。例如,某知名云服务商就推出了数据库审计服务,可以实时记录并分析MySQL用户的登录行为、查询操作等,一旦发现异常,立即告警,从而有效防止恶意查看或篡改数据的行为。 另外,在日常运维中,管理员应遵循最小权限原则,为每个MySQL用户分配仅满足其工作需求的最低权限,并定期更新密码策略,包括强制密码复杂度、设置定期更换密码等措施。同时,利用SSL/TLS加密技术保护MySQL客户端与服务器之间的通信,也是防止中间人攻击、保障密码传输安全的重要手段。 对于忘记MySQL密码的情况,除了上述提到的通过命令行工具以具有足够权限的用户重置密码外,还可以借助第三方MySQL管理工具,如phpMyAdmin、Navicat等,它们通常提供了更为直观的操作界面来处理这类问题,大大降低了数据库管理的门槛。 综上所述,MySQL账号和密码的管理不仅涉及到查询和重置这些基本操作,更涵盖了数据库访问控制、密码加密存储、安全审计等多个层面,需要结合最新的安全技术和最佳实践,以实现对MySQL数据库的有效安全管理。
2024-01-21 10:37:36
52
算法侠
MySQL
...何在MySQL中写入数据后,我们可以进一步关注数据库管理系统的最新动态和最佳实践。近日,MySQL 8.0版本引入了一系列重大更新,包括对安全性、性能以及SQL语法的改进。例如,新的窗口函数提供了更强大的数据分析能力,而Caching_sha2_password身份验证插件则增强了数据库连接的安全性。 同时,随着云技术的发展,各大云服务商如阿里云、AWS等纷纷推出MySQL托管服务,用户无需关心底层服务器运维,即可轻松实现高可用性和扩展性。对于开发人员来说,了解如何在云环境下高效地进行数据写入操作,比如利用批量插入API减少网络延迟,或者通过参数化查询防止SQL注入攻击,成为了必不可少的知识点。 此外,关于数据库优化策略,一篇来自Oracle官方博客的文章《Maximizing MySQL Performance: Tips from the Experts》深度解读了如何通过索引设计、查询优化以及合理使用存储引擎等手段提升MySQL的数据写入效率。文中引用了大量实战案例,为数据库管理员和开发者提供了宝贵的参考经验。 综上所述,在掌握基本的MySQL数据写入操作之外,紧跟数据库技术发展的步伐,关注安全增强、云服务特性及性能优化技巧,是现代开发者必备的技能升级路径。
2023-06-05 22:29:31
72
算法侠
MySQL
...最近登录情况后,对于数据库安全与管理的实际应用有着更深入的需求。近日,随着数字化转型的加速推进,数据库安全问题愈发凸显。2022年5月,某知名电商平台就因数据库未妥善管理权限,导致大量用户数据泄露,引发了社会广泛关注和对数据库安全管理实践的深度反思。 为了提升MySQL数据库的安全性,除了基本的登录验证外,可考虑采用多因素认证(MFA)、定期更换密码策略、审计日志监控等措施。例如,MySQL 8.0版本引入了更加灵活的身份验证插件系统,支持如PAM(Pluggable Authentication Modules)和LDAP(Lightweight Directory Access Protocol)等高级身份验证机制,以增强账户安全性。 此外,实时监控数据库用户的活动也至关重要。可以配置MySQL的Audit Plugin功能来记录所有关键操作,以便及时发现异常登录行为或其他潜在安全威胁。同时,应遵循最小权限原则分配用户权限,确保每个用户只能访问完成其工作所需的数据。 进一步地,为防止未经授权的访问尝试,可利用防火墙规则限制特定IP或网络段对MySQL服务器的访问,并定期进行安全漏洞扫描及补丁更新,以抵御已知的安全风险。 总之,在实际运维过程中,对MySQL登录信息的精细化管理只是数据库安全链条中的一环。通过结合前沿技术手段与严格的管理制度,才能构建起坚实的数据安全保障体系,有效防范数据泄露等安全事件的发生。
2024-01-18 17:26:02
133
码农
MySQL
...深入了解了MySQL数据库中表基本信息的基础操作后,进一步掌握更高级的SQL查询语句和优化策略将有助于提升数据管理与分析效率。近期,MySQL 8.0版本推出了一系列新特性,如窗口函数、JSON字段支持全文检索等,使得复杂查询与大数据处理更为便捷(来源:MySQL官网,2022年更新公告)。同时,随着云服务的普及,AWS RDS for MySQL、阿里云RDS等托管数据库服务提供了自动备份、性能监控、一键扩展等功能,极大地简化了MySQL的运维工作。 此外,对于表结构设计及索引优化的理解至关重要。一篇来自DBA Stack Exchange社区的热门讨论帖(发布日期:2022年5月)深入剖析了如何根据业务场景合理设计表关系,以及何时应创建唯一索引、复合索引以提高查询性能。而一篇发表于InfoQ的技术文章《MySQL性能调优实战》则从实战角度出发,详细解读了如何通过EXPLAIN分析查询执行计划、利用慢查询日志定位瓶颈,并结合实例探讨了分区表、分库分表策略在高并发场景下的应用。 综上所述,无论是紧跟MySQL最新技术动态,还是深化对数据库内部机制和性能优化的理解,都将为您的数据库管理工作带来显著提升。持续学习并实践这些进阶知识,能够帮助您更好地应对日益增长的数据管理和分析挑战。
2023-08-18 09:15:20
63
算法侠
MySQL
...接后,进一步深入探讨数据库安全与远程访问优化至关重要。近日,随着云计算和分布式应用的普及,MySQL数据库远程管理的需求日益增加,但同时也带来了更严峻的安全挑战。据2022年的一份网络安全报告指出,针对数据库系统的未授权访问攻击事件增长了近30%,其中大量案例源于弱口令或不当的远程访问设置。 为强化MySQL远程连接安全性,建议关注以下几个方面: 1. 强化身份验证机制:采用双因素认证或多因素认证,避免仅依赖用户名和密码;启用MySQL的SSL加密连接功能,确保数据传输过程中的安全性。 2. 权限最小化原则:遵循“按需分配”的权限策略,只给每个用户提供完成其工作所需的最低权限,减少潜在的安全风险。 3. 定期审计与更新:定期审查MySQL用户表中的远程访问权限设置,及时移除不再需要的远程访问账号;同时保持MySQL服务器及其插件的版本更新,利用最新安全补丁修复已知漏洞。 4. 配合防火墙规则:在服务器层面,结合IPtables或其他防火墙工具精细控制对MySQL服务端口(默认3306)的访问,只允许特定可信IP地址进行远程连接。 5. 利用专门的数据库访问代理服务:对于大型企业或高安全需求场景,可考虑部署数据库访问代理服务,如Amazon RDS Proxy、Azure Database for MySQL Flexible Server等,它们提供了细粒度的访问控制、负载均衡及日志审计等功能,有助于提升远程访问MySQL数据库的整体安全性。 总之,在实现MySQL数据库远程访问便利性的同时,务必重视并实施严格的安全措施,以确保数据库资源不被恶意利用,有效保障企业信息资产的安全。
2023-12-17 16:15:36
63
数据库专家
ClickHouse
...use这样高效实时的数据分析工具中,列的自动增长错误只是众多可能遇到的问题之一。随着技术的发展与应用实践的深化,ClickHouse社区和开发团队对这类问题的理解与解决策略也在不断演进和完善。 近期,ClickHouse 21.3版本推出了一项新特性——序列(Sequences),用户可以通过创建序列来为表中的自增列提供更为灵活和可控的自动填充机制。序列可以独立于表存在,并支持复杂的步长、初始值以及循环等属性设置,极大地增强了对于自增数据管理的便利性,从而有效地避免了因忘记指定自增列值而导致的插入错误。 此外,在数据分析场景下,确保数据完整性和一致性的重要性不言而喻。为此,ClickHouse提供了诸如CHECK约束、TTL过期删除机制等功能,帮助用户在数据入库阶段进行有效校验,同时实现对存储数据的有效生命周期管理,进一步提升数据质量及查询效率。 实践中,深入理解和掌握ClickHouse的设计理念和操作技巧,结合具体的业务场景合理配置与使用其功能特性,是提高数据分析准确度和工作效率的关键所在。建议用户密切关注官方文档更新和技术博客,以便及时获取最新的最佳实践和解决方案,将ClickHouse的优势发挥到极致。
2023-07-20 08:25:08
553
林中小径-t
MySQL
在当今的数字化时代,数据库安全日益成为企业和个人关注的重点,MySQL作为广泛应用的关系型数据库管理系统,在全球范围内承载着海量数据的安全存储与高效管理。近期,随着GDPR等数据保护法规的出台和实施,对于数据库密码安全管理提出了更为严格的要求。例如,MySQL 8.0版本以后已经不再以明文形式存储用户密码,而是采用更加安全的插件式身份验证方法,如caching_sha2_password,以增强密码安全性。 此外,为了应对潜在的密码遗忘或泄露问题,除了上述文章中提到的方法外,还可以利用现代化的身份验证工具,如LDAP、PAM(可插拔认证模块)集成进行统一身份验证管理,从而实现更高级别的密码策略和访问控制。同时,强烈建议定期更换MySQL密码,并启用二步验证机制以提高账户安全性。 最近的安全报告显示,针对数据库系统的攻击事件频发,其中不乏因弱口令、未更新补丁等原因导致的数据泄露。因此,无论是在查看还是重置MySQL密码的过程中,都必须遵循严格的权限管理和操作流程,确保在整个过程中数据的保密性和完整性得到保障。同时,运维人员也应持续关注MySQL官方的安全公告和技术文档,及时了解并修复可能存在的安全漏洞,全面提升MySQL数据库系统的安全保障能力。
2024-02-18 15:42:33
121
码农
MySQL
随着云计算和大数据时代的来临,MySQL服务的应用场景不断拓宽,其在企业级数据处理、网站后端开发以及移动应用数据存储等方面扮演着至关重要的角色。近期,MySQL 8.0版本的发布更是引起了业界广泛关注,新版本不仅提升了查询性能,还强化了安全性,如支持窗口函数、JSON功能增强等,进一步满足现代应用程序复杂多样的需求。 在全球范围内,许多大型互联网公司如Facebook、Twitter等都在其技术栈中大量使用MySQL作为核心数据库。例如,Facebook推出了开源的MySQL分支——RocksDB,专门针对大规模、高写入负载场景进行优化。此外,阿里云也提供了基于MySQL的高度兼容、安全稳定的云数据库服务,助力企业在云端实现灵活高效的数据管理。 值得关注的是,随着容器化和Kubernetes等云原生技术的发展,MySQL服务的部署与运维模式也在发生深刻变革。用户可以通过Docker容器快速搭建MySQL服务,并借助Kubernetes进行自动化部署和资源调度,从而提升服务可用性和可扩展性。 综上所述,在当前的技术浪潮下,MySQL服务持续演进升级,正以更加强大且灵活的姿态服务于各行各业的数据存储与管理需求。对于开发者和IT专业人员来说,紧跟MySQL最新发展动态和技术实践,无疑将有助于提升自身在数据架构设计和应用开发领域的竞争力。
2023-04-15 17:10:20
127
键盘勇士
MySQL
在成功将MySQL数据库部署到Linux服务器并进行初步配置后,进一步提升数据库管理与安全性能是至关重要的。近期,MySQL官方发布了8.0版本的重要更新,引入了诸多改进和新特性,例如增强的窗口函数、JSON支持的增强以及性能优化等,这为开发者提供了更高效便捷的数据处理工具(来源:MySQL官方网站,2022年发布)。同时,对于云端数据库的安全防护,云服务商如AWS、阿里云等也相继推出了针对MySQL数据库的安全策略和最佳实践指南,指导用户如何通过网络ACL、SSL加密连接、定期审计与备份等方式强化数据库安全(参考:AWS Security Blog, 阿里云最佳实践)。 此外,深入理解MySQL权限系统及其实战应用亦是每个数据库管理员的必修课。在实际操作中,精细化权限管理能有效防止数据泄露和恶意篡改,推荐阅读《MySQL 5.7 Reference Manual》中的“Account Management and Privileges”章节,该部分详细解读了MySQL的用户账户管理、权限分配及验证机制。 另外,随着DevOps理念的普及,自动化运维工具如Ansible和Chef被越来越多地应用于MySQL数据库的部署和维护。通过编写Playbook或Cookbook脚本,可以实现MySQL集群的快速搭建和动态扩容,以及日常备份恢复任务的自动化执行,这对于大规模云端数据库环境的运维管理工作具有重大意义(参阅:Ansible官方文档,Chef Cookbooks示例)。 总之,在安装配置MySQL作为云端数据库之后,关注其最新版本特性、加强安全措施、深入理解权限体系,并利用自动化运维工具提高效率,都是保障数据库稳定运行、发挥其最大价值的关键所在。
2023-10-24 11:08:12
58
逻辑鬼才
DorisDB
数据一致性 , 数据一致性是指在分布式系统或数据库中,所有用户和组件看到的数据状态都是一致的,无论他们在何时何地进行读取操作,都能得到最新的、经过正确更新的结果。在本文上下文中,当数据文件发生冲突时,若不采取措施保证数据一致性,可能会导致同一份数据出现多个版本,进而影响到数据分析结果的准确性。 唯一索引 , 唯一索引是数据库表中的一种特殊类型的索引,用于确保指定列(字段)中的数据项具有唯一性,即不允许有重复值。在DorisDB中,通过为某个字段设置唯一索引(如示例中的my_field),可以有效防止数据文件因存储相同数据而产生的冗余问题,从而保障数据的一致性和完整性。 事务 , 在数据库领域,事务是一个包含一系列操作的执行单元,这些操作要么全部成功,要么全部失败,以保证数据的完整性和一致性。在处理数据文件冲突时,DorisDB利用事务功能,能够对多条更新操作进行统一管理和控制。例如,在文章中的示例代码中,使用了“begin”开始一个事务,然后进行数据更新操作,最后用“commit”提交事务,确保在并发环境下对同一数据进行修改时,仍能维持数据的一致性,避免因并发操作引发的数据混乱。
2023-03-25 12:27:57
560
雪落无痕-t
转载文章
...站开发中与MySQL数据库交互时,尤其是文件上传等复杂操作,可能会遇到因MySQL严格模式引发的各种错误。本文所讨论的“SQLSTATE[HY000]: General error: 1364 Field 'xxxxx' doesn't have a default value”就是一个典型例子。为了解决这类问题,开发者需深入理解MySQL的sql-mode配置及其对数据验证的影响。 近期,随着MySQL 8.0版本的广泛使用,数据库的严格性设置得到了进一步强化,这要求开发者更加关注表结构设计和SQL语句编写规范。例如,MySQL官方文档建议,在迁移到新版本前应审查现有的sql-mode设置,并根据业务需求进行适当调整(参见:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html)。 另外,考虑到数据一致性及安全性,尽管放宽严格模式可以解决部分插入异常,但并不意味着完全摒弃严格模式的优点。实际上,诸如STRICT_TRANS_TABLES等严格模式选项有助于提前发现潜在的数据问题,防止脏数据入库。因此,在实际项目中,应当权衡灵活性与数据完整性,选择最合适的sql-mode组合。 此外,为了更好地应对因MySQL严格模式引起的问题,开发人员还应该熟悉并掌握错误日志分析、事务控制、以及利用触发器、存储过程等手段确保数据完整性。同时,结合具体业务场景,通过合理的表结构设计(如设置默认值或允许字段为空),可以从根本上避免类似问题的发生。 综上所述,深入理解MySQL的运行模式并合理配置sql-mode参数对于优化数据库性能、保证数据安全性和完整性至关重要。同时,结合最新的MySQL版本特性与最佳实践,可有效预防和解决在网站开发过程中可能遇到的相关问题。
2023-12-02 23:16:25
289
转载
Mongo
在实际开发与运维过程中,MongoDB的批量操作能力对提升系统性能与效率至关重要。近期,MongoDB 5.0版本对其批量插入和更新功能进行了进一步优化。例如,新增了“Bulk Write Operations”功能,它允许开发者一次性执行多个写入操作,并能更好地处理错误与回滚,使得大规模数据处理更为高效且安全。 另外,针对大数据场景下的内存限制问题,MongoDB引入了更灵活的分片技术(Sharding),通过水平分割数据来分散存储压力,从而支持TB甚至PB级别的数据存储及高效查询。同时,MongoDB还提供了Change Streams功能,实时监控数据库变更事件,使得批量更新策略能够根据实时业务需求做出动态调整。 值得注意的是,在进行批量操作时,尤其是批量更新,应遵循严谨的数据管理原则,结合具体的业务逻辑,利用好索引优化和条件筛选以确保数据更新的准确性。此外,随着MongoDB Atlas云服务的成熟,用户可以通过其自动化的规模伸缩和优化工具,更加便捷地管理和优化包括批量操作在内的各类数据库任务,进一步释放NoSQL数据库的潜力。 综上所述,深入理解和掌握MongoDB的批量插入与更新机制,并结合最新技术和最佳实践,有助于我们在应对大规模、高并发数据处理挑战时游刃有余,实现系统性能和可靠性的双重提升。
2023-09-16 14:14:15
146
心灵驿站-t
Apache Atlas
...ache Atlas数据迁移这类问题时,除了文中提到的深入分析错误原因与采取相应解决措施外,实时关注官方社区动态和最新版本更新日志也是至关重要的。近期,Apache Atlas项目团队发布了一篇关于其3.0版本升级的重要通告,特别提到了新版本对数据模型和存储后端进行了优化改进,并详细列出了可能影响数据迁移的具体变更点。 例如,在新版中增强了元数据实体间关系管理的功能,用户需要在迁移前确保旧版关系数据符合新版的数据结构要求。此外,还引入了更为严格的权限管理和审计功能,这意味着在迁移过程中需同步调整权限配置以适应新的安全策略。 对于遇到类似问题的用户来说,除了参考本文所阐述的解决方案,建议参阅Apache Atlas官方文档及社区论坛中的案例讨论,及时获取最新的迁移工具和技术指导,以便更高效地完成数据迁移任务并最大限度减少潜在风险。同时,亦可学习业界专家针对数据迁移最佳实践的深度解读文章,结合自身项目特点,制定出更为科学、严谨的数据迁移方案。
2023-11-27 10:58:16
271
人生如戏-t
PostgreSQL
在数据库管理与开发过程中,理解并妥善处理数据类型转换异常至关重要。近期,PostgreSQL官方发布了新的版本更新,进一步增强了对复杂数据类型转换的支持,并优化了错误提示机制,使得用户在遇到InvalidColumnTypeCastError这类问题时能够更快定位和修复。例如,新版本的to_char()和to_numeric()函数在进行数据类型转换时,提供了更灵活且严谨的参数校验,有助于减少因误操作导致的数据类型不匹配错误。 此外,在实际应用中,为避免InvalidColumnTypeCastError等类似问题的发生,开发者不仅需要熟悉数据库系统提供的转换工具与方法,还要强化对业务逻辑的理解,确保数据模型设计合理。近期,一篇发表在《ACM Transactions on Database Systems》的研究文章深入探讨了数据类型转换中的潜在陷阱与最佳实践,通过对大量实例分析,作者强调了在设计阶段充分考虑数据完整性和一致性的重要性,并提倡在编程实践中采用防御性编程策略以应对未知的数据类型转换异常。 与此同时,随着大数据和云计算技术的发展,跨平台、多环境下的数据迁移与同步也日益频繁,这也对数据类型的兼容性及转换机制提出了更高要求。因此,无论是数据库管理员还是软件开发者,都需要紧跟技术潮流,不断学习和完善自身的数据库知识体系,从而有效预防和解决由数据类型转换引发的各种问题。
2023-08-30 08:38:59
296
草原牧歌-t
Nacos
...。 对于广大开发者和运维人员而言,持续关注Nacos的官方文档和社区动态,及时了解最新的技术进展和最佳实践,将有助于更好地应对生产环境中可能出现的各种挑战。同时,合理规划和设计系统的架构,定期进行压力测试和性能调优,也是保障系统稳定运行的重要措施。
2025-03-01 16:05:37
68
月影清风
c#
...r对象来封装待插入的数据,并与数据库字段相对应,从而实现安全、类型匹配的数据插入。 参数化查询 , 参数化查询是一种编程技术,允许开发者预定义SQL语句结构并在运行时动态地提供值(作为参数)。相比直接拼接字符串形成SQL命令,参数化查询能显著提升安全性,因为它可以阻止恶意用户通过输入构造可能改变原SQL语义的字符串,进而避免SQL注入攻击。在文章中,作者提倡始终使用参数化查询以保障数据插入操作的安全性。 事务管理 , 事务管理是数据库系统中的核心概念,它确保一组数据库操作要么全部成功完成(提交),要么全部不执行(回滚)。在处理批量插入或其他需要保持数据一致性的情景时,利用事务机制可以保证即使在部分操作失败的情况下,也能恢复到事务开始前的状态,维持数据库的一致性和完整性。在本文示例中,通过SqlTransaction对象启动并管理事务,在循环插入多个学生记录的过程中,如果所有插入操作都成功,则提交事务;否则,在发生异常时进行回滚,以保护数据库不受破坏性影响。
2023-09-06 17:36:13
507
山涧溪流_
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
pgrep process_pattern
- 根据进程名模式搜索进程ID。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"