Lucas Torro had cancelled out the opener from Rodrygo to leave the two teams level in Seville, but the Real Madrid forward scored again in the 70th minute to secure the trophy for Carlo Ancelotti's side.
The success is Real Madrid's 20th in the competition and their first since 2014, and the reigning Spanish and European champions will now switch their attention to the Champions League, preparing to welcome Manchester City for the first leg of their semi-final on Tuesday.
Osasuna were bidding to win the Copa del Rey for the first time in just their second-ever appearance in the final but ultimately came up just short against a Real Madrid side that were the superior outfit on the night.
Real Madrid made the breakthrough in just the second minute of the contest, with Vinicius Junior dancing into the penalty box before feeding Rodrygo, who finished into the back of the net from close range.
Osasuna had a half-chance to level in the eighth minute when Ruben Pena broke into a dangerous area before setting up Ante Budimir, but the striker's header was kept out by Thibaut Courtois.
Jagoba Arrasate's side had another opportunity in the 15th minute when Jon Moncayola picked out Moi Gomez with a dangerous cross, but the midfielder's header was wide of the post.
Both sides then had big chances in the 25th minute, with Sergio Herrera doing brilliantly to deny Karim Benzema, before Dani Carvajal cleared a Abde Ezzalzouli shot off the line down the other end.
David Alaba - back in the side after recovering from a hamstring injury - then hit the crossbar with a rasping free kick in the 32nd minute, before Vinicius curled one just wide of the far post three minutes later, with Real Madrid threatening to double their advantage.
Osasuna found themselves level just past the hour, though, with Torro picking out the bottom corner with an excellent strike after a cross from Ezzalzouli had been cleared to him on the edge of the penalty box.
Real Madrid had a half-chance to regain the lead in the 62nd minute when Benzema found Federico Valverde in a dangerous area, but the midfielder's strike was wide of the far post.
Osasuna were struggling to get out during a period of domination from the capital outfit, though, and Ancelotti's side regained the lead in the 70th minute through Rodrygo, who finished past Herrera from close range after some untidy defending from Osasuna, with Toni Kroos's effort falling kindly for his teammate.
Alaba had a golden chance to make it 3-1 in the 77th minute when he met a cross from the excellent Rodrygo, but the centre-back headed wide of the post.
There was more good news for Los Blancos late on, as Luka Modric made his return from a hamstring injury, suggesting that he could be ready to start against Man City next week.
Vinicius should have secured the victory in the final exchanges when he broke through on goal, but the Brazil international looked for a pass into Benzema when he might have had a shot himself; Carvajal then made a smart clearance down the other end to prevent Chimy Avila from having a strike on goal, as Real Madrid secured the trophy for the 20th time in their history.