اعتبارنامههای gNSI — چرخش خودکار اعتبارنامههای SSH در Cisco IOS XR
چالش
Certz مدیریت TLS را برای صفحه مدیریت gRPC بر عهده دارد، اما اکثر تجهیزات شبکه دارای دسترسی SSH نیز هستند — کنسول، VTY و عیبیابی تعاملی. چرخش اعتبارنامههای SSH (گذرواژهها، کلیدهای مجاز، کلیدهای میزبان، گواهیها) بهطور سنتی به معنای ویرایش دستی فایلها، ارسال پیکربندیها یا استفاده از CLIهای اختصاصی هر پلتفرم است. هیچ API استانداردی برای چرخش متریال SSH در میان فروشندگان مختلف وجود ندارد، هیچ قابلیت بازگشت (Rollback) داخلی در صورت بروز خطا در دسترس نیست و هیچ راهی برای محدود کردن برنامهنویسیشده روشهای احراز هویت (Authentication) که سرور SSH اجازه میدهد، وجود ندارد. اگر چرخش کلید میزبان (Host Key) با شکست مواجه شود، اپراتورها با خطر مسدود شدن دسترسی خود مواجه میشوند. مدیریت TLS را برای صفحه مدیریت (Management Plane) در gRPC بر عهده دارد، اما اکثر تجهیزات شبکه از دسترسی SSH نیز برخوردارند؛ شامل کنسول، VTY و عیبیابی تعاملی. چرخش اعتبارنامههای SSH (شامل گذرواژهها، کلیدهای مجاز، کلیدهای میزبان و گواهیها) بهطور سنتی به معنای ویرایش دستی فایلها، ارسال پیکربندی (Config Push) یا استفاده از رابطهای خط فرمان (CLI) مختص هر پلتفرم است. هیچ API استانداردی برای چرخش متریال SSH در میان فروشندگان مختلف وجود ندارد، قابلیت بازگشت به تنظیمات قبلی (Rollback) در صورت بروز خطا تعبیه نشده است و راهی برای محدودسازی برنامهنویسیشدهی روشهای احراز هویت (Authentication) که سرور SSH مجاز میداند، وجود ندارد. اگر چرخش کلید میزبان (Host Key) با شکست مواجه شود، اپراتورها با خطر مسدود شدن دسترسی خود به دستگاه مواجه میشوند.
Credentialz چیست؟
اعتبارنامههای gNSI این مشکل را با دو RPC جریانی حل میکند که پوشش میدهندسطح حساب کاربری (account-level)وسطح میزبان (host-level)اعتبارنامههای SSH:
- چرخش اعتبارنامههای حساب (RotateAccountCredentials)— چرخش گذرواژهها (Passwords)، کلیدهای مجاز (Authorized Keys) و اصول مجاز (Authorized Principals) برای حسابهای کاربری
- چرخش پارامترهای میزبان (RotateHostParameters)— چرخش کلیدهای میزبان (Host Keys)، گواهیهای میزبان (Host Certificates)، کلیدهای عمومی مرجع صدور گواهی (CA Public Keys)، روشهای احراز هویت مجاز و تنظیمات دستور اصول مجاز (AuthorizedPrincipalsCommand)
به علاوه دو RPC یکتایی (Unary) برای پیشپرواز (Preflight):
- CanGenerateKey— بررسی اینکه آیا دستگاه میتواند یک جفت کلید (Key Pair) تولید کند
- GetPublicKeys— بازیابی کلیدهای عمومی (Public Keys) فعلی از میزبان (Host)
هر دو RPC استریمینگ (Streaming RPCs) از الگوی مرحلهبندی-اعتبارسنجی-نهاییسازی (stage-validate-finalize) مشابه Certz Rotate پیروی میکنند: ارسال متریال جدید، اعتبارسنجی عملکرد آن (بهعنوان مثال، تست SSH با کلید جدید) و سپس نهاییسازی. برای بازگشت به حالت قبل (Rollback)، استریم را پیش از نهاییسازی لغو کنید.
Cisco IOS XR از Credentialz پشتیبانی میکند24.2.1به جلو. در این مقاله، تمامی دستورات بر روی NCS-540 نسخه 25.3.1 اعتبارسنجی شدهاند. قرارداد OpenConfig عبارت است از credentialz.proto.
در چارچوب AAA، بخش Credentialz به عنواناحراز هویت (Authentication)برای SSH عمل میکند؛ این بخش کلیدهای میزبان (Host keys)، کلیدهای مجاز (Authorized keys) و رمزهای عبور حساب کاربری که دسترسی ورود به SSH را کنترل میکنند، مدیریت مینماید. (بخش همتای آن یعنی Certz نقش مشابهی را برای صفحه gRPC ایفا میکند.) در هر لحظه تنهایکفراخوانی رویه از راه دور (RPC) مربوط به Credentialz میتواند در حال اجرا باشد.
چهار RPC
| RPC | نوع | عملکرد |
|---|---|---|
| RotateAccountCredentials | جریان دوطرفه (Bidirectional stream) | چرخش رمزهای عبور (Passwords)، کلیدهای مجاز (Authorized Keys) و اصول مجاز (Authorized Principals) برای حسابهای کاربری. برای اعمال نهایی از Finalize و برای بازگشت به حالت قبل از Rollback استفاده کنید. |
| RotateHostParameters | جریان دوطرفه (Bidirectional stream) | چرخش کلیدهای میزبان (Host Keys) (خارجی یا تولید شده)، گواهیهای میزبان (Host Certificates)، کلیدهای عمومی CA، انواع احراز هویت مجاز و دستور اصول مجاز (AuthorizedPrincipalsCommand). برای اعمال نهایی از Finalize و برای بازگشت به حالت قبل از Rollback استفاده کنید. |
| CanGenerateKey | تکمقداری (Unary) | بررسی اینکه آیا دستگاه میتواند یک جفتکلید (Key Pair) برای الگوریتم مشخص شده (RSA 2048/4096, ECDSA P-256/P-521, Ed25519) تولید کند یا خیر. |
| GetPublicKeys | تکمقداری (Unary) | بازیابی کلیدهای عمومی (Public Keys) پیکربندی شده فعلی روی میزبان. |
الگوریتمهای کلیدی پشتیبانیشده (مستندات Cisco)
| الگوریتم (Algorithm) | انواع کلید (Key types) |
|---|---|
| RSA | 2048, 4096 |
| ECDSA | P-256, P-521 |
| Ed25519 | — |
OpenConfig
KeyGenenum همچنین تعریف میکندKEY_GEN_SSH_KEY_TYPE_RSA_3072وKEY_GEN_SSH_KEY_TYPE_ECDSA_P_384. در نسخه IOS XR 25.3.1 (NCS-540)، دستگاهرد میکندهر دو را باکد: InvalidArgument، پیامCan Generate Key:Invaid KeyGen input(غلط تایپی در دستگاه). محدود کردن به پنج الگوریتم فوق الزامی است.
پشتیبانی از IOS XR
| نسخه | تغییرات |
|---|---|
| 24.2.1 | قابلیتهای Credentialz معرفی شدند — RotateAccountCredentials، RotateHostParameters، CanGenerateKey، GetPublicKeys. چرخش (Rotation) اعتبارنامههای SSH حساب کاربری و میزبان. |
| 24.2.11 | بهبود چرخش (Rotation) بلادرنگ (بدون نیاز به راهاندازی مجدد)، بهروزرسانیهای اختصاصی برای حساب کاربری و میزبان. |
پیشنیازها:
- پیکربندی یک حساب کاربری روی روتر
- پیکربندی نسخه 2 پروتکل SSH
مرجع رابط خط فرمان (CLI) برای IOS XR
| دستور پیکربندی (Configuration command) | عملکرد |
|---|---|
ssh server v2 |
فعالسازی نسخه 2 پروتکل SSH (مورد نیاز برای Credentialz) |
username |
ایجاد یک حساب کاربری برای دسترسی SSH |
crypto key generate ed25519 |
تولید کلیدهای میزبان Ed25519 (جایگزینی برای Credentialz)GenerateKeysRequest) |
crypto key generate rsa |
تولید کلیدهای میزبان RSA |
crypto key generate ecdsa nistp256 |
تولید کلیدهای میزبان ECDSA P-256 |
| دستور نمایش / اجرا (Show / exec command) | آنچه نمایش میدهد |
|---|---|
show ssh |
نشستهای (Sessions) فعال SSH |
show ssh server |
پیکربندی و وضعیت سرور SSH |
show crypto key mypubkey ed25519 |
کلید عمومی میزبان (Host Public Key) از نوع Ed25519 |
show crypto key mypubkey rsa |
کلید عمومی میزبان (Host Public Key) از نوع RSA |
show crypto key mypubkey ecdsa |
کلید عمومی میزبان (Host Public Key) از نوع ECDSA |
show gnsi state |
وضعیت زیرسیستم gNSI (وضعیت Credentialz و RDSFS) |
show tech-support gnsi |
بسته کامل عیبیابی (Diagnostic bundle) برای gNSI (شامل تمامی سرویسها) |
RotateAccountCredentials — قابلیتهای چرخش (Rotate) آن
| پیام | عملکرد |
|---|---|
| درخواست رمز عبور (PasswordRequest) | تغییر رمز عبور برای یک حساب کاربری (به صورت متن ساده یا هش شده). نسخه و زمان ایجاد (timestamp) گنجانده شده است.زمان ایجادزمان (timestamp) گنجانده شده است. |
| درخواست کلیدهای مجاز (AuthorizedKeysRequest) | جایگزینی لیست کلیدهای مجاز برای SSH بدون رمز عبور. انواع کلیدهای پشتیبانی شده: RSA 2048/4096, ECDSA P-256/P-521, Ed25519.درخواست کاربران مجاز (AuthorizedUsersRequest) |
| تنظیم اصول مجاز (Authorized Principals) برای احراز هویت SSH مبتنی بر گواهی. از معناشناسی فایل کاربران مجاز (AuthorizedPrincipalsFile) استفاده میکند (جفتهایی از نام حسابها و نامهای اصلی). | درخواست نهاییسازی (FinalizeRequest)تأیید نهایی چرخش (Rotation). اعتبارنامههای قدیمی باطل میشوند.معناشناسی (جفتهایی از نامهای کاربری و نامهای اصلی). |
| FinalizeRequest | نهاییسازی چرخش (Rotation). اعتبارنامههای قدیمی نامعتبر میشوند. |
جریان کار به این صورت است: ارسال یک یا چند بهروزرسانی اعتبارنامه (Credential) → اعتبارسنجی خارجی (تلاش برای برقراری SSH با اطلاعات جدید) → نهاییسازی یا لغو.
RotateHostParameters — آنچه میتواند تغییر دهد (Rotate)
| پیام | عملکرد |
|---|---|
| CaPublicKeyRequest | جایگزینی کلید عمومی CA (CA Public Key) مورد استفاده برای تأیید گواهیهای SSH کلاینت. |
| ServerKeysRequest(خارجی) | بارگذاری کلیدهای میزبان (Host Keys) و/یا گواهیهای میزبان (Host Certificates) تولید شده به صورت خارجی. کلید خصوصی و گواهی به صورت base64 کدگذاری شدهاند. |
| GenerateKeysRequest | درخواست از دستگاه برای تولید کلیدهای میزبان (Host Keys) جدید. کلید عمومی برای امضای گواهی در پاسخ بازگردانده میشود. |
| AllowedAuthenticationRequest | محدود کردن روشهای احراز هویت SSH (SSH Authentication) که به صورت سراسری مجاز هستند (رمز عبور، کلید عمومی، تعاملی با صفحهکلید، گواهی). پیشفرض: همه روشها. |
| AuthorizedPrincipalCheckRequest | تنظیم (Set)AuthorizedPrincipalsCommand — TOOL_HIBA_DEFAULTانتخاب باینری HIBA برای احراز هویت پویای اصلی (Dynamic Principal Authorization). |
| FinalizeRequest | تأیید نهایی (Commit). اگر اعتبارسنجی پیش از نهاییسازی با شکست مواجه شود، جریان را لغو کنید تا به پارامترهای میزبان قبلی بازگردید. |
بررسی عملی: اعتبارسنجی (Credentialz) سرتاسری (End-to-End)
پیشنیازها
- روتر IOS XR با قابلیتهای gRPC و SSH v2 فعال (نسخه 24.2.1 یا بالاتر برای Credentialz)
- grpcurl و
ssh-keygenنصب شده - پروتکلهای OpenConfig gNSI کلون شده:
git clone https://github.com/openconfig/gnsi.git - یک حساب کاربری پیکربندی شده روی روتر
محیط (ایستگاه کاری)
# Stage the proto so grpcurl's -import-path / -proto resolves cleanly
git clone https://github.com/openconfig/gnsi.git /tmp/gnsi
mkdir -p./credz-import/credentialz
cp /tmp/gnsi/credentialz/credentialz.proto./credz-import/credentialz/
export GNSI_IMPORT="${GNSI_IMPORT:-$PWD/credz-import}"
export XR="${XR:?set to <router-ip>:57400 — required}"
export XR_USER="${XR_USER:-cisco}"
export XR_PASS="${XR_PASS:?set XR_PASS — required (Credentialz needs valid AAA on every call)}"
GRPC_MD=(-H "username:${XR_USER}" -H "password:${XR_PASS}")
PROTO_CREDZ="credentialz/credentialz.proto"
credentialz.protoفاقددستوراتimport است، بنابراین-import-pathتنها به یکcredentialz/credentialz.protoفایل در زیرمجموعه خود نیاز دارد. نیازی به کلون کردنopenconfig/gnmi.
فقط برای محیط آزمایشگاهی (Lab only)تمامی مثالهای زیر از
-plaintext(بدون TLS) استفاده میکنند. در محیط عملیاتی (Production)، جایگزین کنید-plaintextبا پرچمهای-cacert,-certو-key. برای راهاندازی TLS، مقاله Certz article را مشاهده کنید.
راهاندازی روتر (IOS XR CLI)
اطمینان حاصل کنید که SSH v2 و یک حساب کاربری (User Account) وجود داشته باشد:
configure
ssh server v2
username lab
group root-lr
group cisco-support
commit
end
فهرست سرویسها (Reflection)
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
"${XR}" \
list gnsi.credentialz.v1.Credentialz
لطفاً متن ورودی خود را برای ترجمه ارسال کنید تا طبق قوانین و دستورالعملهای تعیینشده، ترجمه آن را انجام دهم.
gnsi.credentialz.v1.Credentialz.CanGenerateKey
gnsi.credentialz.v1.Credentialz.GetPublicKeys
gnsi.credentialz.v1.Credentialz.RotateAccountCredentials
gnsi.credentialz.v1.Credentialz.RotateHostParameters
امکان تولید کلید (preflight)
بررسی کنید که آیا دستگاه میتواند برای هر الگوریتم، جفتکلید (Key Pairs) تولید کند یا خیر:
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{"keyParams": "KEY_GEN_SSH_KEY_TYPE_EDDSA_ED25519"}' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.CanGenerateKey
پاسخ روتر (Router response)
{
"canGenerate": true
}
برای سایر الگوریتمها تکرار کنید — همه بازمیگردانندcanGenerate: trueروی Cisco 8000:
# RSA 4096
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{"keyParams": "KEY_GEN_SSH_KEY_TYPE_RSA_4096"}' \
"${XR}" gnsi.credentialz.v1.Credentialz.CanGenerateKey
# RSA 2048
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{"keyParams": "KEY_GEN_SSH_KEY_TYPE_RSA_2048"}' \
"${XR}" gnsi.credentialz.v1.Credentialz.CanGenerateKey
# ECDSA P-256
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{"keyParams": "KEY_GEN_SSH_KEY_TYPE_ECDSA_P_256"}' \
"${XR}" gnsi.credentialz.v1.Credentialz.CanGenerateKey
# ECDSA P-521
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{"keyParams": "KEY_GEN_SSH_KEY_TYPE_ECDSA_P_521"}' \
"${XR}" gnsi.credentialz.v1.Credentialz.CanGenerateKey
دریافت کلیدهای عمومی (GetPublicKeys)
دریافت کلیدهای عمومی میزبان (Host Public Keys) فعلی:
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{}' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.GetPublicKeys
پاسخ (کوتاه شده — یک ورودی برای هر نوع کلید،همانطور که در یک NCS-540 پیشفرض نسخه 25.3.1 مشاهده شد):
{
"publicKeys": [
{ "publicKey": "c3NoLXJzYSBBQUFBQjNOemFD...", "keyType": "KEY_TYPE_RSA_2048" },
{ "publicKey": "c3NoLWRzcyBBQUFBQjNOemFD..." },
{ "publicKey": "ZWNkc2Etc2hhMi1uaXN0cDUy...", "keyType": "KEY_TYPE_ECDSA_P_521" },
{ "publicKey": "ZWNkc2Etc2hhMi1uaXN0cDM4..." },
{ "publicKey": "ZWNkc2Etc2hhMi1uaXN0cDI1...", "keyType": "KEY_TYPE_ECDSA_P_256" },
{ "publicKey": "c3NoLWVkMjU1MTkgQUFBQUMz...", "keyType": "KEY_TYPE_ED25519" }
]
}
هرکلید عمومی (publicKey)در قالب OpenSSH با کدگذاری base64 است. برای مشاهده کلید عمومی SSH خام، از دستورecho "استفاده کنید.
در نسخه 25.3.1:پاسخ پیشفرض شامل یکDSA (
ssh-dss) و یکECDSA P-384کلید میزبان (Host Key) در کنار چهار مورد معمول است. هر دو باkeyTypeحذف شدهبازمیگردند — DSA توسط OpenConfig Credentialz مدلسازی نشده است و P-384 در پروتو (proto) تعریف شده اما توسط دستگاه مقداردهی نمیشود. اگر خطمشی امنیتی (Security Baseline) شما اجازه نمیدهدssh-dss، آن را از طریق یکRotateHostParameters: generateKeysفراخوانی حذف کنید (ببینید GenerateKeys مخرب است).
RotateAccountCredentials: چرخش کلیدهای مجاز (Authorized Keys)
یک جفت کلید SSH آزمایشی ایجاد کنید و کلید عمومی (Public Key) را به عنوان یک کلید مجاز (Authorized Key) برای یکغیر مدیر (non-admin)حساب کاربری (با استفاده از همانciscoکاربری که با آن احراز هویت gRPC را انجام میدهید، خطر قفل شدن خودتان از تمامی جریانهای بعدی وجود دارد). فیلدauthorizedKeyباید به صورت base64 کدگذاری شده باشد:
ssh-keygen -t ed25519 -f /tmp/credz-test-key -N "" -C "credz-test@lab"
PUBKEY_B64=$(base64 < /tmp/credz-test-key.pub | tr -d '\n')
CREATED_ON=$(date +%s)
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateAccountCredentials <<EOF
{"credential":{"credentials":[{"account":"mike","authorizedKeys":[{"authorizedKey":"${PUBKEY_B64}","keyType":"KEY_TYPE_ED25519"}],"version":"keys-mike-v1","createdOn":"${CREATED_ON}"}]}}
{"finalize":{}}
EOF
پاسخ روتر (Router response)
{
"credential": {}
}
{}
پاسخ اول، بهروزرسانی اعتبارنامه (Credential) را تأیید میکند؛ پاسخ دوم، نهاییسازی را تأیید مینماید. کلیدهای مجاز (Authorized Keys) قدیمی برای این حساب کاربری جایگزین میشوند.
مرحله اعتبارسنجی (Validation):در یک گردش کار عملیاتی (Production)، بین مرحله بهروزرسانی اعتبارنامه و نهاییسازی، یک ترمینال دوم باز کنید تا SSH را با کلید جدید تست کنید. اگر اعتبارسنجی با شکست مواجه شد، برای بازگشت به حالت قبل (Rollback)، جریان را با فشردن (Ctrl+C) لغو کنید.
تأیید اعتبار حساب کاربری در IOS XR
پس از اجرای دستور RotateAccountCredentials، تأیید کنید که کلیدهای مجاز (Authorized Keys) اعمال شدهاند:
show ssh server
show gnsi state
یا از طریق gRPC تأیید کنید باGetPublicKeys(مشاهده کنید Verify on IOS XR برای بلوک تأیید کامل).
RotateAccountCredentials: چرخش رمز عبور (Password)
تغییر رمز عبور برای یک حساب کاربری.از یک کاربر غیرمدیر (non-admin) استفاده کنید(به عنوان مثالmike، نه حساب gRPC rotate-authoritycisco) تا یک رمز عبور اشتباه باعث قفل شدن شما از صفحه مدیریت (management plane) نشود:
CREATED_ON=$(date +%s)
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateAccountCredentials <<EOF
{"password":{"accounts":[{"account":"mike","password":{"plaintext":"NewSecurePass123"},"version":"pwd-mike-v1","createdOn":"${CREATED_ON}"}]}}
{"finalize":{}}
EOF
پاسخ روتر در IOS XR 25.3.1 (NCS-540):
{ "password": {} }
{}
رمز عبور جدید بلافاصله برای gRPC AAA قابل استفاده است:
grpcurl -plaintext -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
-H "username:mike" -H "password:NewSecurePass123" \
-d '{}' "${XR}" gnsi.credentialz.v1.Credentialz.GetPublicKeys
# returns publicKeys[…]
grpcurl -plaintext -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
-H "username:mike" -H "password:OLD-PASSWORD" \
-d '{}' "${XR}" gnsi.credentialz.v1.Credentialz.GetPublicKeys
# ERROR: Code: Unauthenticated, Message: authentication failed
RotateHostParameters: تولید کلیدهای میزبان (Host Keys) جدید
دستور GenerateKeys مخرب است.یک الگوریتم تکی
generateKeysفراخوانی باعث پاک شدنتمام کلیدهای میزبان (Host Key) الگوریتمهای دیگر میشود، از جمله مواردی که پروتکل قادر به بازتولید آنها نیست (مانند DSA و ECDSA-P-384). همیشهتمام الگوریتمهایی که میخواهید حفظ کنید رادر یکلیست keyParamsارسال کنید.لطفاً متن یا لیست مورد نظر خود را برای ترجمه ارسال کنید تا طبق دستورالعملهای دقیق شما، فرآیند ترجمه را آغاز کنم.
خط پایه پیشنهادی برای تماس — بازتولید چهار الگوریتمی که IOS XR 25.3.1 در واقع از طریق Credentialz پشتیبانی میکند، در یک تراکنش:
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateHostParameters <<'EOF'
{"generateKeys":{"keyParams":[
"KEY_GEN_SSH_KEY_TYPE_RSA_2048",
"KEY_GEN_SSH_KEY_TYPE_ECDSA_P_256",
"KEY_GEN_SSH_KEY_TYPE_ECDSA_P_521",
"KEY_GEN_SSH_KEY_TYPE_EDDSA_ED25519"]}}
{"finalize":{}}
EOF
پاسخ روتر (Router response)
{
"generateKeys": {
"publicKeys": [
{ "publicKey": "c3NoLXJzYS...", "keyType": "KEY_TYPE_RSA_2048" },
{ "publicKey": "ZWNkc2Etc2hhMi1uaXN0cDI1...","keyType": "KEY_TYPE_ECDSA_P_256" },
{ "publicKey": "ZWNkc2Etc2hhMi1uaXN0cDUy...","keyType": "KEY_TYPE_ECDSA_P_521" },
{ "publicKey": "c3NoLWVkMjU1MTkg...", "keyType": "KEY_TYPE_ED25519" }
]
}
}
{}
هر ورودی درpublicKeysشامل کلید عمومی (Public Key) تازه تولید شده (با کدگذاری base64) است. در یک گردش کار عملیاتی (Production)، این کلیدها را استخراج کرده، آنها را با CA خود امضا کنید و سپس قبل از نهاییسازی، یکServerKeysRequestبه همراه گواهی میزبان (Host Certificate) ارسال نمایید.
فراخوانیهای تکالگوریتمی فقط برای محیطهای جدید (Greenfield). A
generateKeysفراخوانی با یک الگوریتم، تمام کلیدهای میزبان (Host Key) دیگر را پاک میکند — و DSA / ECDSA-P-384غیرقابل بازیابی هستنداز طریق Credentialz زیرا قابلیتCanGenerateKeyهر دو را رد میکند. از فرمت چند-الگوریتمی (Multi-algo) بالا استفاده کنید، مگر اینکه واقعاً قصد داشته باشید مخزن کلید میزبان را پاکسازی کنید.
RotateHostParameters: بارگذاری کلید میزبان (Host Key) خارجی
تعهد جزئی مخرب در نسخه 25.3.1.سرور
serverKeysنهاییسازی (finalize) بازمیگرداندکد: ناشناخته / "نوشتن متادیتا در فایل ناموفق بود... چنین فایل یا دایرکتوری وجود ندارد, اما ذخیرهساز کلید میزبان (host-key store) همچنان تغییر میکند— تمام کلیدهای میزبان موجود پاک شده و کلید خصوصی بارگذاری شده به تنها کلید فعال تبدیل میشود. یک فراخوانیgenerateKeysآماده داشته باشید قبل از اینکه این را اجرا کنید (ببینید GenerateKeys مخرب است).
یک کلید میزبان SSH (SSH Host Key) تولید شده در خارج را بارگذاری کنید. فیلدprivateKeyبه صورت base64 کدگذاری شده است:
ssh-keygen -t ed25519 -f /tmp/credz-ext-hostkey -N "" -C "ext-host@lab"
PRIVKEY_B64=$(base64 < /tmp/credz-ext-hostkey | tr -d '\n')
CREATED_ON=$(date +%s)
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateHostParameters <<EOF
{"serverKeys":{"authArtifacts":[{"privateKey":"${PRIVKEY_B64}"}],"version":"hostkey-ext-v1","createdOn":"${CREATED_ON}"}}
{"finalize":{}}
EOF
پاسخ مستند (مشخصات فنی) در یک پیادهسازی سالم:
{ "serverKeys": {} }
{}
پاسخ مشاهدهشده در NCS-540 نسخه 25.3.1:
{ "serverKeys": {} }
ERROR:
Code: Unknown
Message: Write Metadata to file failed: 'SSH' detected the 'fatal' condition 'Failed to open file': No such file or directory
پس از این خطا، دستگاهبه صورت خودکار و بدون اطلاع، کلید Ed25519 بارگذاری شده رابه عنوان تنها کلید میزبان (Host Key) حفظ میکند. با استفاده از دستورGetPublicKeysتأیید کرده و کلید بازگردانده شده را رمزگشایی کنید:
grpcurl ... -d '{}' "${XR}" gnsi.credentialz.v1.Credentialz.GetPublicKeys \
| jq -r '.publicKeys[]|select(.keyType=="KEY_TYPE_ED25519").publicKey' \
| base64 -d | ssh-keygen -lf /dev/stdin
# fingerprint matches /tmp/credz-ext-hostkey.pub
# Recover the missing algorithms in one call:
grpcurl ... -d @ "${XR}" gnsi.credentialz.v1.Credentialz.RotateHostParameters <<'EOF'
{"generateKeys":{"keyParams":[
"KEY_GEN_SSH_KEY_TYPE_RSA_2048",
"KEY_GEN_SSH_KEY_TYPE_ECDSA_P_256",
"KEY_GEN_SSH_KEY_TYPE_ECDSA_P_521",
"KEY_GEN_SSH_KEY_TYPE_EDDSA_ED25519"]}}
{"finalize":{}}
EOF
پارامترهای میزبان چرخشی (RotateHostParameters): بارگذاری کلید عمومی CA
بارگذاری یک کلید عمومی CA برای تأیید گواهیهای SSH کلاینت:
ssh-keygen -t ed25519 -f /tmp/credz-test-ca -N "" -C "test-ca"
CA_B64=$(base64 < /tmp/credz-test-ca.pub | tr -d '\n')
CREATED_ON=$(date +%s)
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateHostParameters <<EOF
{"sshCaPublicKey":{"sshCaPublicKeys":[{"publicKey":"${CA_B64}","keyType":"KEY_TYPE_ED25519"}],"version":"ca-v1","createdOn":"${CREATED_ON}"}}
{"finalize":{}}
EOF
پاسخ روتر (Router response)
{
"sshCaPublicKey": {}
}
{}
RotateHostParameters: محدود کردن روشهای احراز هویت (Authentication)
Restrict which SSH Authentication methods are globally allowed. Available types:نوع احراز هویت رمز عبور (AUTHENTICATION_TYPE_PASSWORD), نوع احراز هویت کلید عمومی (AUTHENTICATION_TYPE_PUBKEY), نوع احراز هویت تعاملی صفحهکلید (AUTHENTICATION_TYPE_KBDINTERACTIVE).
اجازه دادن به هر سه روش (پیشفرض ایمن):
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateHostParameters <<'EOF'
{"authenticationAllowed":{"authenticationTypes":["AUTHENTICATION_TYPE_PASSWORD","AUTHENTICATION_TYPE_PUBKEY","AUTHENTICATION_TYPE_KBDINTERACTIVE"]}}
{"finalize":{}}
EOF
پاسخ روتر (Router response)
{
"authenticationAllowed": {}
}
{}
هشدار:برای محدود کردن به احراز هویت فقط با کلید عمومی (pubkey-only)، مقدار
AUTHENTICATION_TYPE_PUBKEY.را ارسال کنید. این کار احراز هویت با رمز عبور و تعاملی صفحهکلید (keyboard-interactive) را غیرفعال میکند؛ پیش از نهاییسازی، دسترسی SSH را بررسی کنید تا از قفل شدن سیستم جلوگیری شود.
پارامترهای میزبان چرخشی (RotateHostParameters): تنظیم دستور اصول مجاز (AuthorizedPrincipalsCommand) (HIBA)
فعالسازی مجوزدهی (Authorization) اصلی پویا با استفاده از باینری HIBA:
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '@' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.RotateHostParameters <<'EOF'
{"authorizedPrincipalCheck":{"tool":"TOOL_HIBA_DEFAULT"}}
{"finalize":{}}
EOF
پاسخ روتر (Router response)
{
"authorizedPrincipalCheck": {}
}
{}
برای پاک کردن HIBA و بازگشت به مجوزدهی (Authorization) ایستا، از دستور زیر استفاده کنیدtool":"TOOL_UNSPECIFIED.
تأیید در IOS XR
پس از هر چرخش (Rotation)، با استفاده از CLI بررسی کنید:
show ssh
show ssh server
show crypto key mypubkey ed25519
show gnsi state
تأیید از طریق gRPC — اطمینان حاصل کنید که کلیدهای میزبان (Host Keys) منعکسکننده آخرین چرخش (Rotation) هستند:
grpcurl -plaintext \
-import-path "$GNSI_IMPORT" \
-proto "$PROTO_CREDZ" \
"${GRPC_MD[@]}" \
-d '{}' \
"${XR}" \
gnsi.credentialz.v1.Credentialz.GetPublicKeys
پاسخ پس از بارگذاری کلید خارجی:
{
"publicKeys": [
{
"publicKey": "c3NoLWVkMjU1MTkgQUFBQUMzTnph...",
"keyType": "KEY_TYPE_ED25519"
}
]
}
رمزگشاییکلید عمومی (publicKey)برای تأیید مطابقت آن با فایل بارگذاری شده:
echo "c3NoLWVkMjU1MTkgQUFBQUMzTnph..." | base64 -d
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... ext-host@lab
ابزارهای عیبیابی (Debugging) با grpcurl
استفاده ازتوصیف کردنو-msg-templateبرای بررسی ساختار پیام:
grpcurl -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
describe gnsi.credentialz.v1.Credentialz.RotateAccountCredentials
grpcurl -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
-msg-template describe gnsi.credentialz.v1.RotateAccountCredentialsRequest
grpcurl -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
-msg-template describe gnsi.credentialz.v1.RotateHostParametersRequest
grpcurl -import-path "$GNSI_IMPORT" -proto "$PROTO_CREDZ" \
-msg-template describe gnsi.credentialz.v1.CanGenerateKeyRequest
مسیر نگاشت (Mapping Path) پروتکل SPIFFE
گردش کار احراز هویت (Authentication) و تعیین سطح دسترسی (Authorization) مبتنی بر شناسه SPIFFE از یک فایل نگاشت (Mapping file) در مسیر زیر استفاده میکند:
/misc/config/grpc/gnsi/credentialz/spiffe-user-map.json
اگر فایل موجود نباشد یا نامعتبر باشد، نگاشت (Mapping) خالی خواهد بود. هنگامی که موجود باشد، شناسه های SPIFFE برای احراز هویت gRPC به نام کاربری تبدیل می شوند. بخش احراز هویت مبتنی بر شناسه SPIFFE را در راهنمای Cisco مشاهده کنید.
پایش (Monitoring) با استفاده از YANG Telemetry
مدل YANG مدل OpenConfigopenconfig-gnsi-credentialzبه منظور نمایش متادیتای اعتبارنامه (Credential) و شمارندههای دسترسی (Access Counters) طراحی شده است.
در نسخه 25.3.1:
قابلیتهای gnmicتبلیغ میکندopenconfig-gnsi-credentialz, 0.6.0، امادرخواست gnmi GetبازمیگرداندNotFoundبرای هر برگ (leaf) مستند شده Credentialz (active-host-key-version,…/counters/access-{accepts,rejects}، برای هر کاربرpassword-version، و غیره). تنها سیگنال Credentialz که در حال حاضر در دسترس است، نمای شمارنده (counter) به ازای هر RPC در زیرopenconfig-gnsi-authz:authz-policy-counters(ردیفهایی برایgnsi.credentialz.v1.Credentialz/{CanGenerateKey,GetPublicKeys,RotateAccountCredentials,RotateHostParameters}) است. برگهای زیر برای ارجاع مستند شدهاند — در این نسخه آنها را به عنوان قابلیتهای آتی در نظر بگیرید.
متادیتای اعتبارنامه سرور SSH(پایه:/system/ssh-server/state):
| مسیر YANG | توضیحات |
|---|---|
/system/ssh-server/state/active-trusted-user-ca-keys-version |
نسخه کلیدهای CA مورد اعتماد برای اعتبارسنجی گواهی کلاینت |
/system/ssh-server/state/active-trusted-user-ca-keys-created-on |
زمان نصب کلیدهای CA |
/system/ssh-server/state/active-host-certificate-version |
نسخه گواهی میزبان (Host Certificate) |
/system/ssh-server/state/active-host-certificate-created-on |
زمان نصب گواهی میزبان |
/system/ssh-server/state/active-host-key-version |
نسخه کلید عمومی میزبان (Host Public Key) |
/system/ssh-server/state/active-host-key-created-on |
زمان نصب کلید میزبان |
شمارندههای دسترسی سرور SSH(پایه:/system/ssh-server/state/counters):
| مسیر YANG | توضیحات |
|---|---|
/system/ssh-server/state/counters/access-accepts |
مجموع اتصالات موفق SSH |
/system/ssh-server/state/counters/access-rejects |
مجموع اتصالات رد شده SSH |
/system/ssh-server/state/counters/last-access-accept |
مهر زمانی (Timestamp) آخرین اتصال موفق SSH |
/system/ssh-server/state/counters/last-access-reject |
مهر زمانی (Timestamp) آخرین رد اتصال SSH |
Per-user Credential metadataلطفاً متن ورودی خود را در ادامه قرار دهید تا طبق قوانین و دستورالعملهای ذکر شده، ترجمه آن را انجام دهم./system/aaa/authentication/users/user[username=):
| مسیر YANG (نسبت به پایه) | آنچه بیان میکند |
|---|---|
.../authorized-keys-list-version |
نسخه کلیدهای مجاز (Authorized Keys) برای این کاربر |
.../authorized-keys-list-created-on |
زمان نصب کلیدهای مجاز |
.../authorized-principals-list-version |
نسخه اصول مجاز (Authorized Principals) برای این کاربر |
.../authorized-principals-list-created-on |
زمان نصب اصول مجاز |
.../password-version |
نسخه رمز عبور (Password) برای این کاربر |
.../password-created-on |
زمان تنظیم رمز عبور |
اشتراک درaccess-rejectsوlast-access-rejectبرای شناسایی خطاهای احراز هویت SSH پس از چرخش اعتبارنامه (Credential Rotation). افزایش ناگهانی در موارد رد شده (rejects) پس از RotateHostParameters معمولاً به این معنی است که کلید میزبان (Host Key) یا کلید مرجع گواهی (CA Key) جدید مطابقت ندارد — با استفاده ازGetPublicKeys.
عبارتهای*-versionو*-created-onدر برگهها (leaves) دقیقاً همان رشتههای ارسال شده در طول Rotate RPCs را منعکس میکنند، بنابراین خطلولههای تلهمتری (Telemetry pipelines) میتوانند الگوهای دسترسی SSH را با استقرار اعتبارنامههای (Credential deployments) خاص مرتبط سازند.
Note:When Credentialz is enabled, the standard YANG leaves for SSH keys and passwords under
/system/aaa/authentication/users/user/config/به عنوان نامعتبر تلقی میشوند. Credentialz مالک آن اعتبارنامهها (Credentials) است.
بررسی سریع تلهمتری (Telemetry) با استفاده از gnmic
تأیید کنید که دستگاه در واقع چه چیزی را تبلیغ (Advertise) میکند و برای مسیرهای مستند شده چه پاسخی بازمیگرداند:
# 1) What model + revision does the device claim to support?
gnmic -a "${XR}" --insecure -u "${XR_USER}" -p "${XR_PASS}" capabilities \
| grep -i credentialz
# openconfig-gnsi-credentialz, 0.6.0 (gnmi)
# cisco-xr-openconfig-gnsi-credentialz-deviations, 2024-08-29
# 2) Try the documented leaves — these will all be NotFound on 25.3.1:
gnmic -a "${XR}" --insecure -u "${XR_USER}" -p "${XR_PASS}" get \
--path "/system/ssh-server/state/active-host-key-version" \
--path "/system/ssh-server/state/counters/access-rejects" || true
# 3) Working fallback — gRPC-server RPC counters via openconfig-gnsi-authz:
gnmic -a "${XR}" --insecure -u "${XR_USER}" -p "${XR_PASS}" get \
--path "/system/grpc-servers/grpc-server/network-instance/state/authz-policy-counters/rpcs/rpc[name=/gnsi.credentialz.v1.Credentialz/RotateHostParameters]/state"
تماس سوم، سیگنال عملی برای پرسش «آیا امروز کسی به Credentialz دسترسی داشته است؟» محسوب میشود؛ دو تماس اول تا زمان پیادهسازی YANG، صرفاً جاینگهدار (Placeholder) هستند.
نکاتی که باید به آنها توجه کرد
- هر بار فقط یک RPC.فراخوانیهای همپوشان RotateAccountCredentials یا RotateHostParameters رد میشوند. عملیات را در هر دو RPC به صورت متوالی (Serialize) انجام دهید.
- قبل از نهاییسازی (Finalize)، اعتبارسنجی کنید.همیشه قبل از ارسال FinalizeRequest، اتصال SSH (یا gRPC برای تغییر رمز عبور) را با اعتبارنامههای (Credentials) جدید در یک ترمینال دوم تست کنید. اگر اعتبارسنجی با شکست مواجه شد، استریم را برای بازگشت به حالت قبل (Rollback) لغو کنید.
- کلیدهای مجاز (Authorized Keys) جایگزین میشوند، نه ادغام.درخواست AuthorizedKeysRequest کل لیست کلیدهای مجاز برای حساب کاربری را جایگزین میکند. تمام کلیدهایی که باید معتبر باقی بمانند را لحاظ کنید. ارسال یک لیست خالی، روش مستند برای «حذف» است.
- محدود کردن روشهای احراز هویت (Authentication methods)میتواند باعث قفل شدن کاربرانی شود که به روش غیرفعالشده متکی هستند. همیشه حداقل یک روش فعال را حفظ کنید.
- پشتیبانی از HIBA.تنظیم
TOOL_HIBA_DEFAULTدر AuthorizedPrincipalCheckRequest، احراز هویت (Authorization) پویای اصلی را از طریق باینری HIBA فعال میکند. پاک کردن آن (TOOL_UNSPECIFIED) به احراز هویت ایستا بازمیگردد. PasswordRequestدر نسخه 25.3.1 کار میکند.ایمیجهای قبلی مقدارUnimplementedرا برمیگرداندند؛ بیلد زندهای که تست کردیم، رمز عبور را مجدداً متصل میکند و رمز عبور جدید بلافاصله برای gRPC AAA قابل استفاده است. همیشه عملیات تغییر رمز را با یک کاربر غیر-ادمین (مثلاًmike) انجام دهید، نه با کاربری که در حال حاضر به عنوان gRPC rotate-authority با آن احراز هویت شدهاید.GenerateKeysدر تمام الگوریتمها مخرب است.حتی یکkeyParamsتک-الگوریتمی، کلیدهای RSA، ECDSA-P-256/P-384/P-521، DSA و Ed25519 را پاک میکند. DSA و ECDSA-P-384 از طریق gRPCغیرقابل بازگشتهستند (دستورCanGenerateKeyدستگاه هر دو را رد میکند). همیشه تمام الگوریتمهایی که میخواهید حفظ کنید را در همانkeyParamsلیست ارسال کنید. ببینید.GenerateKeys مخرب استServerKeysRequestباگ نهاییسازی (25.3.1).نهاییسازی مقدارCode: Unknownرا با یک پیام داخلیFailed to open fileبرمیگرداند،اما فروشگاه کلید میزبان (host-key store) همچنان تغییر میکند— کلید خصوصی آپلود شده جایگزین تمام کلیدهای میزبان موجود میشود. یک فراخوانی بازیابیgenerateKeysCanGenerateKeyچند-الگوریتمی آماده داشته باشید.دو مقداری که در proto enum هستند را رد میکند.KEY_GEN_SSH_KEY_TYPE_RSA_3072وKEY_GEN_SSH_KEY_TYPE_ECDSA_P_384مقدارInvalidArgument: “Can Generate Key:Invaid KeyGen input- را برمیگردانند (غلط املایی روی دستگاه). از RSA-2048/4096، ECDSA-P-256/P-521 و Ed25519 استفاده کنید.
موجودی پیشفرض کلید میزبان شامل DSA و ECDSA-P-384 است.GetPublicKeysروی یک NCS-540 پیشفرض، 6 کلید را لیست میکند که دو مورد از آنها (,ssh-dssECDSA-P-384) با فیلدkeyType— کلید خصوصی آپلود شده جایگزین تمام کلیدهای میزبان موجود میشود. یک فراخوانی بازیابیحذفشده برمیگردند. DSA بهویژه توسط OpenSSH منسوخ شده است؛ آن را از طریق یک فراخوانی تمیز چند-الگوریتمی حذف کنید. - لغو در میانه استریم کار میکند اما نام زیرسیستم را نشت میدهد.بستن استریم دوطرفه (bidi stream) قبل از ارسال
finalizeنامزد را لغو میکند، اما دستگاه مقدارCode: Canceled, Message: "Credz stream failure: EOFرا برمیگرداند. این را به عنوان رفتار مورد انتظار در نظر بگیرید؛ یک فراخوانی بعدی با همان محموله (payload) +finalizeبهدرستی موفق میشود. - تلهمتری YANG تبلیغ شده اما پیادهسازی نشده است (25.3.1).تمام leafهای مستند Credentialz مقدار
NotFoundرا برمیگردانند. تا زمانی که پیادهسازی YANG ارائه شود، ازopenconfig-gnsi-authz:authz-policy-countersبرای مشاهده در سطح RPC استفاده کنید. خطاهای لایه اپلیکیشن (InvalidArgument,Unknown) باعث افزایشaccess-rejectsدر آن شمارندههانمیشوند.Certz در مقابل Credentialz. - Certzمدیریت gRPC TLS (گواهیها، بستههای اعتماد، CRLها برای سرور gRPC) را بر عهده دارد. Credentialz مدیریت SSH (کلیدهای میزبان، کلیدهای کاربر، رمزهای عبور برای دسترسی تعاملی) را انجام میدهد. اینها سطوح جداگانهای هستند. مدیریت gRPC TLS (گواهیها، بستههای اعتماد (Trust Bundles) و CRLها برای سرور gRPC). بخش Credentialz مدیریت SSH (کلیدهای میزبان، کلیدهای کاربر و رمزهای عبور برای دسترسی تعاملی) را بر عهده دارد. این دو، سطوح (Planes) مجزایی هستند.
نتیجهگیری
Credentialz closes the loop between programmatic gRPC Management and interactive SSH access. Keys, Passwords, and Host parameters rotate through a standard gRPC API with built-in Rollback — no file edits, no reloads, no vendor-specific CLIs. Together with گواهیها برای احراز هویت TLS، قابلیت Credentialz هر دو سطح احراز هویت (Authentication planes) را پوشش میدهد. افزودن مجوز (Authz) برای احراز هویت در سطح سرویس (Service-level Authorization)،مسیرها برای احراز هویت در سطح مسیر (Path-level Authorization)، و حسابها برای تکمیل چرخه حیات امنیتی (Security Lifecycle) gNSI در سیستمعامل IOS XR، بخش Accounting تکمیلکننده است.
- Credentialz چرخههای تغییر اعتبارنامهها (Credentials) را مدیریت میکنداعتبارنامههای SSH— رمزهای عبور (Passwords)، کلیدهای مجاز (Authorized Keys)، کلیدهای میزبان (Host Keys)، گواهینامهها (Certificates)، کلیدهای مرجع صدور گواهی (CA Keys) و محدودیتهای روش احراز هویت — بدون نیاز به بارگذاری مجدد (Reload).
- دو RPC جریانی (Streaming):RotateAccountCredentials(به ازای هر کاربر) وRotateHostParameters(به ازای هر میزبان). هر دو از همان مدل تراکنش مرحلهبندی-اعتبارسنجی-نهاییسازی (stage-validate-finalize) مشابه Certz استفاده میکنند.
- دو RPC تکمرحلهای (Unary):CanGenerateKey(پیشبررسی) وGetPublicKeys(بازرسی کلیدهای میزبان فعلی).
- فقطیکCredentialz RPC در هر لحظه مجاز است. فراخوانیهای همپوشان با شکست مواجه میشوند.
- کلیدهای مجاز (Authorized Keys) به طور کاملجایگزین میشوند — تمام کلیدهای معتبر را در درخواست بگنجانید.
- تغییر کلیدهای میزبان (Host-key rotates) مخرب است.هر دو دستور
generateKeys(تکالگوریتمی) وserverKeys(که در نسخه 25.3.1 در مرحله نهاییسازی با خطا مواجه میشود) سایر الگوریتمها را پاک میکنند. همیشه کلیدهای میزبان را با یک دستور چند-الگوریتمی (multi-algo) تغییر دهیدgenerateKeysکه شامل تمام الگوریتمهایی باشد که میخواهید حفظ کنید. PasswordRequestدر نسخه 25.3.1 NCS-540 کار میکندو رمز عبور جدید بلافاصله توسط gRPC AAA پذیرفته میشود — اما همیشه کاربران غیر-مدیر (non-admin) را تغییر دهید، نه مرجع تغییر gRPC (gRPC rotate-authority).openconfig-gnsi-credentialzتلهمتری YANG تبلیغ میشود اما در نسخه 25.3.1 پیادهسازی نشده است. در حال حاضر ازopenconfig-gnsi-authz:authz-policy-countersبرای مشاهدهپذیری (Visibility) در سطح RPC استفاده کنید.Certz- = gRPC TLS. Credentialz = SSH. سطوح متفاوت، الگوی تراکنش یکسان. gRPC TLS. Credentialz = SSH. صفحات (Planes) متفاوت، الگوی تراکنش (Transaction pattern) یکسان.
گام بعدی:با تکمیل احراز هویت (Authentication) (گواهینامهها + اعتبارنامهها)، به سراغ مجوزدهی (Authorization) با Authz برای کنترل سطح سرویس gRPC بروید.
بازگردانی / لغو (Undo)
| وضعیت | نحوه بازگشت به حالت قبل (Revert) |
|---|---|
| لغو عملیات چرخش (Rotate) در میانه جریان | بستن جریان grpcurl (Ctrl+C) پیش از ارسالنهاییسازی (finalize). کاندیدا (Candidate) حذف شده و اعتبارنامههای (Credentials) قبلی فعال باقی میمانند. دستگاه ممکن است بازگرداندکد: Canceled، پیام: "Credz stream failure: EOF— این امضای بازگشت (rollback) مورد انتظار در نسخه 25.3.1 است. |
| حذف کلیدهای مجاز (Authorized Keys) | ارسال یکRotateAccountCredentialsبا یک لیستauthorizedKeysخالی برای حساب کاربری. این کار باعث بازگشت به احراز هویت (Authentication) صرفاً با رمز عبور برای آن کاربر میشود. |
| بازیابی رمز عبور چرخیده شده | ارسال یکRotateAccountCredentialsدیگر باpassword.accounts[*].password.plaintextتنظیم شده روی مقدار اصلی. رمز عبور جدید در این زمان اعمال میشودنهاییسازی (finalize). |
| بازیابی تمام روشهای احراز هویت (Authentication) | ارسالRotateHostParametersبا هر سه نوع:AUTHENTICATION_TYPE_PASSWORD. |
| پاکسازی HIBA | ارسالRotateHostParametersدیگر باtool":"TOOL_UNSPECIFIEDبرای بازگشت به مجوزدهی (Authorization) اصلی ایستا. |
بازیابی از یکgenerateKeysمخرب یا یکserverKeys |
ناموفقRotateHostParametersاجرای مجددgenerateKeys: با یک الگوریتم چندگانهKEY_GEN_SSH_KEY_TYPE_RSA_2048نهاییسازی (finalize). به دنبال آنالگوریتمهای DSA و ECDSA-P-384 از طریق Credentialz قابل بازیابی نیستند— بازگشت به / crypto key generate dsacrypto key generate ecdsa nistp384 |
| از طریق رابط خط فرمان (CLI) در IOS XR اگر واقعاً به آنها نیاز دارید. | جایگزینی کلید میزبان (Host Key) معیوبRotateHostParametersدیگر باserverKeys. بارگذاری محتوای اصلاحشده از طریقآگاه باشیداز نسخه 25.3.1خطای نوشتن متادیتا (Metadata) در فایلباگ نهاییسازی (finalize) — تأیید باGetPublicKeysgenerateKeysو اجرای یک الگوریتم چندگانه |
مراجع
- Cisco IOS XR — راهنمای پیکربندی برنامهپذیری (Programmability): احراز هویت gRPC (بهروزرسانیهای gNSI Credentialz، فراخوانی Rotate Credentialz، چرخش اعتبارنامههای حساب کاربری، چرخش پارامترهای میزبان)
- OpenConfig —
credentialz.proto,credentialz/README.md - OpenConfig —
openconfig-gnsi-credentialzمدل YANG نسخه 0.7.0 - سری — نمای کلی gNSI در IOS XR